c++ - Valgrind 找不到无效的写入

标签 c++ valgrind

我的程序以一种非常令人费解的方式出现段错误。它发生在 std::string 库代码中,所以我假设我的程序正在覆盖其他地方的 std::string 代码。当我尝试将 char* 分配给 automatic 变量中的 std:string 时,会发生段错误:

struct MyStruct
{
    std::string name;
    int winch_ndx;
    ...
};

void MyFunction(const char * nodeName)
{
    MyStruct dataL;
    dataL.name = nodeName;  <-- segfault
    ...
}

由于 dataL 是一个自动变量,代码的其他部分无法覆盖它占用的内存,所以我猜测库代码本身正在被值 0x6C2FD8 覆盖(见下文)。令人费解的是 Valgrind 根本没有检测到原始的无效写入。我不知道如何将这个 0x6C2FD8 引入到 std::string 代码中。任何见解将不胜感激。

接下来是 Valgrid 输出和我的 valgrind 命令。

==17112== 进程以信号 11 (SIGSEGV) 的默认操作终止

==17112== 地址 0x6C2FD8 处映射区域的错误权限

==17112== 在 0x9B07D87:__exchange_and_add (atomicity.h:47)

==17112== by 0x9B07D87: __exchange_and_add_dispatch (atomicity.h:80)

==17112== by 0x9B07D87: std::string::_Rep::_M_dispose(std::allocator const&) [clone .part.12] (basic_string.h:246)

==17112== by 0x9B07F78: _M_dispose (char_traits.h:243)

==17112== by 0x9B07F78: std::string::_M_mutate(unsigned long, unsigned long, unsigned long) (basic_string.tcc:487)

==17112== by 0x9B083ED:std::string::_M_replace_safe(unsigned long, unsigned long, char const*, unsigned long) (basic_string.tcc:684)

==17112== by 0x613ADA: MyFunction (comm.cpp:1108)

valgrind  --gen-suppressions=all --error-markers=BEGIN_MARK,END_MARK --free-fill=FF --malloc-fill=FF --trace-malloc=yes --trace-children=yes --track-origins=yes --read-var-info=yes --partial-loads-ok=no --log-file=vg2.out my_program 

最佳答案

检查 nodeName 是否为 NULL,同时检查 nodeName 是否实际指向一个以 '\0' 结尾的字符串 ...

关于c++ - Valgrind 找不到无效的写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33638607/

相关文章:

c++ - C/С++。为什么 volatile 上的简单整数加法可以转换为 gcc 和 clang 上的不同 asm 指令?

c++ - BlackBerry 10 开发中的 .pro 文件

c - valgrind 报告未释放的 block

c++ - 尝试索引头文件时 Eclipse CDT 崩溃

c++ - 在运行时通过参数更改通过另一个模块回调(重新实例化)一个模块

C++ 新的放置运算符混淆了 Valgrind Memcheck

c++ - 为什么析构函数不释放数组内存?

有条件的跳跃或移动取决于未初始化的值

c - Valgrind 错误、大小读取无效和条件跳转或移动取决于未初始化的值

c++ - cin 和 getline 跳过输入