【问题标题】:Valgrind Errors on Mac OS X for printf a doubleMac OS X 上的 Valgrind 错误,用于 printf a double
【发布时间】:2016-05-20 09:30:05
【问题描述】:

目前我正在用很棒的learncodethehardway series 学习 C。 我遇到了以下情况:

我编译了以下代码,对我来说一切都很好:

#include <stdio.h>

int main(int argc, char *argv[]) {

    int bugs = 100;
    double bug_rate = 1.2;

    printf("You have %d bugs a the imaginary rate of %f!\n", bugs, bug_rate);

    return 0;
}

它也可以正常工作。

当我现在运行 Valgrind (3.11.0;should be updated for OS X El Capitan) 时,我收到以下消息:

==18896== Memcheck, a memory error detector
==18896== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==18896== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==18896== Command: ./ex7
==18896==
You have 100 bugs a the imaginary rate of 1.200000!
==18896==
==18896== HEAP SUMMARY:
==18896==     in use at exit: 26,081 bytes in 188 blocks
==18896==   total heap usage: 272 allocs, 84 frees, 32,321 bytes allocated
==18896==
==18896== 148 (80 direct, 68 indirect) bytes in 1 blocks are definitely lost in loss record 42 of 65
==18896==    at 0x100007EA1: malloc (vg_replace_malloc.c:303)
==18896==    by 0x1001C58D6: __Balloc_D2A (in /usr/lib/system/libsystem_c.dylib)
==18896==    by 0x1001C621F: __d2b_D2A (in /usr/lib/system/libsystem_c.dylib)
==18896==    by 0x1001C2877: __dtoa (in /usr/lib/system/libsystem_c.dylib)
==18896==    by 0x1001EB3E6: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==18896==    by 0x1002146C8: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==18896==    by 0x1001EA389: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==18896==    by 0x1001E8223: printf (in /usr/lib/system/libsystem_c.dylib)
==18896==    by 0x100000F32: main (ex7.c:10)
==18896==
==18896== 2,064 bytes in 1 blocks are possibly lost in loss record 59 of 65
==18896==    at 0x10000821C: malloc_zone_malloc (vg_replace_malloc.c:305)
==18896==    by 0x1004F6EFD: _objc_copyClassNamesForImage (in /usr/lib/libobjc.A.dylib)
==18896==    by 0x1004EA182: protocols() (in /usr/lib/libobjc.A.dylib)
==18896==    by 0x1004EA093: readClass(objc_class*, bool, bool) (in /usr/lib/libobjc.A.dylib)
==18896==    by 0x1004E7C13: gc_init (in /usr/lib/libobjc.A.dylib)
==18896==    by 0x1004EF24E: objc_initializeClassPair_internal(objc_class*, char const*, objc_class*, objc_class*) (in /usr/lib/libobjc.A.dylib)
==18896==    by 0x1004FC132: layout_string_create (in /usr/lib/libobjc.A.dylib)
==18896==    by 0x1004EA83C: realizeClass(objc_class*) (in /usr/lib/libobjc.A.dylib)
==18896==    by 0x1004EA300: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==18896==    by 0x1004EA2E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==18896==    by 0x1004EA2E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==18896==    by 0x1004EA2E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==18896==
==18896== LEAK SUMMARY:
==18896==    definitely lost: 80 bytes in 1 blocks
==18896==    indirectly lost: 68 bytes in 2 blocks
==18896==      possibly lost: 2,064 bytes in 1 blocks
==18896==    still reachable: 0 bytes in 0 blocks
==18896==         suppressed: 23,869 bytes in 184 blocks
==18896==
==18896== For counts of detected and suppressed errors, rerun with: -v
==18896== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 18 from 18)

我不明白。我的 line:10 没有任何问题,不是吗?

非常感谢。

【问题讨论】:

  • 这个误报在我的机器上被最新的 Valgrind (v3.12.0) 和 El Capitan 抑制了。

标签: c macos valgrind


【解决方案1】:

不幸的是,printf 使用的库并不总是以理想的方式运行。 Valgrind 会注意到所有错误——不仅是你犯的错误,还有在 OSX 上的标准 C 库实现中犯的每一个错误。

其中一些“错误”可能是实际的错误(这非常罕见),其他可能是库开发人员采取的小捷径,这对于 Valgrind 来说可能看起来并不完全正确。其中一件事是依赖操作系统在程序退出时清除和释放所有剩余的内存 - 在一个迂腐的世界中,程序应该在退出前释放所有内存。然而,在 DOSAmigaOS 的日子里,这不再是绝对必要的。

我并不是说这一定是您在该错误中看到的内容,而是您需要注意 Valgrind 所说的内容。

要在实践中使用 Valgrind,您可能需要一个抑制文件,它可以删除与系统库相关的错误消息。这是最近的(2015 年 1 月)blog post about this issue,它的出现正是因为在 OSX 上“以艰难的方式学习 C”。

【讨论】:

  • 谢谢!问题:泄漏总结总结了丢失的东西——不管我是否抑制了错误。这是正常行为吗?
  • @bananatreedad,你的代码没有分配任何东西,所以我不得不猜测“是的,正常行为”。请注意,它提到了 objc 运行时,即 Objective C。如果你真的想要,你可以考虑在没有 Objective C 运行时库的情况下编译和链接你的代码。这可能会减少错误。无论如何,Valgrind 确实很棒,您仍然可以查看其他错误,这些错误似乎来自您自己的代码而不是来自库。
猜你喜欢
  • 2017-06-17
  • 1970-01-01
  • 2016-03-28
  • 2013-01-07
  • 2019-04-01
  • 2011-10-19
  • 1970-01-01
  • 2014-04-09
  • 2016-08-07
相关资源
最近更新 更多