首页 > 系统相关 >Valgrind检测非法访问内存

Valgrind检测非法访问内存

时间:2023-04-20 14:23:15浏览次数:38  
标签:blocks bytes Valgrind 非法 0508test 内存 16719 cpp

一 代码

 
#include<iostream>   #include<stdlib.h>   using namespace std;   void func(){   int *x=(int *)malloc( 10 * sizeof ( int ) ) ;   x[10]=0;   }   int main(){   func();   cout<<"done"<<endl;   return 0;   }
 
 

二 编译并运行

 
[root@localhost charpter05]# g++ -g 0508test.cpp -o 0508   [root@localhost charpter05]# ./0508   done
 
 

三 用Valgrind检测非法访问内存

 
[root@localhost charpter05]# valgrind ./0508   ==16719== Memcheck, a memory error detector   ==16719== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.   ==16719== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info   ==16719== Command: ./0508   ==16719==   ==16719== Invalid write of size 4   ==16719== at 0x4008DE: func() (0508test.cpp:6)   ==16719== by 0x4008EE: main (0508test.cpp:9)   ==16719== Address 0x5a1a068 is 0 bytes after a block of size 40 alloc'd   ==16719== at 0x4C29EC3: malloc (vg_replace_malloc.c:309)   ==16719== by 0x4008D1: func() (0508test.cpp:5)   ==16719== by 0x4008EE: main (0508test.cpp:9)   ==16719==   done   ==16719==   ==16719== HEAP SUMMARY:   ==16719== in use at exit: 40 bytes in 1 blocks   ==16719== total heap usage: 1 allocs, 0 frees, 40 bytes allocated   ==16719==   ==16719== LEAK SUMMARY:   ==16719== definitely lost: 40 bytes in 1 blocks   ==16719== indirectly lost: 0 bytes in 0 blocks   ==16719== possibly lost: 0 bytes in 0 blocks   ==16719== still reachable: 0 bytes in 0 blocks   ==16719== suppressed: 0 bytes in 0 blocks   ==16719== Rerun with --leak-check=full to see details of leaked memory   ==16719==   ==16719== For lists of detected and suppressed errors, rerun with: -s   ==16719== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
 
 

四 分析

1 16719表示的是进程号

2 版本信息

 
==16719== Memcheck, a memory error detector   ==16719== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.   ==16719== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info   ==16719== Command: ./0508
 
 

3 非法写内存,写操作内存是4个字节,发生错误时候的函数堆栈,说明错误发生在第6行

 
==16719== Invalid write of size 4   ==16719== at 0x4008DE: func() (0508test.cpp:6)   ==16719== by 0x4008EE: main (0508test.cpp:9)
 
 

4 程序泄露了40个字节的内存

 
==16719== LEAK SUMMARY:   ==16719== definitely lost: 40 bytes in 1 blocks   ==16719== indirectly lost: 0 bytes in 0 blocks   ==16719== possibly lost: 0 bytes in 0 blocks   ==16719== still reachable: 0 bytes in 0 blocks   ==16719== suppressed: 0 bytes in 0 blocks
 
 

5 该程序存在两个问题,一个是fun函数动态申请的堆内存没有释放,另外一个是对堆内存访问越界。这两个问题都被valgrind检测出来了。

 

标签:blocks,bytes,Valgrind,非法,0508test,内存,16719,cpp
From: https://www.cnblogs.com/lidabo/p/17336663.html

相关文章

  • 内存飞踩问题的几点思考
    1、程序编译,链接后生成二进制可执行程序。二进制可执行文件以elf格式实现排列。可以通过readelf-Sxxxx查看具体section的划分,粗略划分如下图所示。在这些section中,代码段是只读的,自然也就不存在代码(指令)被改写的情况。数据段,堆,栈区具有读写的属性,但是数据段和堆一般存放的是......
  • 一文掌握C/C++内存泄漏,防止内存泄漏以及检测工具!
    在写C/C++代码的时候,经常需要为程序分配动态内存,难免就会发生内存泄漏的情况,本文就来说一下如何防止C/C++内存泄漏!在说防止内存泄漏前,先说一下什么是内存泄漏。一、什么是内存泄漏?通俗一点说就是,程序中动态分配的内存并没有正确的释放。内存泄漏(Memoryleak)是在计算机科学......
  • 内存问题难定位,那是因为你没用ASAN
    ASAN全称:AddressSanitizer,google发明的一种内存地址错误检查器。目前已经被集成到各大编译器中。本文分享自华为云社区《内存定位利器-ASAN使用小结》,作者:云存储开发者支持团队。1.什么是ASANASAN全称:AddressSanitizer,google发明的一种内存地址错误检查器。目前已经被集......
  • 使用mprotect定位踩内存故障
    前言对于C语言来说,内存被踩是比较常见的问题,轻则普通变量被改写程序逻辑出错,重则指针变量被改写引发指针解引用出现未定义行为风险;定位内存被踩一直是棘手的难题,如果出现程序跑死,一般可以通过堆栈信息来定位:1)查看跑死的调用链,确定跑死代码的位置;2)根据pc指针找到具体代码;3)走......
  • GE反射内存实时通讯网络解决方案
    时通讯网络是用于需要较高实时性要求的应用领域的专用网络通讯技术,一般采用基于高速网络的共享存储器技术实现。它除了具有严格的传输确定性和可预测性外,还具有速度高、通信协议简单、宿主机负载轻、软硬件平台适应性强、可靠的传输纠错能力、支持中断信号的传输等特点。本方案选......
  • Linux内存管理之mem_map对象.md
    在linux内核中,所有的物理内存都用structpage结构来描述,这些对象以数组形式存放,而这个数组的地址就是mem_map。内核以节点node为单位,每个node下的物理内存统一管理,也就是说在表示内存node的描述类型structpglist_data中,有node_mem_map这个成员,其针对平坦型内存进行描述(CONFIG_FL......
  • CANN开发实践:4个DVPP内存问题的典型案例解读
    摘要:由于DVPP媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,那么本期就分享几个关于DVPP内存问题的典型案例,并给出原因分析及解决方法。本文分享自华为云社区《FAQ_DVPP内存问题案例》,作者:昇腾CANN。DVPP是昇腾......
  • 实时查看Docker容器占用的CPU、内存状态
    安装Linux下安装方法:wgethttps://github.com/bcicen/ctop/releases/download/v0.5/ctop-0.5-linux-amd64-Octopsudomvctop/usr/local/bin/sudochmod+x/usr/local/bin/ctop执行命令:ctop使用ctop运行后,通过下面的按键可以实现不同的功能1)a-只查看运行状态的容器f-......
  • 在Go语言中,如何优化内存使用效率?
    在Go语言中,可以通过以下几种方式来优化内存使用效率:避免使用过多的内存尽可能地避免使用过多的内存是最有效的内存优化方法之一。在编写代码时,应该尽可能地避免使用全局变量和大量的临时变量。同时,可以使用常量、静态变量和缓存等方式来避免频繁地分配和释放内存。及时释放不......
  • 【valgrind】软件调试工具-valgrind内存调试工具
    valgrind工具安装Ubuntu环境安装sudoaptinstallvalgrind源码编译1.源码下载http://valgrind.org/downloads/valgrind-3.12.0.tar.bz22.valgrind编译安装tar-jxvfvalgrind-3.12.0.tar.bz2cdvalgrind-3.12.0./configuremakesudomakeinstallvalgrind运行分析程......