C++ 与-static链接时出现Valgrind错误--为什么?

C++ 与-static链接时出现Valgrind错误--为什么?,c++,valgrind,C++,Valgrind,我有一个连接到我编写的库的测试驱动程序。该库使用自动工具,因此它同时生成存档(.a文件)和动态库(.so) 当我用“g++-static”链接我的驱动程序时,valgrind可能链接到.a,它会反复亮起,抱怨“条件跳转或移动取决于未初始化的值”。第一个故障发生在main in u pthread_initialize_minimal之前 当我链接时没有-静态,大概是链接到了。所以,我没有收到任何valgrind的抱怨 有人知道为什么吗?valgrind只是不能与-static一起工作吗 更新:我

我有一个连接到我编写的库的测试驱动程序。该库使用自动工具,因此它同时生成存档(.a文件)和动态库(.so)

当我用“g++-static”链接我的驱动程序时,valgrind可能链接到.a,它会反复亮起,抱怨“条件跳转或移动取决于未初始化的值”。第一个故障发生在main in u pthread_initialize_minimal之前

当我链接时没有-静态,大概是链接到了。所以,我没有收到任何valgrind的抱怨

有人知道为什么吗?valgrind只是不能与-static一起工作吗

更新:我甚至不能发布我的驱动程序的精简版本,因为它链接到一个我无法精简的非常大的库,但我注意到所有程序中最简单的一个

int main()
{
  return 0;
}
与-static链接并从valgrind运行时给出错误:

==15449== Use of uninitialised value of size 8
==15449==    at 0x40B0F3: exit (in /home/jdgordo/src/t)

我应该包括我在64位Redhat 5.5上运行。

如果库在valgrind中导致问题,您只能通过以下方式忽略这些问题

我遇到的一个问题是在堆上放置一些东西,如下所示:

// library
int * some = new int;

// main links the library
int main()
{
}
此示例将报告有关泄漏的错误


编辑:如果您有库的源代码,您可以修复错误(使用未初始化的变量),然后重新编译它。

如果库导致valgrind出现问题,您只能通过以下方式忽略这些问题

我遇到的一个问题是在堆上放置一些东西,如下所示:

// library
int * some = new int;

// main links the library
int main()
{
}
此示例将报告有关泄漏的错误

编辑:如果有库的源代码,可以修复错误(使用未初始化的变量),然后重新编译

valgrind只是不能与-static一起工作吗

是的。问题不在于Valgrind,而在于glibc,它不是Valgrind clean。glibc开发人员拒绝修复这些问题(因为这些问题具有“不在乎”的性质,修复它们需要(几个)周期)

动态链接时,这些错误来自
libc.so.6
,可以很容易地抑制,这是Valgrind默认的做法

但是当静态链接时,这些错误来自可执行文件(现在包括
libc.a
中的代码),因此默认的Valgrind抑制不会抑制它们

您可以编写新的抑制(请参阅Valgrind
--gen suppressions=yes

或者您可以安装并使用

valgrind只是不能与-static一起工作吗

是的。问题不在于Valgrind,而在于glibc,它不是Valgrind clean。glibc开发人员拒绝修复这些问题(因为这些问题具有“不在乎”的性质,修复它们需要(几个)周期)

动态链接时,这些错误来自
libc.so.6
,可以很容易地抑制,这是Valgrind默认的做法

但是当静态链接时,这些错误来自可执行文件(现在包括
libc.a
中的代码),因此默认的Valgrind抑制不会抑制它们

您可以编写新的抑制(请参阅Valgrind
--gen suppressions=yes


或者您可以安装并使用。

尝试将问题缩小到尽可能少的操作系统代码行,并在此处发布。各种系统库中存在大量的错误和快捷方式,因此在valgrind中出现这些错误并不罕见。我想,你可以试着系统地忽略它们,或者只是用共享版本进行测试。我在我的系统上没有看到这一点@KerrekSB-是正确的,但这并不是真正需要担心的事情,valgrind提供了一个大文件,该文件抑制了大多数这些文件。它可能与您的系统上的libc/编译器版本有点不匹配。请尝试将问题缩小到尽可能少的操作系统代码行,并在此处发布。各种系统库中存在大量的错误和快捷方式,因此在valgrind中出现这些错误并不罕见。我想,你可以试着系统地忽略它们,或者只是用共享版本进行测试。我在我的系统上没有看到这一点@KerrekSB-是正确的,但这并不是真正需要担心的事情,valgrind提供了一个大文件,该文件抑制了大多数这些文件。它可能与系统上的libc/编译器版本有点不匹配。当libc静态链接时,Valgrind会拦截malloc和free调用吗?当libc静态链接时,Valgrind会拦截malloc和free调用吗?