【问题标题】:Valgrind: Invalid read of size 1Valgrind:大小为 1 的无效读取
【发布时间】:2012-12-28 09:34:23
【问题描述】:

我遇到了 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

我不知道这个程序有什么问题。

【问题讨论】:

  • 检查pstrtok 之后是否为NULL
  • 在调试器下运行程序以确定它们做错了什么也是一个好主意。
  • 这里不需要调试器,valgrind 准确地说明了这里发生了什么。 @ user1934103,请阅读它告诉你的内容。 0x0 在它所指示的地方可能是什么地址?所以它告诉你p0

标签: c pointers valgrind


【解决方案1】:

如何阅读:

大小为 1 的读取无效

你的程序正试图从 Valgrind 不喜欢的地方读取一个字节。

在 0x401569: 主要 (:395)

在代码中发生这种情况(显然 strcmp 已被内联)

地址 0x0 没有被堆栈 malloc'd 或(最近)free'd

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

【讨论】:

    【解决方案2】:

    当没有更多令牌时,strtok 可能返回 NULL。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 2017-11-17
      • 2020-09-30
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      相关资源
      最近更新 更多