-
Reverse code c++
Bonjour a tous
Voila, je viens de débarquer dans une entreprise ou on me demande de bosser sur une grosse application c++. Mais cette appli a été codée et est utilisée sous linux, et a été affuble d'extension telles que .hh et .cc.
De plus les fichiers ont été quelque peu classe étrangement... avec d'autre fichiers, tel des "makefile" ou encore des bouts de script en python. Et bien sur il n'y a ni doc ni commentaire a propos de ce code...Je suis en plus complètement néophyte en matière de c++.
Ma question est donc celle ci : existe-t-il un moyen de faire du reverse code afin de générer au moins un UML ? Genre lui donner un répertoire et hop il rame et me donne un joli diagramme pour que je puisse comprendre ce meli-melo ?
J'ai essaye visual pradigm, mais il semble planter des que je lui donne les fichiers sources, peut etre a cause des extensions bizarres.
Merci de votre aide en tous cas.
-
Bonjour,
StarUML permet ça en lui fournissant des header à analyser.
-
Salut,
Le logiciel Umbrello permet de faire du reverse engineering il me semble (il est disponible sous Linux).
-
salut,
d'aabord, il faut savoir que les extensions *.hh et *.cc ne sont rien d'autres que des extensions tout à fait classiques du C++, même si elles se sont en partie dépréciées au fil du temps au profit de *.hpp et *.cpp (tu as encore de la chance que, travaillant sous linux, il n'ont pas profité que le système est sensible à la casse pour utiliser les extensions *.H et *.C en majuscule :D)
Les fichiers Makefile sont quant à eux, des fichiers d'automatisation de la compilation.
Ce sont eux qui vont indiquer les options de compilation à passer, et d'une certaine manières les différentes dépendances entre les fichiers
Il y a un tuto sur les Makefile "quelque part" sur ce forum, il serait peut etre pas mal d'aller y faire un tour, de cette manière, tu pourrais déjà commencer à comprendre ce qui est fait dans ces fichiers ;)
Pour le reste, tu peux aussi t'orienter vers Doxygen, qui permet d'avoir une vue d'ensemble du projet.
Il permet, par exemple, d'avoir les relations qui existent entre les différentes classes, les dépendances entre les fichiers et même des diagrammes d'appel, de manière à pouvoir te faire une idée des appels faits par les différentes fonctions (ainsi que de ce par quoi elles sont appelées).
Mais le meilleur moyen de "rentrer dans le code" est peut etre, tout simplement, de partir de la fonction main et des variables qu'elle utilise pour aller voir à quoi ressemblent les différentes classes et essayer (si elles ont été nommées un peu corectement) de déterminer leur responsabilités.
Bon courage, je crois que tu en auras besoin ;)
-
J'aime beaucoup BoUML pour faire du reverse engineering de code. Mais il faut savoir que :
- A mon avis, UML ne représente pas correctement du code en C++ (en particulier les différentes relations entre classes, qui sont plus complexes en C++ que par exemple en Java ou C#)
- Les outils UML que j'ai pu voir ne sont de toute manière pas très fins pour faire du retro engineering de C++ (par exemple, si A contient un std::vector<std::shared_ptr<B>>, dans l'idéal, on doit en déduire simplement une relation entre A et B, avec certaines décorations sur cette relation, mais rien qui concerne les classes vector ou shared_ptr. Ce n'est pas ce que j'ai vu jusqu'à présent.
-
Et bien merci de ces réponses. Je vais m'empresser de regarder une peu tout ça et voir ce qui ressort bien.
J'avais commence effectivement a lire le tuto sur les makefile, afin de mieux comprendre.
En tous cas j'ai au moins réussi a générer des classe avec VisualParadigm, je vais peut être les imprimer et reconstruire mon uml sur papier au fur et a mesure, je ne sais pas je vais voir. Je vais aussi (re)tester Doxygene, l'ayant déjà survole quand je faisais du Java.
Merci a vous en tous cas !
:ccool:
-
A chaque fois que j'ai eu à me poser sur un gros projet déjà bien avancé, j'ai fait comme le préconise koala: plonger dans le code. Un gros bloc-note, et c'est parti pour lire les .h et .c! N'hésite pas à ajouter des commentaires pour comprendre petit bout par petit bout ce qu'il se passe, pourquoi s'est écrit, etc. Le bloc-note me servait surtout pour garder le fil conducteur dans la lecture du code, comme par exemple les liens fonctionnels entre les différentes classes genre celle-ci stocke des données, celle-ci affiche un truc à l'écran et est appelée par telle autre... Histoire d'avoir une vision globale du projet.
Un autre point qui pourra grandement t'aider: te munir d'un IDE avec des fonctionnalités de navigation dans le code très simple. Travaillant sous Visual C++, l'add-on Visual Assist est d'une aide inestimable, et je sais que cette tache de découverte et déchiffrage du code serait beaucoup plus longue sans ça.
My 2 cents.
-
Une autre technique qui marche avec moi pour entrer dans du code que je ne connais pas est d'y aller avec un débogueur.
Tout d’abord, j'utilise normalement le produit, afin d'apprendre ce qu'il fait avant de tenter de comprendre comment il le fait. Puis j'y vais en pas à pas, à plus ou moins gros grains selon l'endroit où je me trouve. J'arrive ainsi souvent à commencer à ma former une image mentale de l'architecture du code.
-
En général, je pars du main, parcours le code, et sur papier, fais en général deux choses :
- construction d'un diagramme de classe simplifié, sans me soucier de l'exhaustivité quant à leurs membres
- construction du diagramme de séquence simplifié
-
Re-bonjour
Alors j'ai passe une partie de ma journée sur ce fichu diagramme et sur VisualParadigm.
Et en fait il marche plutôt pas mal. Il galère un peu parfois a générer certain *.h, mais on peut les re-générer. Même si ce n'est pas au top top niveau formalisme UML, ça permet d'avoir toutes les boites, méthodes et attributs. Reste plus qu'a se munir d'un crayon et d'une feuille et a recoller les morceaux :)
-
Sinon, il existe un programme nommé autodia qui traduit du code en fichier .dia, utilisable dans le programme dia, éditeur de diagramme de classe.
Tous deux sont des logiciels libres, disponibles (au moins) pour linux.