添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
return 0; }

执行命令:valgrind --tool=memcheck --leak-check=full ./1

image
image

1.左边显示类似行号的数字(2847)表示的是 Process ID

2.最上面的红色方框表示的是 valgrind 的版本信息

3.中间的红色方框表示 valgrind 通过运行被测试程序,发现的内存问题。通过阅读这些信息,可以发现:

发生错误时的函数堆栈,以及具体的源代码行号。

非法写操作的具体地址空间。

4.最下面的红色方框是对发现的内存问题和内存泄露问题的总结。内存泄露的大小(4 bytes)也能够被检测出来。

2.内存越界

代码语言: javascript
复制
#include<stdio.h>
#include<stdlib.h>
int main()
int i;
int len = 4;
int *pt = (int*)malloc(len*sizeof(int));
int *p = pt;
for(i=0;i<len;i++)
*p = 5;
return 0;
执行命令:valgrind ./2
==2918== Invalid write of size 4
==2918== at 0x400570: main (2.c:16)
==2918== Address 0x5204050 is 0 bytes after a block of size 16 alloc'd
==2918== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2918== by 0x400545: main (2.c:8)

我们发现valgrind准确的定位了问题,在16行进行非法的写操作。

3.内存覆盖

C 语言的强大和可怕之处在于其可以直接操作内存,C 标准库中提供了大量这样的函数,比如 strcpy, strncpy, memcpy, strcat 等,这些函数有一个共同的特点就是需要设置源地址 (src),和目标地址(dst),src 和 dst 指向的地址不能发生重叠,否则结果将不可预期。

下面就是一个 src 和 dst 发生重叠的例子。在 15中,src 和 dst 所指向的地址相差 20,但指定的拷贝长度却是 21,这样就会把之前的拷贝值覆盖。

代码语言: javascript
复制
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
char x[50];
int i;
for(i=0;i<50;i++)
x[i] = i+1;
strncpy(x+20,x,20);