Valgrind读取大小为1(sscanf)

时间:2017-06-20 00:38:23

标签: c pointers valgrind scanf

不知何故,Valgrind在我的程序的第一行显示错误:

int main(int argc, char** argv) {
  int i, r;
  sscanf(argv[1], "%d", &r);

  return 0;
}

Valgrind报道:

==18674== Invalid read of size 1
==18674==    at 0x4ECB1A0: rawmemchr (in /usr/lib64/libc-2.23.so)
==18674==    by 0x4EB2F41: _IO_str_init_static_internal (in /usr/lib64/libc-2.23.so)
==18674==    by 0x4EA16C6: __isoc99_vsscanf (in /usr/lib64/libc-2.23.so)
==18674==    by 0x4EA1666: __isoc99_sscanf (in /usr/lib64/libc-2.23.so)
==18674==    by 0x400DE3: main (test_b_arbre.c:18)
==18674==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==18674== 
==18674== 
==18674== Process terminating with default action of signal 11 (SIGSEGV)
==18674==  Access not within mapped region at address 0x0
==18674==    at 0x4ECB1A0: rawmemchr (in /usr/lib64/libc-2.23.so)
==18674==    by 0x4EB2F41: _IO_str_init_static_internal (in /usr/lib64/libc-2.23.so)
==18674==    by 0x4EA16C6: __isoc99_vsscanf (in /usr/lib64/libc-2.23.so)
==18674==    by 0x4EA1666: __isoc99_sscanf (in /usr/lib64/libc-2.23.so)
==18674==    by 0x400DE3: main (test_b_arbre.c:18)

我经历了一些类似的问题,但我没有找到解决方法...... 我如何运行该程序:

valgrind --leak-check=yes --track-origins=yes ./b_arbre 1 2 3 4 5 6

2 个答案:

答案 0 :(得分:1)

您在没有参数的情况下调用它,因此argv[1]是一个空指针。通过提供命令行参数“修复”它。通过检查argc并在其为1时执行其他操作来正确修复它。

答案 1 :(得分:1)

我在64位x86_64 Linux上编译了您的确切程序(在Valgrind输出中看到了64位库的提示)。这个问题没有重现。我得到一个关于sscanf隐含声明不正确的警告,但这是一个红色的鲱鱼。

我也试过64位Power PC Linux。清洁Valgrind也。

(当然,如果在没有参数的情况下调用程序,则会发生空指针取消引用,在这种情况下argv[argc]已完成;但问题被描述为带有参数。)

问题可能是被测试的可执行文件与源代码不匹配。