Wie finde ich nicht aufgerufene Funktionen? [geschlossen]


8

Ich betrachte einen C / C ++ - Code, der Funktionen zu haben scheint, die definiert, aber nie verwendet werden. Dies ist ein ziemlich langwieriger Prozess, um den Code zu verfolgen und zu überprüfen. Ich habe einige Umfragen durchgeführt und es gibt eine Reihe von Tools, die diese Art der Analyse durchführen können.

Kann jemand Erfahrungen oder Tipps darüber teilen, welche Tools und Techniken am besten geeignet sind oder welche alternativen Methoden zur Überprüfung dieses Codes tatsächlich nicht verwendet werden?


Antworten:


10

Es gibt einige Tools, die "toten Code" in Ihren Programmen finden können. Sie können hier und hier über Stack Overflow-Threads lesen . eine kleine Zusammenfassung:

Verwenden Sie die gcc-Compiler-Flags -Wunused und -Wunreachable-Code und verwenden Sie dann ein Tool wie lcov, um die nicht verwendeten Methoden zu finden.


3
Sie sind sich nicht sicher, welche Funktionen hierfür in Ihrem Compiler vorhanden sind. Beachten Sie jedoch, dass Sie bei Verwendung eines Aufrufs, der auf einer beliebigen Art von Reflektion oder RTTI basiert, eine Methode mit Namen aufrufen können, auf die an keiner Stelle in der Codebasis statisch verwiesen wird.
Mason Wheeler

5

Spur? Warum? Kommentieren Sie sie einfach aus und durchlaufen Sie den Compiler. Es wird Ihnen schnell sagen, ob Sie eine Funktion auskommentiert haben, auf die an anderer Stelle verwiesen wurde.


3
Es ist zu beachten, dass dies nur in kompilierten Sprachen funktioniert und nicht in interpretierten Sprachen wie PHP. Außerdem ist es für jedes große Projekt unpraktisch, da es Tage dauern kann, bis Sie alle Methoden kommentiert / auskommentiert und überprüft haben.
Davor Ždralo

1
Er gibt eindeutig an, dass er sich in C ++ befindet. Die inkrementelle Neuerstellung ist extrem schnell. Wenn Sie lediglich eine Methode in einer Quelldatei kommentieren, kann der Linker Sie sehr schnell informieren.
DeadMG

In C sollte dies meistens funktionieren. Es gibt jedoch Komplikationen wie Code, der DEFINEs verwendet, um zwischen verschiedenen Implementierungen zu wechseln. In C ++ funktioniert dies aufgrund von Funktionsüberladung, Vorlagenspezialisierung und wahrscheinlich einigen anderen Funktionen nicht zuverlässig.
CodesInChaos

2

Wenn Sie aktiv nach nicht verwendetem Code suchen, verwenden Sie einen Vorschlag von Jake223 .

Wenn Sie jedoch nur auf Code stoßen, der nicht verwendet zu werden scheint, können Sie einfach nach dem Namen der Methode in Ihrer Codebasis suchen. Wenn es sich um eine private Methode handelt, ist Ihre Arbeit einfach. Suchen Sie nur die aktuelle Klasse. Wenn es sich um eine öffentliche Methode handelt, durchsuchen Sie alles. Wenn es sich um eine ganze Klasse handelt, suchen Sie in Ihrem gesamten Code nach dem Namen.

Kein Treffer? Perfekt. Löschen Sie den Code und führen Sie Tests aus . Sie haben Tests, nicht wahr? Übernehmen Sie dann Ihre Änderungen in Ihr Dokumentversionssystem . Sie benutzen eine, nicht wahr? Auf diese Weise können Sie eine Änderung rückgängig machen, wenn Sie jemals feststellen, dass Sie sie zurück benötigen.

Das Löschen von Code sollte etwas sein, das Sie jeden Tag tun. Vielleicht überarbeiten Sie einen Code und löschen den alten. Oder suchen Sie alten, nicht verwendeten Code und löschen Sie ihn. Und selbst wenn Sie keine Backups haben, wie schwierig ist es, ein oder zwei Funktionen neu zu schreiben? Und beim zweiten Mal werden Sie sie sicherlich besser schreiben als zuvor.


+1 für den guten, altmodischen und langwierigen Prozess der manuellen Suche nach den Funktionsnamen. Nicht viel Spaß, aber es funktioniert!

1
Und es ist auch nicht so langweilig. Jede moderne IDE kann sehr intelligent nach jedem Text suchen. Darüber hinaus können Sie für C, C ++, Java und sogar für PHP mit der rechten Maustaste auf eine Funktion klicken und auf "Verwendung suchen" klicken.
Patkos Csaba

0

Es sei denn, Sie suchen nach Ärger (dh Sie wissen, dass sie angerufen werden sollten), warum sich die Mühe machen. Wenn sie wirklich nicht aufgerufen werden, werden sie wahrscheinlich vom Linker entfernt, und in jedem Fall ist der verschwendete Speicherplatz nicht signifikant. Wenn Sie sie jedoch entfernen und später feststellen, dass sie benötigt werden (möglicherweise in einer Compiler-Konfiguration, die Ihnen nicht bekannt war), müssen Sie mehr Arbeit leisten, um sie wiederherzustellen. Dies ist besonders schwierig, wenn das Entfernen und Wiederentdecken viel Zeit voneinander entfernt ist.


3
Der Grund dafür ist, dass Sie, wenn sie nicht aufgerufen werden, Code verwalten, der nicht gewartet werden sollte, und daher wertvolle Engineering-Zeit verschwenden.
Michael Kohne

Wenn Sie an etwas arbeiten, gibt es ja viele nicht aufgerufene Funktionen, sodass Sie sie möglicherweise beibehalten müssen, auch wenn Ihr Compiler warnt, dass sie nicht vorhanden sein sollten. Eine gute Idee wäre es, sie zu kommentieren, wenn die Wahrscheinlichkeit einer Verwendung geringer ist. Fügen Sie jedoch eine eindeutige Markierung hinzu, die angibt, dass es sich bei diesem Code nicht um Junk handelt. Fügen Sie ein Datum hinzu, und wenn Sie Teil eines Teams sind, an wen Sie sich wenden können, bevor Sie sie bereinigen.
DPD

Gemäß DO-178 sollten nicht verwendete Funktionen, die nicht durch das Design gerechtfertigt sind, nicht vorhanden sein.
Jinawee

0

Meine bevorzugte IDE ist Eclipse, und obwohl das Einrichten zunächst umständlich und etwas mühsam ist, lohnt sich die Mühe angesichts aller Tools, die ich bekomme. Ein solches Tool (und ich habe keine Ahnung, wie der offizielle Name lautet) informiert Sie über nicht verwendeten Code wie Klassen, Funktionen, Variablen usw. Die IDE zeigt einfach eine gelbe Linie unter der Deklaration an. Ich bin mir nicht 100% sicher, ob dies mit Projekten mit mehreren Dateien funktioniert, aber Sie könnten es jederzeit versuchen!


0

IDEs haben diese Funktion normalerweise gut implementiert und sie funktioniert standardmäßig (sie kann normalerweise deaktiviert werden).

Unabhängig davon, welche Methode Sie aus den anderen Antworten auswählen, um toten Code zu finden, sollten Sie sich immer der Reflexionsprobleme bewusst sein. Auf einige Methoden / Felder kann allein durch Reflexion zugegriffen werden. Das Entfernen dieser Methoden löst außer zur Laufzeit keinen Alarm aus.

Wenn Sie (gute) Tests für Ihre Projekte geschrieben haben, sind diese in dieser Situation von großem Wert.


0

Sie können Cppcheck für diesen Zweck verwenden:

$ cppcheck --enable=unusedFunction .
Checking foo.c...
1/2 files checked 0% done
Checking main.c...
2/2 files checked 0% done
[foo.c:1]: (style) The function 'foo' is never used.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.