Clang pour traquer les fuites mémoires...

MalaMala Membre, Modérateur
juillet 2009 modifié dans Objective-C, Swift, C, C++ #1
En me baladant sur le blog de Jeff LAMARCHE, je suis tombé par hasard sur l'un de ses derniers posts qui parle de Clang:
http://iphonedevelopment.blogspot.com/2009/02/clang-static-analyzer.html

Depuis le temps que je cherchais un outil efficace pour traquer les fuites mémoires! Je viens de tester sur un gros projet et je dois dire qu'il est rusé le bougre.  :D

C'est vraiment un "must have" du développeur Cocoa.  :p
«13

Réponses

  • schlumschlum Membre
    février 2009 modifié #2
    Instruments ne suffit pas ?  ???

    [Edit] Ah, j'avais pas vu, ça analyse le code avant compilation  ;)
  • MalaMala Membre, Modérateur
    07:29 modifié #3
    dans 1234794979:

    [Edit] Ah, j'avais pas vu, ça analyse le code avant compilation  ;)

    Oui, du coup tu as une analyse plus fine des problèmes et cela ne se limite pas aux fuites mémoires. C'est vraiment complémentaire avec Instrument.
  • MalaMala Membre, Modérateur
    février 2009 modifié #4
    Pour ceux qui aimeraient tester clang et qui ne supportent pas le terminal, j'ai fais un petit GUI...

    Clang GUI

    On dézippe, on lance, on glisse un projet xcode dans la zone de dépot, on fait run et on attend que ça se passe... Une fois l'analyse terminée, si il y a des erreurs dans le code, l'appli lance une page web générée par Clang avec tous les soucis qu'on avait pas vu.

    PS: Testé sous Xcode 3.1.2/Intel/OSX 10.5.

    Edit: modification pour pointer vers la page web de Clang GUI
  • schlumschlum Membre
    février 2009 modifié #5
    ça inclut les binaires de clang ? (parce que cvs pendant 1/4 d'heure puis compilation pendant 2h...  :P)

    [Edit] apparemment, ouais... mais :

    Can't exec "clang": No such file or directory at /Users/schlum/Desktop/Clang GUI.app/Contents/Resources/scan-build line 94.
    scan-build: Cannot execute 'clang'

  • mpergandmpergand Membre
    07:29 modifié #6
    Même erreur chez moi  ???
  • MalaMala Membre, Modérateur
    07:29 modifié #7
    Je suis en train de regarder. Apparement c'est mon setenv qui merdouille et sur ma machine j'avais déjà  installé clang au niveaux de mes binaires donc je l'ai pas vu passer.
  • MalaMala Membre, Modérateur
    07:29 modifié #8
    Ok, c'est ma copie des binaires dans le répertoire "resources" qui mettait la pagaille. Mon copy files ne conservait pas la structures des sous-répertoires.

    Je viens de mettre à  jour le zip. En toute logique je pense que c'est ok maintenant.

  • schlumschlum Membre
    07:29 modifié #9
    ça fonctionne maintenant, c'est pas mal 
    Suggestion d'amélioration : passer par une WebView pour tout avoir dans la même appli !
  • Philippe49Philippe49 Membre
    07:29 modifié #10
    Très prometteur ce Clang. 

    j'avais une semaine de développement sur un projet sans avoir fait particulièrement de vérification, et ben ça gagne du temps !

    :) : J'obtiens 3 messages sur une méthode - (CGPathRef)quartzPath; ,  du code "copié-collé" dans la doc d'Apple !
  • schlumschlum Membre
    07:29 modifié #11
    La doc d'Apple c'est pas une référence biblique hein... Y a plein de trucs mal foutus dans les exemples  :P
  • schlumschlum Membre
    07:29 modifié #12
    dans 1235320658:

    Ok, c'est ma copie des binaires dans le répertoire "resources" qui mettait la pagaille. Mon copy files ne conservait pas la structures des sous-répertoires.

    Je viens de mettre à  jour le zip. En toute logique je pense que c'est ok maintenant.


    On continue les tests... Si plusieurs projets dans la directory :
    xcodebuild: Error: the directory /Users/schlum/schlumdev/SudokuX/trunk contains more than one Xcode project (it has 3 of them). You will need to specify the project to build with the -project option.
    scan-build: Removing directory '/var/folders/0O/0OWXBl9lF-qpnyutaw7sFE+++TI/-Tmp-/Clang/2009-02-23-1' because it contains no reports.
  • MalaMala Membre, Modérateur
    février 2009 modifié #13
    Schlum, je viens d'uploader une nouvelle version qui tient compte de ta remarque.

    J'ai aussi fait quelques modifs mineures :
    - mémorisé le dernier projet déposé.
    - remplacé la suppression bête et méchante du répertoire build par un "xcodebuild clean" comme ça je nettoie aussi les dépendances.

  • MalaMala Membre, Modérateur
    février 2009 modifié #14
    dans 1235396651:

    On continue les tests... Si plusieurs projets dans la directory :
    xcodebuild: Error: the directory /Users/schlum/schlumdev/SudokuX/trunk contains more than one Xcode project (it has 3 of them). You will need to specify the project to build with the -project option.
    scan-build: Removing directory '/var/folders/0O/0OWXBl9lF-qpnyutaw7sFE+++TI/-Tmp-/Clang/2009-02-23-1' because it contains no reports.


    Donc ça normalement c'est vu avec la dernière version. Je fais un clean avant de lancer Clang sinon il ne repasse pas en revue les fichiers précédemment traités.

    Edit: A non pardon, toi c'est plusieurs projets au même endroit. je vais regarder ça car effectivement, par défaut je donne le répertoire du projet en paramètre.
  • schlumschlum Membre
    07:29 modifié #15
    En fait c'est que j'ai un projet 10.3, un 10.4 et un 10.5 dans le même répertoire (les 10.3 et 10.4 ne servant qu'à  faire du debug...)
    J'essaie en virant les 2 autres  :P

    PS : au passage, tu devrais mettre la NSTextView non éditable... Je me suis planté en glissant le projet, je l'ai glissé dessus  :)
  • MalaMala Membre, Modérateur
    07:29 modifié #16
    dans 1235397555:

    En fait c'est que j'ai un projet 10.3, un 10.4 et un 10.5 dans le même répertoire (les 10.3 et 10.4 ne servant qu'à  faire du debug...)
    J'essaie en virant les 2 autres  :P

    PS : au passage, tu devrais mettre la NSTextView non éditable... Je me suis planté en glissant le projet, je l'ai glissé dessus  :)

    Je t'ai ajouté l'option "xcodebuild -project [nom du projet]" cela devrait résoudre ton cas je pense.
  • mpergandmpergand Membre
    07:29 modifié #17
    Enfin un version qui marche ... presque  ;)

    J'ai testé avec deux projets différents, mais ça affiche toujours le premier rapport !

    J'ai été chercher le bon dans le dossier temp/
  • MalaMala Membre, Modérateur
    07:29 modifié #18
    dans 1235398030:

    Enfin un version qui marche ... presque  ;)

    J'ai testé avec deux projets différents, mais ça affiche toujours le premier rapport !

    J'ai été chercher le bon dans le dossier temp/

    Boulette en modifiant le code sur le clean des répertoires. Autant pour moi, c'est corrigé.  :fouf):
  • MalaMala Membre, Modérateur
    07:29 modifié #19
    dans 1235397555:

    PS : au passage, tu devrais mettre la NSTextView non éditable... Je me suis planté en glissant le projet, je l'ai glissé dessus  :)

    Vu dans la foulée.

    Mais c'est qu'ils sont exigeant en plus!!!  :P
  • schlumschlum Membre
    07:29 modifié #20
    C'est normal que ça analyse le code C et Objective-C, mais pas C++ ?
  • MalaMala Membre, Modérateur
    07:29 modifié #21
    dans 1235466540:

    C'est normal que ça analyse le code C et Objective-C, mais pas C++ ?

    Je n'ai pas testé mais apparement pour le C++ c'est pas très avancé (activé?).


    Clang currently has pretty good parsing and semantic analysis support for C and Objective-C right now, and bugs are usually quickly fixed once reported. C++ support is still very early, and we don't expect to have respectable C++ support for another 2 years or so.


    Plus d'infos ici...
    C++ Support in Clang

    Sinon je viens de mettre au propre une petite page web pour le GUI...
    Page Clang GUI


  • MalaMala Membre, Modérateur
    février 2009 modifié #22
    Dans "C++ Support in Clang", je viens de voir une option "-fsyntax-only" pour activer l'analyse C++. Si tu veux je peux ajouter l'option pour voir ce que ça donne.

    Edit: Apparement l'option n'est pas encore reconnue par la commande scan-build hors c'est elle qui se charge d'appeler Clang derrière.
    scan-build a écrit:

    scan-build: unrecognized option '-fsyntax-only'
  • schlumschlum Membre
    07:29 modifié #23
    Tant pas pour le C++ alors  :(

    Bravo pour le reste 
  • Philippe49Philippe49 Membre
    février 2009 modifié #24
    Une amélioration : quand on a corrigé les bugs, on relance une fois, c'est humain. La WebView reste en l'état précédent avec les bugs si tout est corrigé.

    Une remarque : CLang est sensible au nom pris pour les méthodes. Dans un projet assez conséquent, j'avais mis  copy dans le nom d'une méthode d'une catégorie et cette méthode renvoyait le résultat en autorelease, CLang m'a gratifié d'un leak en raison de la convention de nommage . Instruments lui ne donnait pas de leak lors de l'exécution.

    1) Je change le nom, et le leak disparaà®t

    2) Je réessaye dans un mini-petit-projet d'essai la même méthode avec le nom contenant copy, CLang a sans doute possibilité de vérifier plus avant ma méthode, et là  je n'ai pas d'indication de leak ...

    Mais je confirme que c'est un bel outil qui m'a détecté quelques dealloc non faits, quelques variables qui traà®naient inutilement, ... évitant la relecture pas à  pas de chaque fichier.
  • MalaMala Membre, Modérateur
    07:29 modifié #25
    dans 1235497152:

    Une amélioration : quand on a corrigé les bugs, on relance une fois, c'est humain. La WebView reste en l'état précédent avec les bugs si tout est corrigé.

    Je viens de faire le test et ca marche bien chez moi. As-tu bien fais là  mise à  jour suite à  la remarque de mpergand?
  • AliGatorAliGator Membre, Modérateur
    février 2009 modifié #26
    Salut Mala,

    J'ai téléchargé Clang GUI depuis ton site web dont tu donnes l'URL plus haut.
    J'ai testé un projet iPhone... mais il refuse de compiler, pour la simple et bonne raison que je n'ai pas de certificat (code-signing), en effet jusqu'à  présent je ne développe que sur iPhone Simulator...

    Je n'ai pas trouvé dans ton programme où régler les options de compilations (tu semblais au fil de ce post dire avoir rajouté des réglages possibles ?), donc en particulier comment lui demander d'utiliser les réglages Debug-Simulator ou Release-Simulator  pour compiler plutôt que ceux pour le Device ? Pourtant quand j'ouvre mon projet avec Xcode la configuration active est bien "Debug - Simulator"...


    Sinon j'ai testé sur un projet OSX, et il termine par ceci (et reste sur l'onglet "Build", il ne va pas sur "Result" qui de toute façon est vide) :
    ** BUILD SUCCEEDED **
    scan-build: Removing directory '/var/folders/Hg/HgdJ+tbfEM0ijd78cKCwlU+++TM/-Tmp-/Clang/2009-02-24-1' because it contains no reports.
    C'est normal qu'il n'y ait pas de rapport de build ? Ca veut dire que mon projet n'a aucune erreur ou risque de leak et donc que tout va bien ?


    Sinon interface épurée... ce qui est bien... mais un peu trop je trouve :
    - Le fait qu'il n'y ait pas de menu Fichier, et en particulier par de possibilité de faire Pomme-O pour choisir un projet (on est obligé d'utiliser le drag&drop, ce qui est bien mais pas toujours la manière la plus adéquate), je trouve ça dommage ça me gêne un peu
    - Pas de possibilité de choisir justement la configuration active du projet à  utiliser pour la compilation

    PS : Détail super important qui tue : je trouve que le bouton "Run" est vachement près du bord bas-droite de la fenêtre, j'ai pas l'impression que tu as respecté les "marges" que précaunise Apple dans ses Guidelines et que IB te suggère ? ^^
  • MalaMala Membre, Modérateur
    07:29 modifié #27
    dans 1235499447:

    Salut Mala,

    J'ai téléchargé Clang GUI depuis ton site web dont tu donnes l'URL plus haut.
    J'ai testé un projet iPhone... mais il refuse de compiler, pour la simple et bonne raison que je n'ai pas de certificat (code-signing), en effet jusqu'à  présent je ne développe que sur iPhone Simulator...

    C'est vrai que sur les projets iPhone que j'ai testé j'ai un certificat valide. Je vais regarder ça.

    dans 1235499447:

    Je n'ai pas trouvé dans ton programme où régler les options de compilations (tu semblais au fil de ce post dire avoir rajouté des réglages possibles ?), donc en particulier comment lui demander d'utiliser les réglages Debug-Simulator ou Release-Simulator  pour compiler plutôt que ceux pour le Device ? Pourtant quand j'ouvre mon projet avec Xcode la configuration active est bien "Debug - Simulator"...

    J'ai ajouté des paramètres que je passe à  la commande scan-build mais effecitvement ce serait bien de pouvoir paramètrer au moins le sdk dans le cas d'un projet l'iPhone. Par défaut, il doit se caler sur Device ce qui peut poser problème. 

    dans 1235499447:

    Sinon j'ai testé sur un projet OSX, et il termine par ceci (et reste sur l'onglet "Build", il ne va pas sur "Result" qui de toute façon est vide) :
    ** BUILD SUCCEEDED **
    scan-build: Removing directory '/var/folders/Hg/HgdJ+tbfEM0ijd78cKCwlU+++TM/-Tmp-/Clang/2009-02-24-1' because it contains no reports.
    C'est normal qu'il n'y ait pas de rapport de build ? Ca veut dire que mon projet n'a aucune erreur ou risque de leak et donc que tout va bien ?

    Oui, c'est que c'est tout bon pour lui.

    dans 1235499447:

    Sinon interface épurée... ce qui est bien... mais un peu trop je trouve :
    - Le fait qu'il n'y ait pas de menu Fichier, et en particulier par de possibilité de faire Pomme-O pour choisir un projet (on est obligé d'utiliser le drag&drop, ce qui est bien mais pas toujours la manière la plus adéquate), je trouve ça dommage ça me gêne un peu
    - Pas de possibilité de choisir justement la configuration active du projet à  utiliser pour la compilation

    PS : Détail super important qui tue : je trouve que le bouton "Run" est vachement près du bord bas-droite de la fenêtre, j'ai pas l'impression que tu as respecté les "marges" que précaunise Apple dans ses Guidelines et que IB te suggère ? ^^

    Et bien voilà  encore un peu de boulot. J'espère que j'aurais au moins droit à  une tournée!  :P

  • Philippe49Philippe49 Membre
    07:29 modifié #28
    dans 1235499230:

    dans 1235497152:

    Une amélioration : quand on a corrigé les bugs, on relance une fois, c'est humain. La WebView reste en l'état précédent avec les bugs si tout est corrigé.

    Je viens de faire le test et ca marche bien chez moi. As-tu bien fais là  mise à  jour suite à  la remarque de mpergand?


    J'ai téléchargé sur le site après ce post
    Je réessaye ...
  • Philippe49Philippe49 Membre
    07:29 modifié #29
    Effectivement, quand on relance une deuxième fois l'analyse, et qu'il n'y a plus de bug, la web view n'est pas rafraà®chie.

    Par contre, mon test avec copy que j'ai affiné, montre c'est vraiment le nom qui est pris en compte pour déterminer si la valeur envoyée est en autorelease ou en mode retain.   

    Ci-joint le test (commenter/décommenter ...)
  • MalaMala Membre, Modérateur
    07:29 modifié #30
    Je viens de mettre en ligne une nouvelle version 1.1.2 à  télécharger au même endroit:
    - Menu fichier dispo.
    - ajout d'une combo pour choisir le sdk iPhone pour les projets iPhone (Je détecte automatiqueemnt dans le projet xcode si j'ai affaire à  un projet Mac ou iPhone et je rajoute l'option qui va bien lors du run).

    A priori, j'ai trouvé un vieux projet avec un certificat erroné et ça semble ok. Merci de me confirmer chez vous.

    NB: pour lister les sdk, je considère uniquement une installation standard dans /Developper et je scanne le répertoire "/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/".


  • AliGatorAliGator Membre, Modérateur
    février 2009 modifié #31
    A ce rythme, pense à  mettre un numéro de version sur ton soft ;)

    J'ai ouvert Clang GUI, il avait gardé en mémoire le dernier projet que j'ai analysé, un projet OSX. Du coup le menu combo en bas était grisé.
    J'ai fait glisser un projet iPhone à  la place... le menu déroulant en bas ne s'est pas dégrisé.
    J'ai dû quitter Clang GUI et le relancer pour que le menu soit dispo... j'imagine que tu ne fais le test qu'une fois, à  l'ouverture de ton app, et non à  chaque fois qu'on fait glisser un nouveau projet ?

    Sinon une fois que j'ai pu choisir le SDK, la build du projet iPhone a bien fonctionné :)
    (L'idéal serait de détecter le SDK utilisé pour le projet, qui doit sans doute être stocké qqpart dans le xcodeproj, mais bon)
    Ensuite comme il m'avait détecté des erreurs (cf plus bas, bien ce clang) je les ai corrigées... il m'a dit "a pu d'erreurs", mais dans l'onglet "Result" en effet la webView contenait encore l'ancien rapport ! Faudrait la vider à  chaque relance de "Run" :P

    Après, le bouton "Run" mis par défaut (activable par la touche Entrée quoi) voire même un menuitem "Run" dans le nouveau menu Fichier avec le raccourci Pomme-R ou Pomme-B associé, serait idéal pour parfaire la chose...

    --

    Sinon bien ce petit clang : il m'a détecté des erreurs comme quoi j'avais oublié de releaser dans le dealloc une variable d'instance déclarée comme @property(retain)... Or en effet dans dealloc j'ai pas [tt][monivar release];[/tt] mais j'ai mis comme à  mon habitude [tt]monivar = nil;[/tt]... donc je pensais qu'il avait pas tilté et que c'était une fausse alerte... jusqu'à  ce que je réalise que je n'avais pas mis le "self." devant... donc en écrivant comme ça en effet il n'appelle pas le setter ! En mettant [tt]self.monivar = nil[/tt], hop, bug disparu :) Merci clang !
Connectez-vous ou Inscrivez-vous pour répondre.