2

これは起こりえますか?3 つのアサート。アクティブ化する必要があります。

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

プログラムが g++ 3.4.4 でアサートを有効にしない場合がありますか。

いいえ、アサートがアクティブにならない場合に番号を出力するためにコードを変更する可能性はありません。

何か案は?

編集:いくつかのコメントを読んだ後、私は編集を余儀なくされました。コードを表示しますか?なぜあなたはこの愚かなことをしているのですか?信じられない!どこで使用されますか?私の質問から、考えられる理由がいくつかあるため、コードを投稿/変更しないことは明らかでした。

  • 私は完全な初心者であり、コードを恥じています (そこに犯罪はありません。投稿した場合、質問への回答がはるかに簡単になります)
  • ほんの少しの情報で友人を助けるように頼まれました (そして、返された番号を確認できない理由や、単にブレークポイントを追加できない理由を彼に尋ねませんでした)。
  • 私はコンパイラを使用せずにemacsでコードを書いており、それをコンパイルして実行し、何か問題が発生した場合にのみ失敗したアサートを返すことができるリモートサーバーに送信しています。

私がいたずらやデマを作っていると信じているなら、代わりにスレッドの閉鎖に投票するべきでした. 私はそれで完全に大丈夫だったでしょう。しかし、このような不要なコメントを追加すると、「態度」フラグを実装したくなるだけでした。

実際に私の質問を説明しようとし、答えてくれたコメントと回答に対して、他の人に感謝したいと思います。

4

7 に答える 7

14

assertNDEBUGマクロが定義されている場合はチェックを外します。#undef NDEBUGこの翻訳単位をコンパイルするときは、必ず確認してください。

スイッチを使用して gcc を呼び出し-Eて、assert ステートメントがまだコード内にあることを確認できます。

于 2009-07-18T21:43:34.743 に答える
13

私の人生で非常に醜いものを見てきましたが、それは perform_calc() がスタック内の戻りアドレスを上書きするバッファ オーバーランを持っている場合に説明できます。関数が終了すると、上書きされたアドレスがスタックから復元され、現在の PC に設定され、プログラムの別の領域でおそらくアサーション呼び出しを超えてジャンプします。

これは非常に遠い可能性ですが、それがあなたが示していることです。

別の可能性としては、誰かが醜いマクロ トリックを行った可能性があります。次のようなものがあるかどうかを確認してください

#define assert 

または、トイレにいる間に同僚がヘッダーにこのようなものを入れました

#define < ==
#define > ==

別の回答で示唆されているように、 gcc -E でチェックして、実際にコンパイルされたコードを確認してください。

于 2009-07-18T21:45:24.240 に答える
5

そもそもそのコードは正しいようには見えません。デバッグがオンの場合(DEBUGおよび/または_DEBUGが設定され、NDEBUGが設定解除されている):

assert( nr == 0);

上記の行は、nr!= 0の場合にexit()を呼び出します。したがって、この行が通過すると、2番目のアサートが実行されます。

assert( nr > 0);

...そして、nr == 0および!(nr> 0)であるため、exit()を呼び出します。

assert( nr < 0);

そして、この3行目はまったく実行されません。

正確には、このコードのポイントは何ですか?そして、なぜ、これらのアサートを追加できるのであれば、代わりにprintf()を追加できないのでしょうか。

于 2009-07-18T21:52:36.130 に答える
5

このコードはマルチスレッドですか? 競合状態になっている可能性があります。

于 2009-07-18T21:57:34.233 に答える
4

そして、番号を印刷するためにコードを変更する可能性はありません。

変。明らかに、assert()ステートメントを挿入する機能があります。これは、それらが実際に実際のコードに含まれていると、触れることができず、コードが機能しない可能性があるためです。では、assert()がtestを呼び出す値を出力できないのはなぜですか?

于 2009-07-18T21:49:42.610 に答える
1

コードフラグメントをサニタイズしているときに、誤って問題を解決したと思われます。より多くのコードがある(そしてnrがアサーション間で変更されている)か、実際にはそのように見えません(または、rlbondごとに、アサーションがオンになっていない)。

あまりサニタイズされていないコードセグメントを投稿してみて、うまくいかないか見てみましょう。

于 2009-07-18T21:50:16.150 に答える
-3

それはNaNでしょうか?その場合、次のアサートは失敗します。

assert( nr == nr );
于 2009-07-18T21:48:19.400 に答える