仍然可以使用puts和printf访问

时间:2014-11-10 14:54:32

标签: c macos valgrind

Valgrind报告仍然可以发现"错误"关于printf和puts等功能。我真的不知道该怎么做。我需要摆脱它,因为它是一个学校项目,并且根本没有错误。我该如何处理?从报告我可以看到这些函数使用malloc,但我一直以为他们自己处理内存,对吧? 我使用的是Mac OS X,这可能是valgrind和操作系统之间的问题吗?

示例代码:错误出现在任何使用的puts或printf上

void twittear(array_t* array_tweets, hash_t* hash, queue_t* queue_input){

    char* user = queue_see_first(queue_input);
    char key[1] = "@";

    if (!user || user[0] != key[0]) {
        puts("ERROR_WRONG_COMAND");
        return;
    }

    queue_t* queue_keys = queue_create();
    char* text = join_text(queue_input, queue_keys);

    if (!text) {
        puts("ERROR_TWEET_TOO_LONG");
            queue_destroy(queue_keys, NULL);
        return;
    }

    int id = new_tweet(array_tweets, text);
    while (!queue_is_empty(queue_keys))
        hash_tweet(hash, queue_dequeue(queue_keys), id);
    queue_destroy(queue_keys, NULL);
    printf("OK %d\n", id);
}

ERROR:

==1954== 16,384 bytes in 1 blocks are still reachable in loss record 77 of 77
==1954==    at 0x47E1: malloc (vg_replace_malloc.c:300)
==1954==    by 0x183855: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==1954==    by 0x198217: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==1954==    by 0x1B1158: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==1954==    by 0x1B16AF: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==1954==    by 0x188B29: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==1954==    by 0x18696F: printf (in /usr/lib/system/libsystem_c.dylib)
==1954==    by 0x1000036F3: twittear (main.c:138)
==1954==    by 0x100003C8D: main (main.c:309

1 个答案:

答案 0 :(得分:1)

Valgrind在Mac OS X上有些慌乱;它没有完全抑制某些系统库。 (也就是说,它没有正确地忽略一些预期的"泄漏。)结果通常会包含一些像这样的虚假结果,以及由于{{1}等函数的优化而导致的一些缓冲区溢出}。

我的建议?避免在Mac OS X上使用valgrind,除非您非常熟悉该工具。在Linux系统上编译和测试您的应用程序以获得最佳结果。