Valgrind 缺失错误 [英] Valgrind missing error

查看:31
本文介绍了Valgrind 缺失错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

(原帖在这里)

考虑以下明显有缺陷的程序:

Consider the following clearly buggy program:

#include <string.h>

int main()
{
  char string1[10] = "123456789";
  char *string2 = "123456789";

  strcat(string1, string2);
}

并假设编译它:

gcc program.c -ggdb

并在其上运行 valgrind:

and run valgrind on it:

valgrind --track-origins=yes --leak-check=yes --tool=memcheck --read-var-info=yes  ./a.out

在结果中,没有显示错误:

In the result, no error is shown:

==29739== Memcheck, a memory error detector
==29739== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==29739== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==29739== Command: ./a.out
==29739== 
==29739== 
==29739== HEAP SUMMARY:
==29739==     in use at exit: 0 bytes in 0 blocks
==29739==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==29739== 
==29739== All heap blocks were freed -- no leaks are possible
==29739== 
==29739== For counts of detected and suppressed errors, rerun with: -v
==29739== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

我错过了什么?

推荐答案

它没有报告任何错误,因为您使用的是 memcheck,它不执行对全局或堆栈数组的检查,它只执行堆数组的边界检查和释放后使用检查.所以在这种情况下,你可以使用 valgrind SGCheck 来检查堆栈数组:

It did not report anything wrong because you were using memcheck, which does not perform check on global or stack arrays, it only perform bounds checks and use-after-free checks for heap arrays. So in this case, you can use valgrind SGCheck to check stack arrays:

valgrind --tool=exp-sgcheck ./a.out

它确实为我报告了错误.

It indeed report the error for me.

有关更多信息,请参阅 sgcheck 文档:

For more information, refer the sgcheck docs:

http://valgrind.org/docs/manual/sg-manual.html

添加日志:

$ valgrind --tool=exp-sgcheck ./a.out
==10485== exp-sgcheck, a stack and global array overrun detector
==10485== NOTE: This is an Experimental-Class Valgrind Tool
==10485== Copyright (C) 2003-2015, and GNU GPL'd, by OpenWorks Ltd et al.
==10485== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==10485== Command: ./a.out
==10485==
==10485== Invalid read of size 1
==10485==    at 0x4C2A374: strlen (h_intercepts.c:131)
==10485==    by 0x4E9DD5B: puts (in /usr/lib64/libc-2.22.so)
==10485==    by 0x4005C8: main (v.c:11)
==10485==  Address 0xfff00042a expected vs actual:
==10485==  Expected: stack array "string1" of size 10 in frame 2 back from here
==10485==  Actual:   unknown
==10485==  Actual:   is 0 after Expected
==10485==
==10485== Invalid read of size 1
==10485==    at 0x4EA9BA2: _IO_default_xsputn (in /usr/lib64/libc-2.22.so)
==10485==    by 0x4EA7816: _IO_file_xsputn@@GLIBC_2.2.5 (in /usr/lib64/libc-2.22.so)
==10485==    by 0x4E9DDF7: puts (in /usr/lib64/libc-2.22.so)
==10485==    by 0x4005C8: main (v.c:11)
==10485==  Address 0xfff00042a expected vs actual:
==10485==  Expected: stack array "string1" of size 10 in frame 3 back from here
==10485==  Actual:   unknown
==10485==  Actual:   is 0 after Expected
==10485==
123456789123456789
==10485==
==10485== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

这篇关于Valgrind 缺失错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆