Ich habe das Tool Cppcheck für die statische Code-Analyse meines C ++ - Projekts installiert und habe das Gefühl, dass es schlecht funktioniert. Kann mir zum Beispiel jemand sagen, warum Cppcheck im folgenden Code keinen Array-Out-of-Bounds-Fehler finden kann?
%Vor%Es gibt eine Online-Demo , in der dieser Code bequem mit Cppcheck überprüft werden kann. Alles, was dabei herauskommt, ist ein Speicherleck in Zeile 4, keine Anzeichen für einen möglichen Pufferüberlauf.
Weil es momentan nicht unterstützt wird.
Dies ist eigentlich kein offensichtlicher Fehler für den Compiler. Etwas wie
%Vor%ist offensichtlicher, da es sich um denselben Code handelt.
Etwas wie
%Vor%ist offensichtlicher, weil cppcheck und der Compiler alle Makros vor tatsächlichen Überprüfungen in-place 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 im Moment hat cppcheck diese Funktion nicht.
Ich bin ein Cppcheck-Entwickler.
Es ist nicht beabsichtigt, dass Cppcheck das nicht erkennt.
Cppcheck wertet zur Zeit Funktionen nicht mit allen gegebenen Parametern aus allen Funktionsaufrufen aus. 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 benutzen.
Die neueste Version von Cppcheck 1.70 dev kann diesen Fehler erkennen:
%Vor%Tags und Links c++ code-analysis static-code-analysis cppcheck