valgrindでプログラムを実行すると、警告が表示されます。
== 24214 ==警告:malloc()への愚かな引数(-1)
どの呼び出しmalloc()
が間違っているかをどのように判断できますか?再コンパイルせずにこれを行う方法はありますか?
-g
プログラムは(デバッグ)ありとなし-s
(ストリップ)でコンパイルされます。
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
ます。
実際、valgrindは、。を使用しても、この状況のスタックトレースの印刷を拒否しているよう--verbose
です。メーリングリストに書いてください。これにはオプションがあるはずです。そうしないと、診断はそれほど役に立ちません。
の引数malloc
は符号なし型でsize_t
あり、範囲に-1が含まれていないことに注意してください。この状況が意味するのは、実際には、の可能な最大値がsize_t
に渡されたことmalloc
です。
厳密に言えば、これは誤ったAPI呼び出しではありませんが、何かが間違っていることを示している可能性があります。(あなたのプログラムはマルチギガバイトの配列を必要としませんよね?)
そのテキスト「sillyarg」がvalgrind内で呼び出される場所を見つけるかもしれません。デバッガーを起動し、その場で中断します。プログラムを実行し、デバッガープロンプトに戻ったら、mallocと呼ばれる行に到達するまで起動します。
mallocでブレークポイントを実行し、それを条件付きにすることができます。たとえば、argは<0です。
結局、'sを挿入してprintf
、それがvalgrindの前にあるのか後にあるのかを見つけましたprintf
。皆さんが推奨するものよりも派手ではありませんが、他のソリューションを実装しようとするよりも速く機能しました。