2012-12-28 50 views
10

我在与Valgrind的一个问题: 这是我的节目(以及在错误出现的主要部分):Valgrind的:大小的无效读出的1

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 

我想不出有什么用此程序的问题。

+2

在'strtok'之后检查'p'是否为NULL。 – DCoder

+0

在调试器下运行程序以确定他们做错了什么也可能是一个好主意。 –

+2

此处不需要调试器,valgrind正是在这里说明发生了什么。 @ user1934103,请阅读它告诉你的内容。在它指示的地方,什么地址可以是'0x0'?所以它告诉你'p'是'0'。 –

回答

5

strtok有可能在没有剩余的标记时返回NULL。

当您将NULL传递给strcmp时,这是一个未定义的行为,因为您在那里取消了引用NULL。

22

如何阅读本:

尺寸1

你的程序正试图从某处读取一个字节是Valgrind的不喜欢的无效读取。

在0x401569:主(395)

凡出现这种情况的代码(显然STRCMP已经被内联)

地址0x0不stack'd malloc分配或(最近)free'd

它读取的地址 - 0x0是“NULL”。声明的其余部分只是说它为什么无效(它不是来自堆栈,它不是来自malloc,最近也没有被释放)。之所以提到“最近”,是因为valgrind跟踪释放的数量有限的释放内存,所以它不能肯定地说它没有释放一百万次释放 - 在这种情况下,它不是,但如果你看到这样的消息,它可能会因为它在很久以前被释放而变得无效。地址不会为零(或接近于零)。