Wir verwenden den Parasoft C ++ Test , um unseren Code statistisch zu analysieren. Es hat Probleme mit Code wie dem folgenden:
%Vor% Er warnt bei der *x;
-Zeile, dass:
Auf freigegebenen Speicher sollte unter keinen Umständen nachträglich zugegriffen werden
Irgendwie kommt man zu dem Schluss, dass der Kontrollfluss in den Block catch(...)
übergehen, x
löschen, hinter den throw;
gehen und ihn zu *x;
machen kann. Ich habe throw std::exception("");
und ein paar andere ausprobiert und das gleiche bekommen. Parasoft kennt sicherlich Ausnahmen und integriert sie in seinen Kontrollfluss, da es viele andere Tests gibt, die eine Ausnahmeprüfung beinhalten. Ist es in diesem Fall nur verwirrt, oder gibt es tatsächlich einen Weg für die Ausführung dieses Programms, um sowohl delete x;
als auch *x;
zu treffen?
Also das Werkzeug ist falsch (es wurde schon gesagt, ich weiß), und ich nehme an, Sie wollen nicht von der Warnung schalten.
Ich stimme @ Pascals Kommentar zu, dass es etwas gefährlich ist, Code umzuschreiben, nur um einige Einschränkungen des Tools zu umgehen. Was Sie tun können, ist dieses Warining nur für die Dateien zu deaktivieren, in denen Sie dieses Problem haben.
Dann haben Sie eine Warnung, die kostenlos ist, um zu beginnen, ohne ein Werkzeug zu sagen, um vorhandenen gültigen Code neu zu schreiben.
Für neuen Code müssen Sie einen Stil übernehmen, der vom Tool verstanden wird. Dies ist weniger ein Problem, da es sich um Code handelt, an dem Sie gerade arbeiten. Daher wäre es weniger problematisch, wenn Sie es leicht umschreiben müssen, um Warnungen loszuwerden.
Obwohl korrekt, ist der bestehende Stil nicht ideal.
Ich würde empfehlen, Zeiger wie x
in auto_ptrs zu speichern. Dadurch wird der Inhalt von auto_ptr automatisch gelöscht, wenn er außerhalb des Gültigkeitsbereichs liegt - es sei denn, Sie entfernen ihn explizit aus auto_ptr. Dies ist viel einfacher für die Augen und dokumentiert auch, dass diese Funktion den Besitzer des Mauszeigers übernimmt.
Ich würde erwarten, dass ParaSoft mit diesem Code keine Probleme haben wird.
Vielleicht ist das ein dämlicher Vorschlag, aber was sagt Parasoft, wenn Sie den Haken für das Ende lassen? Ie.
%Vor%Mir ist klar, dass dies möglicherweise nicht für alle Kombinationen von Anweisungen und Ausnahmen funktioniert, zum Beispiel wenn Sie mehrere Ausnahmetypen in verschiedenen Phasen von foo unterscheiden müssen, aber zumindest kann es Ihnen den Beginn einer Problemumgehung geben wirklich wollen die Warnung loswerden.
Schnellupdate:
1) Die oben erwähnte Regel ist überhaupt keine Flussanalyse-Regel. Davon abgesehen wurde die Regel (ID MRM-31) in C ++ Test 9.2.0 und höher verbessert. Dazu gibt es in C ++ Test (ID: BD-RES-FREE) auch eine entsprechende Flow-Analyse-Regel, die tun sollte, was Sie wollen.
Tags und Links c++ exception static-analysis control-flow parasoft