2016-02-10 1 views
2

На данный момент я изучаю C с удивительным learncodethehardway series. я столкнулся следующее:Ошибки Valgrind на Mac OS X для printf a double

Я скомпилировать следующий код и все выглядит совершенно нормально для меня:

#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) 

Я не понимаю. Нет ничего плохого в моей линии : 10 не так ли?

THX много.

+0

Это ложное срабатывание подавлено на моей машине с последними Valgrind (v3.12.0) и El Capitan. –

ответ

2

К сожалению, библиотеки, используемые printf, не всегда ведут себя идеально. Valgrind замечает все ошибки - не только те, которые вы сделали, но каждая ошибка, возникшая в стандартной реализации библиотеки C на OSX, например.

Некоторые из этих «ошибок» могут быть фактическими ошибками (что довольно редко), другие, скорее всего, небольшие ярлыки, которые взяли разработчики библиотеки, которые, возможно, не совсем корректны для Valgrind. Одна из таких вещей заключается в том, чтобы полагаться на операционную систему , чтобы очистить и освободить всю оставшуюся память при выходе программы - когда в педантичном мире программа должна освободить всю память до выхода. Однако это перестало быть строго необходимым где-то около дней DOS и AmigaOS.

Я не говорю, что это обязательно то, что вы видите в этой ошибке, но вам нужно помнить о том, что говорит Вальгринд.

Чтобы использовать Valgrind на практике, вам может потребоваться файл подавления, который удаляет сообщения об ошибках, связанные с системными библиотеками. Вот несколько недавних (январь 2015) blog post about this issue, которые возникли именно из-за «обучения C трудным способом» на OSX.

+0

Спасибо! Вопрос: Сводка утечки суммирует потерянные в любом случае - независимо от того, я отклонил ошибки или нет. Это нормальное поведение? – jntme

+0

@bananatreedad, ваш код ничего не выделяет, поэтому мне придется угадать «да, нормальное поведение». Обратите внимание, что в нем упоминается objc runtime, т. Е. Цель C. Если вы действительно этого захотите, вы можете изучить компиляцию и привязку своего кода без библиотек времени выполнения Objective C. Это может привести к ошибке. Valgrind действительно хорош в любом случае, но вы все равно можете смотреть на * дополнительные * ошибки, которые появляются из вашего собственного кода, а не из библиотек. –