3

私は amd64 アーキテクチャを使用しています。次のコードは、「if」ステートメントで g++ コンパイラによって拒否されます。

void * newmem=malloc(n);
if(newmem==0xefbeaddeefbeadde){

エラーメッセージとともに:

error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

それを実行するために必要な魔法の呪文が見つからないようです (そして -fpermissive を使いたくありません)。どんな助けでも感謝します。

背景: STL の新しい操作でメモリを要求しているときにプログラムがクラッシュする醜いバグを探しています (少なくとも gdb はそう言ってくれました)。OS がプログラムのメモリ リストを管理するために使用するメモリに隣接している、割り当てられたメモリ チャンクの 1 つのメモリ オーバーランである可能性があると考えて、私はすぐに new() を上書きし、独自のルーチンを使用して new() に加えて、対応する削除を行いました。メモリフェンシングを追加しました。アプリケーションがまだクラッシュしている間 (すべてのフェンスは無傷 (ため息))、gdb は次のように教えてくれました:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000604f5e in construct (__val=..., __p=0xefbeaddeefbeadde, this=<optimized out>)
at /usr/include/c++/4.6/ext/new_allocator.h:108
108           { ::new((void *)__p) _Tp(__val); }

ポインター__pの値は、メモリ フェンス (0xdeadbeef) の 1 つに使用した値のポインター表現であることに注意してください。プログラム。

追加の注意: クラッシュする関数は、クラッシュする前に数百万回問題なく実行されます (すべて数千回から数百万回実行される数十の他のルーチンと混在しています)。プログラムがクラッシュするまでに 6 時間と 11 Gb かかります。

4

3 に答える 3

2

1 つは整数で、もう 1 つはポインターです。おそらく醜いキャストでいいだろう

if(newmem==(void*)0xefbeaddeefbeadde){
于 2012-07-07T11:06:46.550 に答える
1

あなたの質問のために:あなたには2つのオプションがあります-ポインタを64ビットの数値にキャストするか、数値をにキャストしますvoid*


背景:これには時間がかかりすぎるため、メモリリークが発生している可能性があります。だから、試してみてくださいvalgrind-クラッシュを待つ必要はありません。プログラムを実行しvalgrindて適切なオプションを使用するだけです。valgrind未定義の動作をキャッチするのにも役立ちます。

もう1つのこと--O0最適化レベルとデバッグシンボルの最大レベルでプログラムをコンパイルします- -ggdb3。また、実行可能ファイルがコアダンプを生成しない場合、このエラーが発生したときに生成させます。次に、エラーをキャッチするためにさまざまなアプローチを試みている間、それを機能させたままにします。

成功しなかった場合は、少なくとも(うまくいけば)素晴らしいコアダンプがあり、それをで調べることができますgdb your_exe the_core_dump。次に、コアをフレームごとに監視し、変数などを監視します。

メモリリークでない場合は、どこかでのメモリ破損、未定義動作などの可能性があります。適切なコアダンプが生成されれば、おそらくエラーが発生します。または、少なくとも、それはあなたに事件についての有用な情報を与えるかもしれません。

もう1つ、コアダンプを生成する場合(それが良いか悪いかに関係なく)、ダンプのサイズが役立つ可能性があります。大きすぎる場合(「大」の定義はプログラムによって異なります)、メモリリークが発生している可能性があります(スマートポインタを使用している場合は、何らかの相互参照の問題である可能性があります。その場合、valgrindキャッチされません。それ)

于 2012-07-07T11:16:22.580 に答える
0

それはおそらくそのようには機能しません。次回プログラムを実行するときに、mallocその値を返すことはありません。newの戻りをチェックするだけでなく、他にやらなければならないことがあります。

于 2012-07-07T11:37:55.817 に答える