web-dev-qa-db-ja.com

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

私は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

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

17
user1934103

これの読み方:

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

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

0x401569:メイン(:395)

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

アドレス0x0は、スタックされたり、mallocされたり、(最近)解放されたりしません

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

28
Mats Petersson

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

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

6
codaddict