Identificarea funcțiilor neutilizate în C/C ++

Possible Duplicate:
Finding “dead code” in a large C++ legacy application

Proiectul meu are o mulțime de fișiere sursă C, fiecare cu o mulțime de funcții globale. Multe dintre acestea nu mai fac referire la nici un apelant. Există o modalitate simplă de a identifica care dintre aceste funcții nu sunt menționate de nimeni deloc?

Fișierul de hartă generat de VC pare să fie util. Dar nu sunt sigur exact cum/când un nume de funcție este listat în fișierul hartă.

0
De fapt, sunt interesat să aflu cum poate fi folosit în acest scop fișierul de hartă generat de linkerul VC. (deoarece este disponibil în mod liber)
adăugat autor JavaMan, sursa
Ștergeți manual și recompilați codul pentru funcțiile îndoielnice.
adăugat autor iammilind, sursa

3 răspunsuri

Un mod direct, dar laborios de a face acest lucru este pur și simplu de a încheia declarația funcției și definițiile oricăror funcții suspecte cu directivele preprocesor:

#if 0
void old_func();
#endif

...

#if 0
void old_func()
{
}
#endif

sau dacă doriți să aveți mai mult control, puteți să înlocuiți 0 cu propriul macro propriu, astfel încât #if 0 devine #ifdef NO_OLD_FUNCTIONS - în acest fel este mai ușor de găsit și scoateți-le în mod permenent într-o etapă ulterioară odată ce sunteți fericiți că nu sunt utilizați.

Firește, va trebui să compilați și să conectați complet codul și orice alt cod care se bazează pe acesta.

0
adăugat
@AhmedJolani: (1) Suspectați că funcția este neutilizată, (2) urmați pașii de mai sus (3) compilatorul vă oferă erori sau nu - prin urmare, detectați dacă funcția este utilizată sau nu. Aceasta este o procedură foarte frecvent utilizată.
adăugat autor Component 10, sursa
@AhmedJolani: De aceea l-am descris ca fiind "laborios" - dar nu funcționează și nu implică instrumente (scumpe). Este doar una dintre multele abordări - vă rugăm să vă simțiți liber să sugerați un altul.
adăugat autor Component 10, sursa
Aceasta nu detectează, aceasta este preconfigurarea și asta nu a vrut să audă solicitantul.
adăugat autor Ahmed Jolani, sursa
și asta nu vrei să faci când ai mii de linii de cod.
adăugat autor Ahmed Jolani, sursa
profilarea poate fi utilizată pentru a detecta automat funcțiile neutilizate.
adăugat autor Ahmed Jolani, sursa

I don't think that the map file will be of any use. If it's like other map files I've seen, it won't indicate where (if anywhere) a symbol is used—only where it is defined. What you can do is run dumpbin over your object files: dumpbin /relocations, for example, will in fact display every use of a symbol with an address which may need relocation (practically speaking, functions and variables with static lifetime). You then use your usual tools on the output to determine whether the function you are interested in is there or not. (As someone who has worked mostly on Unix, I've installed CygWin and would use grep. I'm not familiar with the native equivalents to the different Unix tools under Windows.)

Ar fi destul de simplu (folosind Python, sau unele script-uri similare limbă) pentru a scrie un script mic care ar analiza rezultatul dumpbin/symbols pentru fiecare fișier obiect, pentru a obține numele toate funcțiile pe care le-ați definit, apoi analizează ieșirea dumpbin / relocations pentru a vă oferi o listă a funcțiilor pe care le utilizați și, în final diferă de cele două. (Microsoft pare să fi ieșit din ele mod de a face ca ieșirea din dumpbin să fie dificil de utilizat, dar nu este încă dificil; trebuie doar să știți ce linii să ignorați.)

0
adăugat

Puteți utiliza CCCC (gratuit, open source), care vă oferă o mulțime de valori despre programul dvs. O altă opțiune ar fi Coverity (nu este gratuită).

This question may be a duplicate of this one: Dead code detection in legacy C/C++ project

0
adăugat