Unbenutzte lokale Variablen automatisch aus C-Quellcode löschen

8

Ich möchte nicht verwendete lokale Variablen aus der C-Datei löschen. Beispiel:

%Vor%

Hier ist die nicht verwendete Variable 'c'.

Ich werde extern eine Liste aller nicht verwendeten lokalen Variablen haben. Nun benutze ich ungenutzte lokale Variablen, die ich habe, müssen wir lokale Variablen aus dem Quellcode & amp; löschen.
Im obigen Beispiel ist "c" eine nicht verwendete Variable. Ich werde es wissen (ich habe Code dafür). Hier muss ich c & amp; amp finden; lösche es.

BEARBEITEN

Es geht nicht darum, nicht verwendete lokale Variablen mit einem externen Werkzeug zu finden. Der Punkt ist, sie vom Code zu entfernen, der eine Liste von ihnen gegeben wird.

    
user65514 18.02.2009, 12:43
quelle

10 Antworten

20

Stellen Sie die Warnstufe Ihres Compilers auf und es sollte Ihnen sagen.

Platzieren Sie Ihr Quellfragment in "f.c":

%Vor%     
Paul Beckingham 18.02.2009 12:46
quelle
10

Tricky - Sie müssen C-Code dafür analysieren. Wie nah muss das Ergebnis sein? Beispiel was ich meine:

%Vor%

Nun ist es für Menschen offensichtlich, dass der zweite Kommentar verschwinden muss.

Leichte Abweichung:

%Vor%

Auch hier muss der zweite Kommentar gehen, der diesmal vor b.

Im Allgemeinen möchten Sie Ihre Eingabe analysieren, filtern und alles ausgeben, was nicht die Deklaration einer nicht verwendeten Variable ist. Ihr Parser müsste Kommentare und # include-Anweisungen beibehalten, aber wenn Sie Header nicht # enthalten, ist es möglicherweise unmöglich, Deklarationen zu erkennen (umso mehr, wenn Makros verwendet werden, um die Deklaration zu verbergen). Schließlich müssen Sie über Kopfzeilen entscheiden, ob A * B (); ist eine Funktionsdeklaration (wenn A ein Typ ist) oder eine Multiplikation (wenn A eine Variable ist)

[Bearbeiten] Außerdem:

Auch wenn Sie wissen, dass eine Variable nicht verwendet wird, hängt die richtige Methode zum Entfernen davon sehr vom Remote-Kontext ab. Nehmen wir beispielsweise

an %Vor%

Offensichtlich ist c nicht benutzt. Kannst du es ändern?

%Vor%

Vielleicht, aber nicht, wenn & amp; foo in int(*)(int,int,int) gespeichert ist. Und das kann woanders passieren. Wenn (und nur wenn) das passiert, sollten Sie es in

ändern %Vor%     
MSalters 18.02.2009 12:53
quelle
5

Warum willst du das machen? Angenommen, Sie haben einen anständigen optimierenden Compiler (GCC, Visual Studio und andere), wird die binäre Ausgabe nicht anders sein, wenn Sie das 'int c' in Ihrem ursprünglichen Beispiel entfernen oder nicht.

Wenn es sich nur um Code-Bereinigung handelt, wird Ihnen jede neuere IDE schnelle Links zum Quellcode für jede Warnung geben, klicken Sie einfach auf und löschen Sie:)

    
Christoffer 18.02.2009 14:02
quelle
5

Meine Antwort ist eher eine ausführliche Anmerkung zu MSalters sehr gründlicher Antwort. Ich würde über "tricky" hinausgehen und sagen, dass solch ein Werkzeug sowohl unmöglich als auch nicht ratsam ist.

Wenn Sie lediglich die Verweise auf die Variable entfernen möchten, könnten Sie einen eigenen Code-Parser schreiben, der jedoch den Funktionskontext, in dem er sich befindet, unterscheiden muss, beispielsweise

%Vor%

Jeder einfache Parser würde Schwierigkeiten haben, wenn sowohl 'a' als auch 'b' ungenutzte Variablen sind.

Zweitens, wenn Sie Kommentare wie MSalter betrachten, werden Sie feststellen, dass die Leute nicht konsequent kommentieren;

%Vor%

usw.

Wenn Sie also einfach die nicht verwendeten Variablen entfernen, werden verwaiste Kommentare erstellt, die wohl gefährlicher sind als überhaupt keine Kommentare .

Letztlich ist es eine obszön schwierige Aufgabe, elegant vorzugehen, und Sie würden den Code unabhängig von anderen manipulieren. Indem Sie den Prozess automatisieren, würden Sie den Code schlechter machen.

Schließlich sollten Sie darüber nachdenken, warum die Variablen ursprünglich im Code enthalten waren und ob sie veraltet sind, warum sie nicht gelöscht wurden, als alle ihre Referenzen vorhanden waren.

    
DevinB 18.02.2009 15:17
quelle
1

Statische Codeanalyse-Tools zusätzlich zur Warnstufe, wie Paul richtig erklärt hat.

    
Ilya 18.02.2009 12:48
quelle
1

Neben der Möglichkeit, diese durch Warnungen anzuzeigen, optimiert der Compiler diese normalerweise, wenn Optimierungen aktiviert sind. Zu überprüfen, ob eine Variable nie referenziert wird, ist im Hinblick auf die Implementierung im Compiler ziemlich trivial.

    
jheriko 18.02.2009 12:48
quelle
0

Sie benötigen einen guten Parser, der die originale Zeichenposition der Token beibehält (sogar in Anwesenheit des Präprozessors!). Es gibt einige Werkzeuge für das automatisierte Refactoring von C / C ++, aber sie sind weit vom Mainstream entfernt.

Ich empfehle Ihnen, Taras Blog zu besuchen. Der Typ macht einige große automatische Refactorings von Mozilla Codebase, wie Out-Params mit Rückgabewerten ersetzen. Sein Hauptwerkzeug für das Umschreiben von Code ist Schweinefleisch :

  

Pork ist ein C ++ - Parsing und Neuschreiben   Werkzeugkette. Der Kern von Pork ist ein C ++   Parser, der genaues Zeichen liefert   Positionen für Anfang und Ende von   jeder AST-Knoten sowie der Satz von   Makroerweiterungen, die beliebige enthalten   Lage. Diese Information ermöglicht C ++   automatisch in a umgeschrieben werden   genauer Weg.

Aus dem Blog:

  

Bisher wurde Schweinefleisch für "kleine" verwendet   Dinge wie Umbenennen   Klassen und Funktionen, rotierend   Outparameter und Korrektur prbool   Fehler. Außerdem hat sich das Schwein bewährt   in einem Experiment, das beteiligt war   Neuschreiben fast jeder Funktion (dh   Erzeugen eines 3 + MB Patch) in Mozilla zu   Verwenden Sie Garbage Collection anstelle von   Referenzzählung.

Es ist für C ++, aber es kann Ihren Bedürfnissen entsprechen.

    
Constantin 24.02.2009 08:10
quelle
0

Einer der Poster oben sagt "unmöglich und nicht ratsam". Ein anderer sagt "tricky", was die richtige Antwort ist. Sie benötigen 1) einen vollständigen C-Parser (oder was auch immer Sprache von Interesse), 2) Inferenzverfahren, die die Sprache verstehen Bezeichnerreferenzen und Datenflüsse, um diese Variable zu bestimmen ist in der Tat "tot" und 3) die Fähigkeit, tatsächlich zu modifizieren der Quellcode.

Was an all dem schwer ist, ist die enorme Energie, die aufgebaut werden muss 1) 2) 3). Sie können sich für keine einzelne Bereinigungsaufgabe rechtfertigen. Was man tun kann, ist eine solche Infrastruktur speziell zu bauen mit dem Ziel, es über viele verschiedene zu amortisieren Programmanalyse und Transformationsaufgaben.

Mein Unternehmen bietet ein solches Tool an: Das DMS Software Reengineering Werkzeugkasten Sehen Ссылка DMS hat Frontends für die Produktionsqualität für viele Sprachen, einschließlich C, C ++, Java und COBOL.

Wir haben tatsächlich ein automatisiertes "nutzlose Erklärungen finden" erstellt. Werkzeug für Java, das zwei Dinge tut: a) listet sie alle auf (und erstellt so die Liste!) b) erstellt eine Kopie des Codes mit den unbrauchbaren Deklarationen    entfernt. Sie wählen aus, welche Antwort Sie behalten möchten: -)

Das Gleiche für C wäre nicht schwierig. Wir schon ein Werkzeug haben, das solche toten Variablen / Funktionen identifiziert.

Ein Fall, den wir nicht angaben, ist der "nutzlose Parameter" Fall, weil Sie einen nutzlosen Parameter entfernen, haben Sie um alle Aufrufe von anderen Modulen zu finden, vergewissern Sie sich, dass das Einrichten des Arguments keine Seite hat Effekt, und reiße das nutzlose Argument aus. Wir haben tatsächlich vollständige Grafiken der gesamten Software System von Interesse, und so würde dies auch sein möglich.

Also, es ist einfach knifflig und nicht einmal sehr knifflig wenn Sie die richtige Infrastruktur haben.

    
Ira Baxter 14.06.2009 06:03
quelle
-1

Sie können das Problem als Textverarbeitungsproblem lösen. Es muss eine kleine Anzahl von Regexp-Mustern geben, wie ungenutzte lokale Variablen im Quellcode definiert sind.

Mit einer Liste von nicht verwendeten Variablennamen und den Zeilennummern, an denen sie sich befinden, können Sie den C-Quellcode Zeile für Zeile bearbeiten. In jeder Zeile können Sie über die Variablennamen iterieren. Zu jedem Variablennamen Sie können die Muster einzeln abgleichen. Nach einer erfolgreichen Übereinstimmung kennen Sie die Syntax der Definition. Sie wissen also, wie Sie die nicht verwendete Variable daraus löschen können.

Zum Beispiel, wenn die Quellzeile lautet: "int a, unused, b;" und der Compiler meldete "unbenutzt" als eine unbenutzte Variable in dieser Zeile, dann wird das Muster "/, unused, /" übereinstimmen und Sie können diese Teilzeichenfolge durch ein einzelnes "," ersetzen.

    
sambowry 18.09.2009 13:39
quelle
-1

Auch: Schiene .

  

Splint ist ein Werkzeug zur statischen Überprüfung von C-Programmen auf Sicherheitslücken und Codierungsfehler. Mit minimalem Aufwand kann Splint als besserer Flusen verwendet werden. Wenn zusätzliche Anstrengungen unternommen werden, um Anmerkungen zu Programmen hinzuzufügen, kann Splint eine stärkere Überprüfung durchführen, als dies mit einem Standard-Lint möglich ist.

    
Hank Gay 18.02.2009 12:48
quelle

Tags und Links