IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

[Stratégie] détection boucle infini


Sujet :

Java

  1. #1
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 4
    Points : 4
    Points
    4
    Par défaut [Stratégie] détection boucle infini
    Bonjour,

    dans le cadre d'un projet informatique je dois pouvoir détecter les boucles infines dans un programme java.

    Si quelqu un pourrais me renseigner sur une méthode de détéction ,
    ça me dépannerais beaucoup

    merci

  2. #2
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Points : 108
    Points
    108
    Par défaut
    Une boucle doit toujours avoir une condition de sortie.

    C'est de vérifier toutes les boucles une par une pour vérifie qu'elles possèdent toutes une condition de sortir SUR pour empecher une boucle sans fin.

    Tu pourrais aussi faire un bout de code du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (i > 300) 
    {
        (boite de dialogue) boucle infini?
        conditionSortie = true
    }
    i++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Pourrait tu preciser un peu? Avant compilation ou après? Qu'est ce que tu compte faire?
    Lors de l'utilisation d'une variable locale test un while(test) en boucle sans fin est assez facile à reconnaitre mais sinon... Je ne vois pas trop comment on pourrait faire la difference entre une boucle très grande, une boucle sans fin...
    Le mieu serait d'utiliser des algorithmes prouvables, si des commentaires sont bien ecrits (utilisant toujours une meme synthaxe) il doit etre possible de realiser un robot de verification... mais c'est compliqué...

  4. #4
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 4
    Points : 4
    Points
    4
    Par défaut précision
    pour mon projet je dois analyser un programme java pour voir si il comporte des boucles infinies( avant compilation). Je pense qu une analyse statique du code en étudiant le graphe de controle du programme serait le plus adapté mais je ne sais pas comment je peux le construire (je travaille en java).Alors il suffirait de faire la couverturte du graphe pour voir si celui-ci ce déroule de manière "normal".(me dire si je me trompe),

    merci d avance

  5. #5
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Tu peux jeter un oeil au projet PMD par exemple. C'est open source, en Java et cela fait ce que tu veux. Ca pourrait te donner des idees.
    Romain Guy
    Android - Mon livre - Mon blog

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2006
    Messages : 380
    Points : 314
    Points
    314
    Par défaut
    Oui je crois qu'il y a pas mal de gens qui se sont cassés la tête sur ce problème.
    La seule chose que j'imagine, analyser dans le programme s'il y a des conditions de sorties, et si ces conditions de sorties peuvent être atteintes quelles que soient les valeus d'entrée...

    Entre autres termes il s'agit d'un casse tête mathématique.

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    On ne peut pas utiliser les assertion pour ça? (Je suis pas sur de ce que je dit hein!)

  8. #8
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    On ne peut pas utiliser les assertion pour ça? (Je suis pas sur de ce que je dit hein!)
    C'est ce que j'aurais dit moi aussi.
    JUnit (et les tests unitaires en général) est fait expres pour tester ton code et vérifier si il est solide, tu devrais te pencher la-dessus, c'est assez facile à faire en plus
    Le principe est le suivant : tu écris des methodes en java chargées de tester ton code. Tu part du prncipe que l'execution de ce code doit avoir tel ou tel effet, tu l'execute et tu teste si il a bien eu l'effet attendu (assertion).
    Je sais ca a pas l'air clair expliqué comme ca, mais tu verra c'est vraiment pas sorcier.
    Bon courage, a+.

  9. #9
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    La théorie dit qu'il n'existe pas d'algorithme permettant de savoir si un programme se termine dans un temps fini ou non

  10. #10
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    Si tu te sent grand, beau et fort (), je te conseil de coder un parser qui verifiera les contraintes de ta boucle et grace a un puissant algorithme de retropropagation te sortira les ensemble possible pour chaque variable de tes contraintes, et finira par travailler sur ceux-ci afin de te dire si oui ou non ta boucle peu etre infini...
    Mais tu peu aussi le faire de tete dans certains cas... (Methode conseillée...)

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (a<10)
    {
     a++;
    }
    Logiquement, a tend vers +infini si ta boucle tend vers +infini, or +infini>10, donc ta boucle ne peu pas etre infini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (a<10)
    {
    a*=5;
    }
    A ce moment la, si dans l'entrée de la boucle a<=0 alors ta boucle sera infini. Donc il faut remonter au dessus de ta boucle voir quel valeur elle peu prendre et s'assurer qu'elle ne peu pas prendre une valeur <= 0

    Enfin apres, en pratique, je sais pas si en java l'overflow de variable leve une exception ou comme en c reinitialise la variable a son minimum (0x11111111 - 1 = 0x0111111 avec le dernier bit de signe )

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Citation Envoyé par herve91
    La théorie dit qu'il n'existe pas d'algorithme permettant de savoir si un programme se termine dans un temps fini ou non
    Un programme "brute" je suis bien d'accord, ou en tout cas je ne vois pas comment on pourait etre sur qu'il s'arrete.
    Par contre si on utilise des algorithmes prouvables,il doit y avoir moyen. Par contre je ne sais pas s'il existe de programmes permettant de verifier à 100% qu'un algorithme prouvable est juste...
    Justement dans le cas d'un programme brute, serait il possible d'extraire l'algorithme et de le prouver?
    (Je sais que je fais un peu dérivé le sujet, mais bon... )

  12. #12
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    http://fr.wikipedia.org/wiki/Coq_%28logiciel%29

    Cela sort de Java, mais d'apres ce que j'ai compris ça sert à ça...
    Mais bon, a moins que tu developpe des logiciels pour des fusée, satellite, avion ou tout autre systeme que ne doit absolument pas planter, je conseil la bonne vieille methode du "bon bah sa a l'air de marcher là"

  13. #13
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Est-ce que ce programme se termine (conjecture de Syracuse) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void syracuse(int n) {
       while (n != 1) {
          if ((n % 2) == 0) {
             n = n / 2;
          } else {
             n = 3 * n + 1;
          }
       }
       System.out.println("ouf je me termine !");
    }

  14. #14
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    1) La boucle continue tant que n!=1
    donc pour n=1l e programme se termine...

    2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if((n%2)==0) //-> nombre pair
    {
     n = n / 2  //-> nombre impair
    } else 
    { 
    /* Le programme peu s'arreter uniquement si n==1
        Or pour cela il faut soit:
        n = 3 * n + 1 Ce qui est impossible avec un entier naturel superieur à 1
        ET
        n = n / 2 est possible si n = 2 car (2%2)==0
    */ 
     n = 3 * n + 1
    }
    Donc si jme suis pas louper: le programme s'arrette pour tout nombre entre 0 et n (entier non signé) pour n = {1, 2}

    Edit: Je viens de voir sur wikipedia, zero pointée huhuhu

  15. #15
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    En fait je dirai qu'il suffit qu'à n'importe quel moment n soit un multiple de 2 (2^n) pour que la suite se termine.

  16. #16
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par anykeyh
    En fait je dirai qu'il suffit qu'à n'importe quel moment n soit un multiple de 2 (2^n) pour que la suite se termine.
    Malgré de fortes suspicions, on n'a pas encore prouvé qu'on retombe toujours sur 1 pour tout n... d'où le terme de conjecture. Comme quoi même avec des calculs tout bêtes, il peut être bien difficile (voire impossible) de déterminer si la boucle est finie ou non.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Avec n entier naturel different de 0. La conjecture est que cela se termine pour tout nombre?

    En tout cas les 1 000 000, premiers nombres fonctionnent.

  18. #18
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par TabrisLeFol
    Avec n entier naturel different de 0. La conjecture est que cela se termine pour tout nombre?
    Oui
    Citation Envoyé par TabrisLeFol
    En tout cas les 1 000 000, premiers nombres fonctionnent.
    Tu as vérifié
    Alors tu aurais pu aller jusqu'à 3,2×10^16, après on ne sait pas...

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Pour complèter le sujet et peut -etre pour commencer par des choses simples existe-t-il des classes java agissant sur du code source java permettant de savoir quels sont toutes les variables utilisés dans le programmes sans forcément savoir leur valeur.

    Merci.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Toujours à propos du problème de départ quels sont les librairies à utiliser pour récupérer tel ou tel caractère dans du code java. Par exemple je voudrais récupérer toutes les lignes ou un while apparait.

    Merci

    PS:Surtout si vous avez des idées pour récupérer toutes les valeurs de telle ou telle variable dans un programme, genre avec du découpage avant ou arrière. J'ai aussi entendu parler du logiciel bandera.

Discussions similaires

  1. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 09h14
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 08h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo