1

valgrindでプログラムを実行すると、警告が表示されます。

== 24214 ==警告:malloc()への愚かな引数(-1)

どの呼び出しmalloc()が間違っているかをどのように判断できますか?再コンパイルせずにこれを行う方法はありますか?

-gプログラムは(デバッグ)ありとなし-s(ストリップ)でコンパイルされます。

4

5 に答える 5

1

Valgrindバージョン3.2.1を使用した比較的旧式のRedHatLinuxで少し実験した後、より正確な警告は生成されないようです。さらに、Mac OS X10.7.3上のValgrind3.7.0でさえ、誤った呼び出しを識別するためのより良い仕事をしません。

テストコード:

#include <stdlib.h>
#include <stdint.h>
int main(void)
{
    int   l = -1;
    char *x = malloc(l);
    return (uintptr_t)x & 1;
}

したがって、valgrind役に立たないので、おそらくプログラムでデバッガーを使用することになり、への呼び出しを中断しますmalloc()—引数が。に等しい場合は条件付きで中断し(size_t)-1ます。

于 2012-04-23T01:20:19.597 に答える
1

実際、valgrindは、。を使用しても、この状況のスタックトレースの印刷を拒否しているよう--verboseです。メーリングリストに書いてください。これにはオプションがあるはずです。そうしないと、診断はそれほど役に立ちません。

の引数mallocは符号なし型でsize_tあり、範囲に-1が含まれていないことに注意してください。この状況が意味するのは、実際には、の可能な最大値がsize_tに渡されたことmallocです。

厳密に言えば、これは誤ったAPI呼び出しではありませんが、何かが間違っていることを示している可能性があります。(あなたのプログラムはマルチギガバイトの配列を必要としませんよね?)

于 2012-04-23T01:25:37.923 に答える
0

そのテキスト「sillyarg」がvalgrind内で呼び出される場所を見つけるかもしれません。デバッガーを起動し、その場で中断します。プログラムを実行し、デバッガープロンプトに戻ったら、mallocと呼ばれる行に到達するまで起動します。

于 2012-04-23T01:17:34.733 に答える
0

mallocでブレークポイントを実行し、それを条件付きにすることができます。たとえば、argは<0です。

于 2012-04-23T01:13:40.090 に答える
0

結局、'sを挿入してprintf、それがvalgrindの前にあるのか後にあるのかを見つけましたprintf。皆さんが推奨するものよりも派手ではありませんが、他のソリューションを実装しようとするよりも速く機能しました。

于 2012-04-23T03:24:30.477 に答える