admin管理员组

文章数量:1130349

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn/SoaringLee_fighting/article/details/78200013

###Date: 2017/10/15

###Author:SoaringLee

Valgrind工具检测内存错误

      Valgrind是一个检测内存问题的开源工具,可以用于检测linux下应用程序的内存泄漏问题。但是对于静态数组越界的问题,valgrind是检测不出来的,对于这个问题,可以采用converity静态检查。这个工具对于内存泄漏诊断非常有用,特整理下面相关问题。

1、内存泄漏

1.1  错误提示        are definitely lost in loss
1.2  C源代码mem_leak.c

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char* p = ( char*) malloc( 20);
  6. }
  7. int main()
  8. {
  9. memcheck();
  10. return 0;
  11. }

1.3 使用命令


1.4 检测结果


2、文件指针资源泄漏 2.1 错误提示   FILE DESCRIPTORS:4 open at exit
2.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void fopencheck()
  4. {
  5. FILE* p = fopen( "test.txt", "w");
  6. }
  7. int main()
  8. {
  9. fopencheck();
  10. return 0;
  11. }

2.3 测试结果

3、动态内存越界

3.1 错误提示    Invalid write 3.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char* p = malloc( 1);
  6. *( short*)p = 2;
  7. free(p);
  8. }
  9. int main()
  10. {
  11. memcheck();
  12. return 0;
  13. }

3.3 测试结果

4、无法检测数组越界

4.1错误提示      无法对分配在栈上的静态数组检测越界
4.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char array[ 3];
  6. strcpy( array, "hello");
  7. }
  8. int main()
  9. {
  10. memcheck();
  11. return 0;
  12. }

4.3 检测结果

5、内存释放两次或多次

5.1 错误提示   Invalid free()/delete/delete[]/realloc()
5.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char* p = ( char*) malloc( 20);
  6. free(p);
  7. free(p);
  8. }
  9. int main()
  10. {
  11. memcheck();
  12. return 0;
  13. }

5.3 测试结果

6、使用野指针

6.1 错误提示     Invalid write of size
6.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char* p = ( void*) 0x80808080;
  6. *p = 10;
  7. }
  8. int main()
  9. {
  10. memcheck();
  11. return 0;
  12. }

6.3 测试结果

7、释放野指针

7.1 错误提示    Invalid free()/delete/delete[]/realloc()
7.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char* p;
  6. free(p);
  7. }
  8. int main()
  9. {
  10. memcheck();
  11. return 0;
  12. }


7.3 测试结果

8、valgrind的主要参数

  • -h  --help
显示所有选项的帮助,包括内核和选定的工具。
  • --help-debug
与--help相同,并且还能显示通常只有valgrind的开发人员使用的调试选项。
  • --version
显示valgrind内核的版本号
  • -q, --quiet
安静的运行,只打印错误信息(被调试的程序错误信息)。
  • -v, --verbose:显示详细信息。
  • -tool=<toolname>[default:memcheck]

运行toolname指定的Valgrind,例如:memcheck,addrcheck,cachegrind等。
  • --log-file=<file>

指定valgrind把它所有的信息输出到指定为文件中。
  • --trace-children=<yes|no>[default:no]

当这个选项打开时,valgrind会跟踪到子进程中,这通常会导致困惑,而且通常不是你所期望的,默认关闭。


9、常见错误

  • malloc/free: in use at exit      内存在退出前没有释放
  • invalid write of size               非法写入内存,一般为数组越界
  • invalid read of size               非法读内存:一般为数组越界
  • definitely lost /possibly lost /still reachable in loss record 内存未释放
  • invalid free()/delete/delete[]  同一指针被多次释放
  • source and destination overlay 一般是使用strncpy,memcpy引起
  • syscall param contains uninitialized byte 调用系统函数时传入了未初始化的变量
  • conditional jump or move depends on uninitialized value 条件判断时使用了未初始化的变量
  • access not with mapped region/stack overflow 栈溢出
  • mismatch free()/delete/delete[]/new  delete/malloc/free搭配错误

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn/SoaringLee_fighting/article/details/78200013

###Date: 2017/10/15

###Author:SoaringLee

Valgrind工具检测内存错误

      Valgrind是一个检测内存问题的开源工具,可以用于检测linux下应用程序的内存泄漏问题。但是对于静态数组越界的问题,valgrind是检测不出来的,对于这个问题,可以采用converity静态检查。这个工具对于内存泄漏诊断非常有用,特整理下面相关问题。

1、内存泄漏

1.1  错误提示        are definitely lost in loss
1.2  C源代码mem_leak.c

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char* p = ( char*) malloc( 20);
  6. }
  7. int main()
  8. {
  9. memcheck();
  10. return 0;
  11. }

1.3 使用命令


1.4 检测结果


2、文件指针资源泄漏 2.1 错误提示   FILE DESCRIPTORS:4 open at exit
2.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void fopencheck()
  4. {
  5. FILE* p = fopen( "test.txt", "w");
  6. }
  7. int main()
  8. {
  9. fopencheck();
  10. return 0;
  11. }

2.3 测试结果

3、动态内存越界

3.1 错误提示    Invalid write 3.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char* p = malloc( 1);
  6. *( short*)p = 2;
  7. free(p);
  8. }
  9. int main()
  10. {
  11. memcheck();
  12. return 0;
  13. }

3.3 测试结果

4、无法检测数组越界

4.1错误提示      无法对分配在栈上的静态数组检测越界
4.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char array[ 3];
  6. strcpy( array, "hello");
  7. }
  8. int main()
  9. {
  10. memcheck();
  11. return 0;
  12. }

4.3 检测结果

5、内存释放两次或多次

5.1 错误提示   Invalid free()/delete/delete[]/realloc()
5.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char* p = ( char*) malloc( 20);
  6. free(p);
  7. free(p);
  8. }
  9. int main()
  10. {
  11. memcheck();
  12. return 0;
  13. }

5.3 测试结果

6、使用野指针

6.1 错误提示     Invalid write of size
6.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char* p = ( void*) 0x80808080;
  6. *p = 10;
  7. }
  8. int main()
  9. {
  10. memcheck();
  11. return 0;
  12. }

6.3 测试结果

7、释放野指针

7.1 错误提示    Invalid free()/delete/delete[]/realloc()
7.2 源代码

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void memcheck()
  4. {
  5. char* p;
  6. free(p);
  7. }
  8. int main()
  9. {
  10. memcheck();
  11. return 0;
  12. }


7.3 测试结果

8、valgrind的主要参数

  • -h  --help
显示所有选项的帮助,包括内核和选定的工具。
  • --help-debug
与--help相同,并且还能显示通常只有valgrind的开发人员使用的调试选项。
  • --version
显示valgrind内核的版本号
  • -q, --quiet
安静的运行,只打印错误信息(被调试的程序错误信息)。
  • -v, --verbose:显示详细信息。
  • -tool=<toolname>[default:memcheck]

运行toolname指定的Valgrind,例如:memcheck,addrcheck,cachegrind等。
  • --log-file=<file>

指定valgrind把它所有的信息输出到指定为文件中。
  • --trace-children=<yes|no>[default:no]

当这个选项打开时,valgrind会跟踪到子进程中,这通常会导致困惑,而且通常不是你所期望的,默认关闭。


9、常见错误

  • malloc/free: in use at exit      内存在退出前没有释放
  • invalid write of size               非法写入内存,一般为数组越界
  • invalid read of size               非法读内存:一般为数组越界
  • definitely lost /possibly lost /still reachable in loss record 内存未释放
  • invalid free()/delete/delete[]  同一指针被多次释放
  • source and destination overlay 一般是使用strncpy,memcpy引起
  • syscall param contains uninitialized byte 调用系统函数时传入了未初始化的变量
  • conditional jump or move depends on uninitialized value 条件判断时使用了未初始化的变量
  • access not with mapped region/stack overflow 栈溢出
  • mismatch free()/delete/delete[]/new  delete/malloc/free搭配错误

本文标签: 实例内存错误工具Valgrind