2012-08-15 7 views
7

Ich installierte das Tool Cppcheck für die statische Codeanalyse meines C++ - Projekts und bekam das Gefühl, dass es schlecht funktioniert. Zum Beispiel, kann mir jemand sagen, warum Cppcheck ist nicht in der Lage, ein Array Out-of-Bounds Fehler im folgenden Code zu finden?Warum findet Cppcheck diesen offensichtlichen Array-Out-of-Bounds-Fehler nicht?

void f(int c) { 
    char *p = new char[10]; 
    p[c] = 42; 
} 

void g() { 
    f(100); 
} 

Es gibt einen online demo wo dieser Code bequem geprüft cppcheck verwenden werden können. Alles, was auftaucht, ist ein Speicherleck in Zeile 4, keine Anzeichen für einen möglichen Pufferüberlauf.

+2

ich feststellen, dass Ihre Frage bereits im cppcheck Forum gepostet und kommentiert wurde. Der Kommentar dort scheint zu implizieren, dass diese Art von Grenzenüberprüfung noch nicht unterstützt wird. Es könnte besser sein, dies in diesem Forum weiter zu hinterfragen. –

+1

weil kein Tool jemals alle Fehler finden kann, und insbesondere cppcheck nicht vollständig analysiert und evaluiert C++, aber enthält viele Verknüpfungen, die nur für die meisten lokalen Fehler erkannt werden können. – PlasmaHH

+2

Beschreiben Sie die erforderlichen Schritte, damit das Tool den Fehler erkennen kann. Zählen Sie dann die Fälle auf, in denen falsche Positive auftauchen würden. Machen Sie sich dann ein Bild davon, wie sich die Entwickler hinsetzen und diese Dinge gegeneinander abwägen. – HonkyTonk

Antwort

9

Weil es derzeit nicht unterstützt wird.

Dies ist eigentlich kein offensichtlicher Fehler für den Compiler. So etwas wie

char c[5]; 
for (int i=0; i<10; ++i) 
    c[i] = 0; 

ist offensichtlicher, da es alle im selben Code ist.

So etwas wie

#define f(c) { \ 
    char *p = new char[10]; \ 
    p[c] = 42; \ 
} 

void g() { 
    f(100); 
} 

ist offensichtlich, weil cppcheck und die Compiler alle Makros an Ort und Stelle vor dem eigentlichen Kontrollen erweitern.

Ihr veröffentlichter Code ist jedoch nicht trivial, da sowohl cppcheck als auch der Compiler den gesamten Code innerhalb dieser Funktion benötigen und ihn in Bezug auf den Parameter auswerten. Es ist natürlich möglich, wenn die Funktion in Sicht ist (es wird ziemlich schwierig, bis unmöglich, über Übersetzungseinheiten), aber gerade jetzt, cppcheck hat diese Funktion nicht.

9

Ich bin ein Cppcheck-Entwickler.

Es ist nicht von Entwurf, dass Cppcheck das nicht erkennen kann.

Cppcheck evaluiert derzeit keine Funktionen mit allen gegebenen Parametern aus allen Funktionsaufrufen. Wir haben Tickets darüber und ich hoffe, dass es eines Tages behoben wird. Es wäre nett.

Wenn Sie Cppcheck verwenden, sollten Sie nicht denken, dass es alle Fehler erkennt. Cppcheck wird wahrscheinlich die meisten Fehler nicht erkennen. Es gibt keine Methode meiner bescheidenen Meinung, die alle Fehler in Ihrer Software entdecken wird. Verwenden Sie Cppcheck nur, um einige der Fehler zu erkennen, die Sie sonst nicht erkennen können. Es reduziert die Anzahl der Fehler etwas.

Ich hoffe, Sie sind nicht allzu enttäuscht und werden weiterhin Cppcheck verwenden.

+3

Sorry, aber es ist * vom Entwurf, dass CppCheck das Problem von OP nicht erkennen kann. CppCheck ist * entworfen *, um einen Strom von Sprach-Tokens zu erzeugen und "Muster" anzuwenden, um Token-Sequenzen auf Probleme zu überprüfen. Aber ein Tokenizer hat kein wirkliches Verständnis der Typinformation in der Sprache und kann daher keine "typenbezogene" Überprüfung durchführen. Natürlich könnte man mit genügend Energie durch die Verarbeitung der Tokens all diese Typinformationen hinzufügen, aber bis dahin haben Sie das voll funktionsfähige C++ - Frontend und das scheint nicht in CppChecks Ambitionen zu liegen. Dieses Werkzeug kann in einer ernsthaften statischen Analyse nicht sehr weit gehen. –

+3

Ich bin nicht enttäuscht von Cppcheck, es ist ein großartiges Open-Source-Projekt. Ich kannte seine Grenzen einfach nicht gut genug. Danke für die Erklärungen. – dokaspar

4

Die neueste Version von cppcheck 1.70 dev ist in der Lage, diesen Fehler zu erkennen:

$ cppcheck test.cpp 
Checking test.cpp... 
[test.cpp:3]: (error) Array 'p[10]' accessed at index 100, which is out of bounds. 
[test.cpp:4]: (error) Memory leak: p 
+1

Hat dieses Beispiel die Funktion in der gleichen Datei oder funktioniert es mit der Funktion in einer Datei und dem Aufruf der Funktion in einer anderen Datei? –

+1

Das ist ein guter Punkt. Gemäß meinen Tests [hier] (https://github.com/orbitcowboy/Stackoverflow_Question_11966613) wird das Problem mit dem Pufferzugriff außerhalb der Grenzen nur von cppcheck erkannt, wenn sich der Code in der gleichen Datei befindet. – orbitcowboy