C++ 瓦尔格林和;警告:新重定向与现有重定向冲突;

C++ 瓦尔格林和;警告:新重定向与现有重定向冲突;,c++,valgrind,C++,Valgrind,这是我在瓦尔格兰买的 --24101-- REDIR: 0xbb20580 (operator delete(void*)) redirected to 0x93b7d48 (operator delete(void*)) --24101-- REDIR: 0xbb22580 (operator new[](unsigned long)) redirected to 0x93b88b7 (operator new[](unsigned long)) ==24101== WARNING: new

这是我在瓦尔格兰买的

--24101-- REDIR: 0xbb20580 (operator delete(void*)) redirected to 0x93b7d48 (operator delete(void*))
--24101-- REDIR: 0xbb22580 (operator new[](unsigned long)) redirected to 0x93b88b7 (operator new[](unsigned long))
==24101== WARNING: new redirection conflicts with existing -- ignoring it
--24101--     new: 0x15632010 (__GI_strlen         ) R-> 0x093b96b0 strlen
--24101-- REDIR: 0xbb205c0 (operator delete[](void*)) redirected to 0x93b79c4 (operator delete[](void*))

这有什么关系吗?

Valgrind的魔力很大一部分在于它如何能够拦截/重定向函数调用,以便跟踪世界的状态

据我所知,重定向是通过使用共享对象/函数名模式来实现的,当匹配“重定向”调用到新地址时,这些模式将调用重定向到新地址。查看valgrind源代码,我们发现了“重定向器”的概念:

重定向程序包含两种状态:
规格-一组(soname模式、fnname模式)->redir addr
活动-一组原始地址->(布尔、重读地址)
(m_redir.c第104行)

因此,“spec”提供了共享的对象/函数名来处理映射,“Actives”表示映射本身

主动计算:

Active=空
对于“规格中的规格”{
sopatt=规范soname模式
fnpatt=规格fnname图案
redir=规格redir地址
用于在SyminfoState中匹配sopatt{
对于与(so)的fn名称中的FNPAT匹配的fn{
&fn->redir被添加到活动
}
}
}
(m_redir.c第120行)

这里也提到了“冲突重定向”的概念:

显然,我们必须强制要求域(活动)包含
没有重复的。难点在于如何将规范约束到足以
避免陷入那种情况。编写规范很容易
可能导致活动中的绑定冲突,例如:
(libpthread.so,pthread_mutex_lock)->a1
(libpthread.so,pthread_*)->a2
对于a1!=a2。或者更多毛:
(libpthread.so,pthread_mutex_*)->a1
(libpthread.so,pthread_*\u lock)->a2
(m_redir.c第152行)

为了利益起见,这里是您发出警告的地方:

old=VG(OSetGen\u查找)(activeSet和act.from\u addr);
如果(旧){
/*不可靠,绑定冲突*/
vg\U断言(旧->来自\u地址==act.from\u地址);
如果(旧->收件人!=代理收件人){
/*我们必须忽略它,否则activeSet将包含
冲突绑定*/
what=“新重定向与现有重定向冲突--忽略它”;
变坏;
} 
(m_redir.c第664行)

因此,在所有这些之后,我们可以安全地假设:

  • 重定向消息是正常valgrind操作的一部分
  • 警告消息可能是规范模式冲突的结果(在本例中可能不是一个值得关注的问题)

  • 引用:,

    我将忽略这些警告。即使在最小的
    int main(){}上运行
    valgrind
    ,也会显示这些警告
    程序。我不知道为什么会发生这种情况。顺便说一句,在我的机器上
    valgrind
    警告有关
    索引
    ,而不是
    strlen
    。可能这取决于你的
    libc
    版本。请注意,我这样使用valgrind时得到了这些信息:
    valgrind--leak check=full-v./your_程序
    。如果我删除
    -v
    >,我没有收到他们。很高兴有这个问题和答案,好极了!我的意思是我很困惑到底发生了什么!