2010-08-01 9 views
12

Es ist für Compiler üblich, eine switch to warn when code is unreachable bereitzustellen. Ich habe auch Makros für einige Bibliotheken gesehen, die assertions for unreachable code bereitstellen.Wie kann ich GCC anzeigen, dass eine Linie nicht erreichbar sein sollte?

Gibt es einen Hinweis, z. B. durch ein Pragma, oder eingebaut, dass ich GCC (oder andere Compiler für diese Angelegenheit) übergeben kann, wird Warnung oder Fehler während der Kompilierung, wenn es festgestellt wird, dass eine Zeile erwartet wird unerreichbar kann tatsächlich erreicht werden?

Hier ein Beispiel:

if (!conf->devpath) { 
     conf->devpath = arg; 
     return 0; 
    } // pass other opts into fuse 
    else { 
     return 1; 
    } 
    UNREACHABLE_LINE(); 

Der Wert dies ist bei der Erkennung, nach Änderungen in Bedingungen über der erwartete unerreichbare Linie, dass die Linie in der Tat erreichbar ist.

Antwort

14

gcc 4.5 unterstützt die __builtin_unreachable() Inline-Compiler, diese Kombination mit -Wunreachable-code könnte das tun, was Sie wollen, aber wahrscheinlich falsche Warnungen

+2

Ich möchte anmerken, dass die Option '-Wunreachable-code' in späteren Versionen von gcc entfernt wurde (weil sie unter verschiedenen Optimierungsoptionen stark unberechenbar war) – Hasturkun

2

Wenn Ihr Compiler nicht die Warnung hat, die Sie benötigen, kann er mit einem statischen Analysator ergänzt werden. Die Art von Analysator, über den ich spreche, würde seine eigene Annotationssprache haben und/oder C assert erkennen und diese für Hinweise von Eigenschaften verwenden, die an bestimmten Punkten der Ausführung wahr sein sollten. Wenn für nicht erreichbare Anweisungen keine bestimmte Anmerkung vorhanden ist, könnten Sie wahrscheinlich assert (false); verwenden.

Ich kenne sie nicht persönlich, aber Klokwork und CodeSonar sind zwei berühmte Analysatoren. Goanna ist eine dritte.

+2

Das alte 'Lint'-Werkzeug, das verwendet wurde, um den Kommentar'/* NOTREACHED */'zuzulassen, was auf Code hindeutet, der nicht erreichbar sein sollte ... Nicht sicher, wie das Verhalten des Werkzeugs bei diesem Kommentar war. –

1

mit gcc 4.4.0 Windows-Cross-Compiler auf PowerPC mit -O2 oder O3 Kompilieren führen die folgende Arbeiten für mich:

#define unreachable asm("unreachable\n")

der Assembler nicht mit unbekanntem Betrieb, wenn die Compiler es nicht weg optimieren sind, weil es geschlossen hat, dass es nicht erreichbar ist.

Ja, es ist sehr wahrscheinlich "sehr unberechenbar unter verschiedenen Optimierungsoptionen", und wahrscheinlich zu brechen, wenn ich endlich den Compiler zu aktualisieren, aber im Moment ist es besser als nichts.