简体   繁体   English

Mac OS X上的Valgrind错误导致printf double

[英]Valgrind Errors on Mac OS X for printf a double

At the moment I am learning C with the awesome learncodethehardway series . 目前,我正在以很棒的learningcodethehardway系列学习C。 I encountered the following: 我遇到以下情况:

I compile the following code and everything looks totally fine to me: 我编译了以下代码,一切对我来说看起来都很好:

#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;
}

It works also correctly. 它也可以正常工作。

When I run now Valgrind (3.11.0; should be updated for OS X El Capitan ) I get following messages: 现在运行时,Valgrind(3.11.0; 应该在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)

I don't get it. 我不明白 There is nothing wrong with my line:10 isn't it? 我的台词没错:10不是吗?

THX a lot. 多谢。

Unfortunately, the libraries that printf uses, do not always behave in an ideal way. 不幸的是, printf使用的库并不总是以理想的方式运行。 Valgrind will notice all errors - not only the ones you made, but every error made in the standard C library implementation on OSX, for instance. Valgrind将注意到所有错误-不仅是您所犯的错误,还包括OSX上标准C库实现中所犯的每个错误。

Some of those "errors" may be actual bugs (which is pretty rare), others are likely little shortcuts the library developers took, which may not look completely correct to Valgrind. 这些“错误”中的一些可能是实际的错误(这是非常罕见的),而其他的错误可能是库开发人员所采取的小捷径,对于Valgrind而言,这似乎并不完全正确。 One such thing is to rely on the operating system to clear and free all left over memory when a program exits - when in a pedantic world, the program should free all of its memory before exit. 这样的事情是依靠操作系统在程序退出时清除并释放所有剩余的内存,而在繁琐的世界中,程序应在退出之前释放其所有内存。 However, this stopped being strictly necessary somewhere around the days of DOS and AmigaOS . 但是,这在DOSAmigaOS时代的某个地方不再是绝对必要的。

I am not saying this is necessarily what you are seeing in that error, but that you need to be mindful of what Valgrind says. 我并不是说这一定是您在该错误中看到的,但是您需要注意Valgrind所说的。

To use Valgrind in practice, you may want a suppression file, which removes error messages related to system libraries. 要在实践中使用Valgrind,您可能需要一个抑制文件,该文件可以删除与系统库相关的错误消息。 Here is a somewhat recent (January 2015) blog post about this issue which came about exactly because of "learning C the hard way" on OSX. 这是有关此问题的最近(2015年1月) 博客文章,其确切原因是在OSX上“以艰难的方式学习C”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM