Wie bekomme ich Warnungen über zugewiesene, aber nicht mehr verwendete Variablen?

9

Die folgende Datei foo.c ist eine vereinfachte Version eines subtileren Fehlers, den ich in meinem Code gefunden habe.

%Vor%

Die Zeile a = 42 ist eigentlich ein Tippfehler in meinem Code: Ich meinte b = 42 . Ich erwarte nicht, dass der Compiler erkennt, dass ich einen Tippfehler gemacht habe, aber ich möchte, dass ich eine Warnung bekomme, die ich einer lokalen Variablen (oder einem Funktionsparameter) zuweise, die nicht mehr verwendet wird. Wenn ich diese Datei mit

kompiliere %Vor%

Ich bekomme absolut keine Warnung. Die Überprüfung des generierten Codes zeigt, dass die Zuweisung a = 42 nicht ausgeführt wird, daher ist gcc vollkommen bewusst, dass diese Anweisung nutzlos ist (daher potenziell falsch). Wenn Sie den Aufruf von bar(a); kommentieren, wird eine Warnung warning: parameter ‘a’ set but not used [-Wunused-but-set-parameter] ausgegeben. Daher scheint gcc nicht zu warnen, solange a irgendwo in der Funktion verwendet wird, auch wenn vor die Zuordnung.

Meine Fragen:

  1. Gibt es eine Möglichkeit, GCC oder Clang zu sagen, eine Warnung für diesen Fall zu erstellen? (Ich konnte mit clang 3.0 keine Warnung erzeugen, selbst wenn der Aufruf von bar entfernt wurde.)
  2. Gibt es einen Grund für das tatsächliche Verhalten? In einigen Fällen war es tatsächlich wünschenswert, lokalen Variablen zuzuordnen, die vom Optimierer verworfen werden.
adl 05.01.2012, 16:54
quelle

2 Antworten

4

Es gibt keine Option gcc oder clang , die vor dieser nutzlosen Aufgabe warnen kann.

PC-Lint dagegen kann in dieser Situation warnen.

  

Warnung 438 Letzter Wert, der der Variablen 'Symbol' zugewiesen wurde, wurde nicht verwendet. - Ein Wert hatte   wurde einer Variablen zugewiesen, die später nicht verwendet wurde. Das   Nachricht wird entweder bei einer return - Anweisung oder am Ende einer a - Nachricht ausgegeben   Blockieren, wenn die Variable den Gültigkeitsbereich verlässt.

    
ouah 05.01.2012, 17:08
quelle
-1

Der Compiler erkennt, dass es sich um einen toten Code handelt, und optimiert ihn trotzdem. Wenn Sie sich die Assembly-Liste ansehen (vorausgesetzt, Sie teilen gcc mit, sie zu optimieren), dann werden Sie feststellen, dass die Zuweisung nicht existiert.

    
ObjectiveC-oder 05.01.2012 17:00
quelle

Tags und Links