Wenn cppcheck über diesen Code ausgeführt wird, [1] es beschwert sich über ein Fehler:auf eine nicht-triviale Bool Szenario in C Stolper ++
void bool_express(bool aPre, bool aX, bool aPost)
{
bool x;
const bool pre = aPre;
if (pre) {
x = aX;
}
const bool post = aPost;
// error checking passage of the original code:
if (!pre || !x || !post) {
if (!pre) {
trace("pre failed");
} else if (!x) { // <-- HERE Cppcheck complains
trace("x failed");
} else {
trace("post failed");
}
} else {
// success passage of the original code:
trace("ok");
}
}
Dies ist die Botschaft, das macht mich nervös:
Id: uninitvar
Summary: Uninitialized variable: x
Message: Uninitialized variable: x
Ich denke, es ist ein falsches positives, aber ich gebe zu, dass dies nicht offensichtlich sein kann. Trotzdem möchte ich diesen Code nicht anfassen, weil er alt und viel schwerer ist als diese extrahierte Version.
Haben Sie schon einmal Situationen wie diese erlebt? Wie man damit umgeht?
[1] Dieser Code auf seine Knochen reduziert wird, stellt der ursprüngliche Code Voraussetzung (pre
), tut etwas (x
), dann eine Nachbedingung zwingt (post
), nach, dass einige Bedingungen Fehler sind überprüft. Ich habe die Laufzeit-Ergebnisse der aufgerufenen Funktionen transformiert und dann in pre
, x
und post
in die 3 Argumente meines Testfalls geschrieben.
sagen wir Klockworks für statische Code-Analyse verwenden, und es zeigt den Fluss, in der 'x 'wird nicht initialisiert verwendet, wenn Cppcheck diese Option hat und vielleicht etwas anderes fehlt, obwohl es für mich wie ein falsches Positiv aussieht – ZivS
Hast du sichergestellt, dass die reduzierte Version immer noch die CppCheck Warnung erzeugt? – nwp
Wie wäre es, wenn Sie 'x' einfach auf false initialisieren? Ich kann mir kein realistisches Szenario vorstellen, in dem das explodieren würde. – nwp