Frage

Kann das jemals passieren?3 gibt an, wo man aktivieren soll.

int nr = perform_calc();
assert( nr == 0);
assert( nr > 0);
assert( nr < 0);

Kann es vorkommen, dass das Programm die Asserts unter G++ 3.4.4 nicht aktiviert?

Und nein, ich habe nicht die Möglichkeit, den Code zu ändern, um die Nummer auszudrucken, falls die Asserts nicht aktiviert werden.

Irgendwelche Ideen?

Bearbeiten:Nachdem ich mehrere Kommentare gelesen hatte, musste ich sie bearbeiten.Code anzeigen?Warum machst du diese dumme Sache?Ich glaube es nicht!Wo wird es verwendet?Aus meiner Frage hätte klar hervorgehen müssen, dass ich den Code aus mehreren möglichen Gründen nicht veröffentlichen/ändern werde:

  • Ich bin ein absoluter Anfänger und schäme mich für den Code (das ist kein Verbrechen, es macht die Beantwortung der Frage sicher viel einfacher, wenn ich ihn gepostet hätte)
  • Ich wurde gebeten, einem Freund mit nur wenigen Informationen zu helfen (und nein, ich habe ihn nicht gefragt, warum Sie die zurückgegebene Nummer nicht überprüfen können oder warum er nicht einfach einen Haltepunkt hinzufügen kann).
  • Ich schreibe meinen Code in Emacs ohne Compiler und sende ihn an einen Remote-Server, der ihn kompiliert, ausführt und nur dann fehlgeschlagene Asserts zurückgeben kann, wenn etwas schief geht.

Wenn Sie geglaubt hätten, dass ich einen Streich oder eine Falschmeldung mache, hätten Sie stattdessen für die Schließung des Threads stimmen sollen.Damit wäre ich völlig einverstanden gewesen.Aber das Hinzufügen unnötiger Kommentare wie dieser hat in mir nur den Wunsch geweckt, dass ein „Einstellungs“-Flag implementiert wird.

Ich möchte anderen für ihre Kommentare und Antworten danken, die tatsächlich versucht haben, meine Frage zu erklären und zu beantworten.

War es hilfreich?

Lösung

Da ich in meinem Leben so hässliche Dinge gesehen habe, könnte es eine Erklärung dafür sein, dass perform_calc() einen Pufferüberlauf hat, der die Rücksprungadresse im Stapel überschreibt.Wenn die Funktion endet, wird die überschriebene Adresse vom Stapel wiederhergestellt und auf den aktuellen PC gesetzt, was zu einem Sprung möglicherweise in einen anderen Bereich des Programms führt, offenbar über die Assertionsaufrufe hinaus.

Obwohl dies eine sehr entfernte Möglichkeit ist, zeigen Sie es doch.

Eine andere Möglichkeit wäre, dass jemand einen hässlichen Makro-Trick gemacht hat.Überprüfen Sie, ob Sie Dinge wie haben

#define assert 

oder ein Kollege hat so etwas in eine Kopfzeile geschrieben, während Sie auf der Toilette waren

#define < ==
#define > ==

Überprüfen Sie, wie in einer anderen Antwort vorgeschlagen, mit gcc -E, welcher Code tatsächlich kompiliert wird.

Andere Tipps

assert ist nicht aktiviert, wenn das Makro NDEBUG definiert ist. Stellen Sie sicher, dass Sie #undef NDEBUG wenn diese Übersetzungseinheit kompiliert wird.

Sie können gcc mit dem -E Schalter aufrufen, um zu überprüfen, dass Ihre assert-Anweisungen noch im Code sind.

Es sieht nicht so aus, dass Code in erster Linie richtig ist. Wenn das Debuggen auf (DEBUG und / oder _DEBUG gesetzt und NDEBUG ist nicht gesetzt):

assert( nr == 0);

Die obige Zeile ruft exit (), wenn nr = 0. Wenn also diese Linie verläuft, wird die zweite assert ausführen:

assert( nr > 0);

... Und Aufruf exit (), weil nr == 0 und! (Nr> 0).

assert( nr < 0);

Und diese dritte Linie wird überhaupt nicht ausgeführt werden.

Was genau ist der Punkt dieses Codes? Und warum, wenn diese behauptet hinzugefügt werden könnte, könnten Sie nicht stattdessen eine printf () hinzufügen?

Ist dieser Code multithreaded? Vielleicht haben Sie eine race condition .

  

Und nein, ich habe nicht die Möglichkeit,   Ändern Sie den Code, um das drucken   Nummer aus ..

Seltsam. Sie haben offensichtlich die Fähigkeit, die assert () Anweisungen einzufügen, denn wenn sie tatsächlich in realen Code waren konnte man nicht berühren, könnte der Code unmöglich funktionieren. Also, warum können Sie nicht den Wert der assert drucken () ruft Test?

Ich vermute, Sie haben versehentlich das Problem beseitigt, während das Codefragment Desinfizieren. Es gibt entweder mehr Code (und nr wird immer geändert zwischen behauptet) oder es sieht nicht wirklich so (oder, je rlbond, Sie haben nicht assert eingeschaltet).

Versuchen Sie, ein weniger hygienisiert Code-Segment veröffentlichen, und mal sehen, ob wir es nicht funktionieren können aus.

Könnte es ein NaN sein? In diesem Fall würde die folgende Assertion fehlschlagen:

assert( nr == nr );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top