C++ 用户泄漏,libc++;漏报或假阳性

C++ 用户泄漏,libc++;漏报或假阳性,c++,memory-leaks,clang,valgrind,libc++,C++,Memory Leaks,Clang,Valgrind,Libc++,我正在使用clang编译器和libc++标准库在mac上用C++11构建一个动态库。当我在链接到动态库的测试代码上运行valgrind时,我得到的一块内存肯定丢失了。以下是valgrind报告: ==45659== 36 bytes in 1 blocks are definitely lost in loss record 57 of 228 ==45659== at 0x66BB: malloc (vg_replace_malloc.c:300) ==45659== by 0x3

我正在使用clang编译器和libc++标准库在mac上用C++11构建一个动态库。当我在链接到动态库的测试代码上运行valgrind时,我得到的一块内存肯定丢失了。以下是valgrind报告:

==45659== 36 bytes in 1 blocks are definitely lost in loss record 57 of 228
==45659==    at 0x66BB: malloc (vg_replace_malloc.c:300)
==45659==    by 0x31EAB0: __Balloc_D2A (in /usr/lib/system/libsystem_c.dylib)
==45659==    by 0x31F2A5: __d2b_D2A (in /usr/lib/system/libsystem_c.dylib)
==45659==    by 0x31BED6: __dtoa (in /usr/lib/system/libsystem_c.dylib)
==45659==    by 0x3438A9: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==45659==    by 0x36A2DA: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==45659==    by 0x34FF66: _vsnprintf (in /usr/lib/system/libsystem_c.dylib)
==45659==    by 0x34FFC5: vsnprintf_l (in /usr/lib/system/libsystem_c.dylib)
==45659==    by 0x34057A: snprintf_l (in /usr/lib/system/libsystem_c.dylib)
==45659==    by 0x10C75A: std::__1::num_put<char, std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > >::do_put(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, std::__1::ios_base&, char, double) const (in /usr/lib/libc++.1.dylib)
==45659==    by 0xF3221: std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(double) (in /usr/lib/libc++.1.dylib)
==45659==    by 0x12102: lmpsdata::header_data::write_dimension(std::__1::basic_ofstream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (header_data.cpp:75)
==45659== 
==45659== LEAK SUMMARY:
==45659==    definitely lost: 36 bytes in 1 blocks
==45659==    indirectly lost: 0 bytes in 0 blocks
==45659==      possibly lost: 0 bytes in 0 blocks
==45659==    still reachable: 18,340 bytes in 215 blocks
==45659==         suppressed: 25,274 bytes in 374 blocks
==45659==1个块中的36个字节肯定会在228个块中的丢失记录57中丢失
==45659==0x66BB:malloc(vg_替换_malloc.c:300)
==45659==0x31EAB0:u Balloc_D2A(在/usr/lib/system/libsystem_c.dylib中)
==45659==0x31F2A5:u d2b_D2A(在/usr/lib/system/libsystem_c.dylib中)
==45659==0x31BED6:u dtoa(在/usr/lib/system/libsystem_c.dylib中)
==45659==0x3438A9:u vfprintf(在/usr/lib/system/libsystem_c.dylib中)
==45659==0x36A2DA:u v2printf(在/usr/lib/system/libsystem_c.dylib中)
==45659==0x34FF66:_vsnprintf(在/usr/lib/system/libsystem_c.dylib中)
==45659==by 0x34FFC5:vsnprintf_l(在/usr/lib/system/libsystem_c.dylib中)
==45659==by 0x34057A:snprintf_l(在/usr/lib/system/libsystem_c.dylib中)
==45659==by 0x10C75A:std::u 1::num_put::do_put(std:u 1::ostreambuf_迭代器,std::u 1::ios_base&,char,double)const(in/usr/lib/libc++.1.dylib)

==45659==by 0xF3221:std::u 1::basic_ostream::operator您没有提到您正在使用的OSX和valgrind的确切版本。我无法在我使用的版本(OSX 10.10;valgrind HEAD==valgrind-3.11.0.SVN)上完全重现这一点

这不是在
C++
标准库中,而是在
C
库中。您应该能够用简单的代码复制它(几乎相同):

#include <stdio.h>
#include <xlocale.h>

int
main(int argc, char **argv)
{
    locale_t loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0);
    double d = 22.22;
    char buffer[1024];
    snprintf_l(buffer, 1024, loc, "%f\n", d);
    printf("%s", buffer);
    freelocale(loc);
}
我会对它进行压制,因为它几乎毫无疑问不是真正的泄漏,完全不受你的控制

查看已发布的文件,我看不到bug存在的位置-320和以后的版本看起来都正常;底层代码似乎在必要时进行分配和释放。不过,这个bug可能已经被引入并修复,因为我没有对所有的源代码进行彻底的搜索;有问题的文件是,您正在查看
dtoaresult
assignments&frees

要确定libc的版本,可以执行以下操作:

$ otool -l /usr/lib/system/libsystem_c.dylib | grep -A5 ID_
在我的系统上,我得到输出:

          cmd LC_ID_DYLIB
      cmdsize 64
         name /usr/lib/system/libsystem_c.dylib (offset 24)
   time stamp 1 Thu Jan  1 01:00:01 1970
      current version 1044.10.1
compatibility version 1.0.0

997,我认为,是小牛队(10.9)。我不知道他们是否在mavericks时间段的某个时间点引入了代码泄漏,然后修复了它-在
\uvfprintf
例程中似乎没有一个代码路径在任何已发布的源代码中实际泄漏。

您是否确保传递到
header\u data::write\u dimension()
是否正确关闭并随后删除?另外,您是否尝试过拆分语句
文件上述valgrind报告在ostream关闭和保持打开的情况下发生。第一次运行valgrind时,我忘了关闭溪流,我认为这就是问题所在。这个问题仍然存在,我使用的是valgrind-3.10.1。我在mavericks(10.9)中,libsystem_c.dylib的版本是997.90.3。当我在valgrind中运行代码时,我没有得到任何肯定丢失的泄漏,只有4个仍然可以访问,它们与您的相同。我认为你的权利这可能不是真正的泄密。我想知道这是否是valgrind-3.10.1和C++11的问题。valgrind 3.10.1很容易误报泄漏,因为它无法正确跟踪分配-我已经看到了其中一些,通常使用系统级抑制文件来防止报告这些泄漏。谢谢,我将研究如何设置suppression file.Pass-in--gen suppressions=yes以获得相应的抑制,并直接删除代码中的行,使其在不同代码路径下显示时更易于回收
==26151== 32 bytes in 1 blocks are still reachable in loss record 28 of 85
==26151==    at 0x10000850B: malloc (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==26151==    by 0x1002BC7DF: __Balloc_D2A (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002B9533: __rv_alloc_D2A (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002B9B3A: __dtoa (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002E1D52: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x10030A9AE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002EF154: _vsnprintf (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002EF1B3: vsnprintf_l (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002DF5F7: snprintf_l (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x100000ECA: main (leak.cpp:10)
==26151== 
==26151== 36 bytes in 1 blocks are still reachable in loss record 30 of 85
==26151==    at 0x10000850B: malloc (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==26151==    by 0x1002BC7DF: __Balloc_D2A (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002BD055: __d2b_D2A (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002B986B: __dtoa (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002E1D52: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x10030A9AE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002EF154: _vsnprintf (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002EF1B3: vsnprintf_l (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002DF5F7: snprintf_l (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x100000ECA: main (leak.cpp:10)
==26151== 
==26151== 80 bytes in 1 blocks are still reachable in loss record 47 of 85
==26151==    at 0x10000850B: malloc (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==26151==    by 0x1002BC736: __Balloc_D2A (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002BD055: __d2b_D2A (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002B986B: __dtoa (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002E1D52: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x10030A9AE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002EF154: _vsnprintf (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002EF1B3: vsnprintf_l (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x1002DF5F7: snprintf_l (in /usr/lib/system/libsystem_c.dylib)
==26151==    by 0x100000ECA: main (leak.cpp:10)
$ otool -l /usr/lib/system/libsystem_c.dylib | grep -A5 ID_
          cmd LC_ID_DYLIB
      cmdsize 64
         name /usr/lib/system/libsystem_c.dylib (offset 24)
   time stamp 1 Thu Jan  1 01:00:01 1970
      current version 1044.10.1
compatibility version 1.0.0