Suchen Sie nach Aufrufen von typisierten Funktionen, die den Rückgabewert nicht prüfen

Ich möchte ein Tool, um C / C++ zu parsen (andere willkommen, insbesondere PHP, aber C / C++ == Priorität) und Aufrufe von typisierten Funktionen zu finden, die den Rückgabewert nicht überprüfen.

Ich sehe keine g++-Option (hat MS eine solche Option).

Vielleicht so etwas wie Splint ? Oder gibt es eine IDE, mit der ich das überprüfen kann? GUI- und CLI-Lösungen sind beide willkommen.

Vorzugsweise Linux, aber Windows ist akzeptabel.

Muss kostenlos sein.

Irgendwelche Ideen?

Was meinst du mit Rückgabewert prüfen ? Verwenden Sie es in einem Prädikat? Was ist der Anwendungsfall dafür?
Ich meine, dass eine Funktion einen Wert zurückgibt, sagen wir Erfolg/Fehlschlag, und der Aufrufer macht sich nicht die Mühe, diesen Wert zu überprüfen und entsprechend zu handeln (geht nur von Erfolg aus).
Dann bestehen Sie darauf, dass das Ergebnis in einem Prädikat verwendet wird. Warum ist Steves Antwort in diesem Fall die "richtige"?
Damit bin ich gegangen. Fühlen Sie sich frei, eine weitere Antwort zu posten. Ich würde die Antwort nach hinten verschieben, wenn Ihr Beitrag eine bessere Lösung bietet.
Bei SR soll es um gute Empfehlungen gehen, die zu den Anforderungen passen. Ich habe nicht das Gefühl, dass Ihre Wahl den von Ihnen angegebenen Anforderungen entsprach. Nein, ich habe keine andere Antwort mit den von Ihnen angegebenen Einschränkungen.
Also, bitte helfen Sie mir zu verstehen? Soll ich es unbeantwortet lassen? Vielleicht hilft das in Zukunft anderen. So wie es ist, habe ich das Gefühl, dass dies meine Frage beantwortet - was lässt Sie glauben, dass dies nicht der Fall ist? Ich denke, dass ich hier etwas lernen könnte. Danke, Steve.
Wie kann eine Antwort, die Ihre Anforderung "überprüft den Rückgabewert" nicht erfüllt, eine Antwort sein? Ja, ich hätte es als unbeantwortet markiert gelassen. Ja, Steves Antwort ist wahrscheinlich nützlich, nur nicht vollständig in Bezug auf Ihre Anforderungen, daher würde ich sie nicht löschen oder ablehnen.
Entschuldigung, Ira, ich muss total dumm sein, aber ich verfehle Ihren Punkt völlig. Ich habe Code gelesen, viele Stellen gefunden, an denen ein Rückgabewert nicht überprüft wurde, z. B. ein Aufruf von malloc()und der Code wurde fortgesetzt, als ob er erfolgreich wäre. Meiner Meinung nach hilft mir Steves Vorschlag, das zu erkennen, wie in dem Beispielcode, den ich als Antwort gepostet habe. Ich habe das schreckliche Gefühl, dass wir "aneinander vorbeireden" - was übersehe ich?
Vielleicht verstehen Sie das Wort "Prädikat" nicht? Ihre Anfrage scheint für ein Tool zu sein, das für eine Wert zurückgebende Funktion foo überprüft, dass jede Verwendung von foo dem folgenden Code entspricht: [[x=foo(...); ... if (...x...) ... ]] where ... bedeutet "beliebiger Code, der x nicht beeinflusst". Steves Antwort bewältigt bestenfalls die Erkennung, dass jede Verwendung von foo äquivalent zu [[x=foo(...);]] ist; es ist kein Test von x erforderlich. Die sehen bei mir ganz anders aus.
Ich sehe es jetzt, tut mir leid, dass ich so schwach war. vielleicht hilft ein guter Linter. Steves Antwort hilft sicherlich ein wenig, und in der Praxis habe ich noch keinen Fall gefunden, in x = foo()dem x während der Codeüberprüfung nicht getestet wurde (aber es ist die Art von Code, bei der es mich nicht überraschen würde, das zu sehen, leider: - (Danke für die Klarstellung. Ich überlasse Steve die Antwort, bis etwas Besseres kommt.
Alles, was dies tun wird, ist, die Person mit der richtigen Antwort davon abzuhalten, sie zu geben; schließlich haben Sie bereits das falsche gewählt. (Dies soll nicht „gegen“ Steve sein, sondern nur gegen das Markieren der falschen Antwort.)
Ok, ich stimme zu. Da @Steve 10,5k hat, nehme ich nicht an, dass er verärgert sein wird, wenn ich die Antwort nicht bewerte ,-) Mal sehen, ob jemand eine bessere Antwort findet. Ich bin ziemlich überrascht, dass noch niemand einen Linter erwähnt hat

Antworten (2)

In gcchaben Sie folgende Möglichkeiten:

-Wunused-result Warnt, wenn der zurückgegebene Wert nicht verwendet wird -Wunused , warnt vor einer Reihe von nicht verwendeten Fällen und -Wall(mein Favorit) schaltet eine Reihe von Warnungen ein, einschließlich -Wunused-result

Eine vollständige Liste der gcc-Warnoptionen finden Sie hier .

Sie können auch Funktionsattribute verwenden , warn_unused_resultum eine Warnung zu generieren, wenn ein bestimmter Funktionsrückgabewert nicht verwendet wird.

Und gccist natürlich kostenlos.

Ich weiß nicht, wie ich das verpasst habe. Auch für g++ ? Nur -Wunused-result oder muss ich __attribute__((warn_unused_result zur ecey-Funktionsdeklaration?
Ich würde es einfach versuchen - die meisten gcc-Flags gelten auch für g++
Ich poste eine Antwort, weil ich Code in einem Kommentar nicht formatieren kann. Natürlich gebe ich Ihnen die Antwort und eine positive Bewertung und meinen Dank.
"Nicht verwendet" impliziert sicherlich "nicht überprüft", aber es scheint nur eine kleine Teilmenge zu sein.

Seltsamerweise funktionierten weder -Wunused-result noch -Wall in g++ v4.6.3. Das von Steve vorgeschlagene Funktionsattribut tat dies jedoch.

int GenerateRandomNumber() __attribute__((warn_unused_result));

int GenerateRandomNumber()
{
   return 4;
}

int main()
{
    GenerateRandomNumber();

    return 0;
}

ergibt sich

**** Build der Konfiguration Debug für Projekt used_return_value ****

alles erstellen Baudatei: ../src/unused_return_value.cpp Aufruf: GCC C++ Compiler g++ -O0 -g3 -pedantic -Wall -c -fmessage-length=0 -Wunused-result -MMD -MP -MF"src/unused_return_value. d" -MT"src/unused_return_value.d" -o "src/unused_return_value.o" "../src/unused_return_value.cpp" ../src/unused_return_value.cpp: In Funktion 'int main()': .. /src/unused_return_value.cpp:10:24: warning: ignoring return value of ‘int GenerateRandomNumber()’, declared with attribute warn_unused_result[-Wunused-result] Fertiges Bauen: ../src/unused_return_value.cpp Bauziel: unused_return_value Aufruf: GCC C++ Linker g++ -o "unused_return_value" ./src/unused_return_value.o Fertiges Gebäudeziel: ungebrauchter_Rückgabewert

**** Fertig gebaut ****

Ich könnte das Attribut in ein #define packen.

Ich dränge auch stark darauf, die Option "Warnungen als Fehler behandeln" zu verwenden. Ich bin fest davon überzeugt, dass jeder, der einen Compiler erstellen kann, mehr über die Sprache weiß als ich (ich hatte Probleme mit dem Drachenbuch) und daher nie verstehen kann, wenn Leute mit den Schultern zucken und sagen: "Es ist nur eine Warnung".

Ich werde auch darauf drängen, einen Linter zu verwenden. Und damit der Code Compiler- und Linter-warnfrei ist, bevor der Code überprüft wird (Ergebnisse von beiden sind mit dem Code einzureichen) und vor der Freigabe zur Versionskontrolle.

Danke, Steve!

Mawg - Ich persönlich würde sagen, dass es nicht der beste Weg ist, Leute daran zu hindern, Dinge unter Versionskontrolle zu stellen, weil sie immer noch Warnungen / Flusenfehler haben, da dies dazu führen kann, dass Leute die Versionskontrolle nicht verwenden - halten Sie sie auf einem Zweig, bis die Qualitätskriterien erfüllt sind getroffen, dann auf den Kofferraum zulassen, könnte ein besserer Weg sein.