statische Code-Analyse

(Firma: Torrox.de) #4510152
Lesenswert?

Hallo,
auf der letzten Embedded World Conference wurden statische Code Analyse 
Tools als das Allheilmittel angepriesen.

Meine (zugegeben bereits ca. 10 Jahre alten) Erfahrungen mit solchen 
Tools waren eher ernüchternd. Meiner Meinung nach finden die eher 
Anfängerfehler, liefern jede Menge false positives und haben selbst 
wieder einiges an Bugs, für die man Workarounds braucht.

Nutzt jemand von euch solche Tools wirklich erfolgreich (insbesondere 
mit C++) und würde eins empfehlen?

mfg Torsten
Gast #4510236
Lesenswert?

Dem kann ich mich nur anschliessen.

Was auch geholfen hat, bei einem Projekt erches als Zielplatform 
VxW/PXA270 hatte: Quellcode von Anfang an portabel schreiben. Windriver 
lieferte (damals, zu VxW 6.5/6.7) nur ein GCC 4.2 mit, unser Code 
konnten wir aber auch unter Cygwin und Linux mit neueren GCCs (Clang war 
noch nicht Spruchreif) f. x86 compilieren (auch ausführen :).
Der knapp 10% Mehraufwand f.d. Portabilität hat sich in sauberer 
Programmarchitektur, mehr/schärferen Warnings (die wir nicht stehen 
liessen), mehr UND besseres Fehlerfinden (komfortableres Debugging, 
Laufzeitunterschiede der Plattformen) echt mehrfach bezahlt gemacht.

Zus. CI & Testautomation macht guten, ruhigen Schlaf in der Nacht, JEDE 
Nacht!
:-)


Ich denke statische Codeanalyse funktioniert nur/eher bei bereits 
einigermassen sauberen Programmstrukturen.
Geröllhaldenwracks können solche Tools auch nicht von alleine "heilen".
(Firma: Torrox.de) #4510279
Lesenswert?

Gerd E. schrieb:
> Probier mal den hier aus:
> http://cppcheck.sourceforge.net/

ich habe hier so ein Paradebeispiel, das meiner Meinung nach von jedem 
Tools gefunden werden müsste, wenn es behauptet, statische Code Analyse 
auf C++ machen zu können:
1
#include <vector>
2

3
void f()
4
{
5
    std::vector< int > c = { 1, 2, 3 };
6
    auto pos = c.begin();
7

8
    c.push_back( 4 );  // *1
9

10
    *pos = 0;          // u.b.!
11
}

Da hat CppCheck nix gefunden. Aber für den Preis, ist das akzeptabel ;-)
#4510485
Lesenswert?

Es gab mal vor ein paar Jahren einen Thread dazu:

Beitrag "Statische Codeanalyse für den Hobbyprogrammierer"

Die Nachwirkungen dieses Threads sind bei mir, daß ich alle Projekte, 
die auch für den PC kompilierbar sind, mit dem statischen 
Codeanalysewerkzeug von Clang/LLVM noch einmal gegenteste. Es findet 
wirklich ab und an Sachen, bei denen auch maximale Compilerwarnungen 
nichts gefunden hätten.

Fazit für mich: Es ist ein weiteres nützliches Werkzeug in meinem 
Werkzeugkasten geworden.
(Firma: Torrox.de) #4510654
Lesenswert?

Ingo L. schrieb:
> und ich versteh das Beispiel nichtmal :D

Der Punkt ist, dass `pos` ein Iterator ist, der ungültig werden kann, 
wenn der vector bei *1 an seine Kapazitätsgrenzen kommt und realoziieren 
muss.

Dann wird der vector neuen Speicher anfordern, den Inhalt des vectors in 
den neuen Speicher kopieren und den alten Speicher frei geben. Der 
Iterator wird aber noch in alten Speicher zeigen.

Das "blöde" an dem Fehler ist, dass er nur selten auftreten wird und 
auch bei Tests nicht unbedingt auffallen wird. Bei Code-Reviews sollte 
so etwas auffallen.
#4511026
Lesenswert?

Torsten R. schrieb:
> Oliver S. schrieb:
>> Die Frage war, was Tools kosten, die den Fehler im gezeigten Code
>> finden.
>
> Ich kenne nicht mal ein Tools, dass solche Fehler findet.

Angeblich soll das mit den C++ Core Guidelines und entsprechendem Tool 
gefunden werden. Es gibt dazu einen interessanten Vortrag von Herb 
Sutter: https://www.youtube.com/watch?v=hEx5DNLWGgA

Hier in den Folien 
(https://github.com/isocpp/CppCoreGuidelines/blob/master/talks/Sutter%20-%20CppCon%202015%20day%202%20plenary%20.pdf) 
auf Folie 44 wird quasi genau das gleiche Beispiel gebracht.
#4511029
Lesenswert?

Torsten R. schrieb:
> ich habe hier so ein Paradebeispiel, das meiner Meinung nach von jedem
> Tools gefunden werden müsste, wenn es behauptet, statische Code Analyse
> auf C++ machen zu können:
>
>
1
> #include <vector>
2
> 
3
> void f()
4
> {
5
>     std::vector< int > c = { 1, 2, 3 };
6
>     auto pos = c.begin();
7
> 
8
>     c.push_back( 4 );  // *1
9
> 
10
>     *pos = 0;          // u.b.!
11
> }
12
>


In Deinem Paradebeispiel sollte ein Tool vor allem auch die völlig 
nichtssagenden Kommentare kritisieren. ;-)
(Firma: Torrox.de) #4512235
Lesenswert?

Hallo Sebastian,

Sebastian V. schrieb:

> Angeblich soll das mit den C++ Core Guidelines und entsprechendem Tool
> gefunden werden. Es gibt dazu einen interessanten Vortrag von Herb
> Sutter: https://www.youtube.com/watch?v=hEx5DNLWGgA

super, habe ich mir gerade angeguckt. Microsoft arbeitet offensichtlich 
gerade an einem static analyser, der genau solche Fehler finden kann. 
Spannend :-)

mfg Torsten

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren