首页 > 其他分享 >Memcheck错误解释

Memcheck错误解释

时间:2024-08-08 23:25:36浏览次数:14  
标签:std 解释 malloc 错误 Memcheck char new main delete

Memcheck只能检测出两种错误类型:

  • use of illegal addresses
  • use of undefined values

这两种错误类型,足以应对大多数的情况。下面针对这两种类型出现的错误进行解释。


Illegal read / Illegal write errors

 Invalid read of size 1
    at 0x4C32CF2: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    by 0x4F50018: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
    by 0x109C71: main (argparse_.cc:53)

这表示程序在读取/写入一段Memcheck应该操作的内存。本错误提示中,程序在地址0x109C71读取了一个字节,在程序中的地址是 main (argparse_.cc:53)

Use of uninitialised values

  • 程序中的局部变量没有被初始化就使用了
  • malloc的内存块的内容,在没有写入任何内容之前就使用了,C++中是new运算符。

比如:

    char* chr = static_cast<char*>(::malloc(sizeof(char)));

    std::cout<<"chr:" <<*chr<<std::endl;    
    ::free(chr);

由于没有对::malloc分配的内存进行初始化就使用了,就会导致这个错误。

 Conditional jump or move depends on uninitialised value(s)
    at 0x5250A65: _IO_file_xsputn@@GLIBC_2.2.5 (fileops.c:1241)
    by 0x5244976: fwrite (iofwrite.c:39)
    by 0x4F4FCB3: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
    by 0x4F4FF57: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
    by 0x108A10: main (in /home/szz/Study/SystemProgram/Cpp/unitest/src/a.out)

其他的的使用没有初始化的变量也会产生这个问题。

    int main(int argc, char const* argv[]) {
        int x;
        printf("x=%d.\n",x);
    }

Illegal frees

即,free/delete次数多于malloc/new
比如对于代码:

    char* chr = static_cast<char*>(::malloc(sizeof(char)));
    std::cout<<"chr:" <<*chr<<std::endl;    
    ::free(chr);
    ::free(chr);
    return 0;

valgrind得到的错误报告就有Invalid free() / delete / delete[] / realloc()

 Invalid free() / delete / delete[] / realloc()
    at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    by 0x108A3D: main (in /home/szz/Study/SystemProgram/Cpp/unitest/src/a.out)
  Address 0x5b7dc80 is 0 bytes inside a block of size 1 free'd

Mismatched free() / delete / delete []

  • 释放内存和分配的方式不一致。比如new[]分配的,而采用delete
  • 使用new/malloc分配而采用free/delete释放。

比如代码:

    char* chr = new char[10];
    delete chr;

产生的错误如下:

Mismatched free() / delete / delete []
   at 0x4C3123B: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
   by 0x108817: main (in /home/szz/Study/SystemProgram/Cpp/unitest/src/a.out)
 Address 0x5b7dc80 is 0 bytes inside a block of size 10 alloc'd
   at 0x4C3089F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
   by 0x108802: main (in /home/szz/Study/SystemProgram/Cpp/unitest/src/a.out)

正确的方式

  • If allocated with malloc, calloc, realloc, valloc or memalign, you must deallocate with free
  • If allocated with new[], you must deallocate with delete[]
  • If allocated with new, you must deallocate with delete

Passing system call parameters with inadequate read/write permissions

当发送系统调用时,Memcheck会检测系统调用的所有参数。

  • 如果是内核从用户应用程序buffer中读取数据,Memcheck会检测:1)buffer地址是否是可寻址的,2)这个数据是否是可读的。
  • 如果是从内核向用户程序中的buffer写入数据,Memcheck会检测:1)buffer地址是否是可寻址的。

完成这个系统调用后,Memcheck更新其管理信息,以准确反映由系统调用引起的内存许可权的任何更改。
比如:

    char* arr = (char*)::malloc(10);
    ::write(STDOUT_FILENO, arr, 10);

检测就会发生错误:

 Syscall param write(buf) points to uninitialised byte(s)
    at 0x52D5154: write (write.c:27)
    by 0x1087FC: main (in /home/szz/Study/SystemProgram/Cpp/unitest/src/a.out)
  Address 0x5b7dc80 is 0 bytes inside a block of size 10 alloc'd
    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    by 0x1087E2: main (in /home/szz/Study/SystemProgram/Cpp/unitest/src/a.out)

因此程序试图向将未初始化的内存arr写入标准输出,这个未初始化的数据是不可写的。

Overlapping source and destination blocks

即目的和源地址存在重复,主要是 memcpy(), strcpy(), strncpy(), strcat()strncat()等函数。

标签:std,解释,malloc,错误,Memcheck,char,new,main,delete
From: https://blog.csdn.net/H520xcodenodev/article/details/141038832

相关文章

  • Java | Integer强转Double错误
    一、问题复现引发java.lang.ClassCastException:classjava.lang.Integercannotbecasttoclassjava.lang.Double错误的示例代码:publicclassClassCastExceptionExample{publicstaticvoidmain(String[]args){Objectnumber=Integer.valueOf(10);......
  • FreeRTOS启动任务调度器函数解释
    目录vTaskStartScheduler()函数xPortStartScheduler()函数prvStartFirstTask()函数vPortSVCHandler()函数FreeRTOS的任务开始运行的前提是调用了启动调度器函数vTaskStartScheduler(),只有调用了该函数任务才会被调度并运行。下面以FreeRTOSv9.0.0版本的源码进行分析FreeRT......
  • 【面试】解释概率和似然的区别
    面试模拟场景面试官:你能解释一下概率和似然的区别吗?参考回答示例概率(Probability)概念:概率是指在给定模型参数和已知条件下,观察到某个数据样本的可能性。换句话说,概率描述的是在已知模型和参数的情况下,某个事件发生的可能性。公式:......
  • 改写socket编程并解释socket通信原理
    如果你仔细看我之前的博客,会看到那个手机打电话的示例,但是那段代码彻底写死了,真正编程的时候一定要写活了,不信你看看很多的程序的配置文件就是这样的,为什么单独分离个配置文件出来,就是为了便于修改配置,这就是把程序写活的最好的例子。言归正传,直接上代码。服务端:fromsocketim......
  • Open3d Create_from_cloud_alpha_shape 错误:无效的 unordered_map
    我在open3d中的create_from_point_cloud_alpha_shape方面遇到问题。这是我的代码。importopen3daso3dimportnumpyasnpmesh=o3d.io.read_triangle_mesh('Bunny.stl')print(mesh)pcd=mesh.sample_points_poisson_disk(750)alpha=0.3mesh=o3d.geome......
  • 错误处理和 threading.Thread() 问题
    我对Python比较陌生,最初我按照我喜欢的方式进行错误处理。我想使用PySimpleGUI添加进度条,经过一些研究发现我需要使用线程。一旦我实现了线程,错误处理就不再像我想要的那样工作,而且我似乎不知道如何修复它。我将提供进度条之前和之后的代码,但是之后的代码没有任何错误处理。......
  • Flask 应用程序中 HTML 脚本标签中的代码会引发一些烦人的小错误
    Home.html文件:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>Home</title><linkrel="stylesheet"type="text/css"href="{{url_for("static",filename="css......
  • BUG: 传输的uicode码转汉字显示部分错误
    1.BUG描述pc下发文本信息,采用unicode编码形式,下位机单元接收后,需要将其解码成utf-8的编码形式显示出来,但是发现文本首部和尾部出现乱码。2.BUG原因原因很简单,解码的时候尾部和首部没有对齐。记录这个BUG主要是记录下汉字的编码方法。3.修复方法解码时对齐即可。4.unicode编......
  • VsCode C++ namespace has no member错误
    此问题VSCode C++插件本身bug解决办法一:还原c++插件到旧版本解决方法二:但此方法智能提示会有很多多余的信息(有缺陷)在官方未推出相应布丁之前,可按照以下步骤避免该问题:1、按顺序打开:文件》首选项》设置2、在右边,用户设置窗口添加以下代码:"C_Cpp.intelliSenseEngine":"TagP......
  • 解决安装iperf 出现错误cannot find dependency uclibcxx for iperf
    iperf是一个常用免费的网络性能测试工具。iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽、延迟抖动和数据包丢失。在openwrt安装时通常会遇到下面问题 原因如提示所描述没有uclibcxx依赖库。制作ipk依赖包然后安装上。提示安装完成。......