21

valgrind に問題があります: これは私のプログラムです (エラーが表示される主要部分):

int main()
{
char comanda[N];
....
char *p;
while( fgets(comanda,100,stdin)!=NULL)
    {
    p=strtok(comanda," \n");
    if (strcmp(comanda,"INIT")==0)
        {
        p=strtok(NULL," ");
        Init(n);        
        }
395 >>if (strcmp(p,"DUMP")==0)
        {
        Dump(n);}
    if (strcmp(p,"ALLOC")==0)
        {
        Alloc(j,n);
        }
    ....return 0;}

そして、valgrind を実行すると、次のように表示されます。

Invalid read of size 1
at 0x401569: main (:395)
Address 0x0 is not stack'd malloc'd or (recently) free'd

このプログラムの何が問題なのかわかりません。

4

2 に答える 2

32

読み方:

サイズ 1 の無効な読み取り

あなたのプログラムは、Valgrind が気に入らない場所から 1 バイトを読み取ろうとしています。

0x401569: メイン (:395)

コード内でこれが発生する場所 (明らかに strcmp がインライン化されています)

アドレス 0x0 は、スタックされていない、malloc されていない、または (最近) 解放されていない

読み取っていたアドレス - 0x0 は「NULL」です。ステートメントの残りの部分は、それが無効である理由を示しているだけです (スタックからのものではなく、malloc から取得したものではなく、最近解放されていません)。「最近」が言及されているのは、valgrind が解放されたメモリを限られた数の解放のために追跡しているためです。このようなメッセージが表示された場合、何年も前に解放されたために無効になった可能性があります。アドレスはゼロではありません (またはゼロに近い)。

于 2012-12-28T09:58:45.250 に答える
7

strtokトークンが残っていない場合、NULLを返す可能性があります。

NULLを渡すstrcmpと、そこでNULLを参照解除するため、未定義の動作になります。

于 2012-12-28T09:38:21.437 に答える