c - Valgrind 报告一个非常简单的 C 程序的错误

标签 c valgrind

我正在从 Learn C The Hard Way 学习 C 语言.我在 exercise 6虽然我可以让它工作,但 valgrind 报告了很多错误。

这是文件 ex6.c 中精简的最小程序:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char initial = 'A';
    float power = 2.345f;

    printf("Character is %c.\n", initial);
    printf("You have %f levels of power.\n", power);

    return 0;
}

Makefile 的内容就是CFLAGS=-Wall -g

我用 $ make ex6 编译程序(没有编译器警告或错误)。使用 $ ./ex6 执行会产生预期的输出。

当我使用 $ valgrind ./ex6 运行程序时,出现无法解决的错误。这是完整的输出:

==69691== Memcheck, a memory error detector
==69691== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==69691== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info
==69691== Command: ./ex6
==69691==
--69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option
--69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times)
--69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times)
==69691== Conditional jump or move depends on uninitialised value(s)
==69691==    at 0x1003FBC3F: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib)
==69691==    by 0x1001EFBB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x1001FA005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x100000F1B: main (ex6.c:8)
==69691==
Character is A.
==69691== Invalid read of size 32
==69691==    at 0x1003FBC1D: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib)
==69691==    by 0x1001EFBB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x1001FA005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib)
==69691==    by 0x100000F31: main (ex6.c:9)
==69691==  Address 0x100809680 is 32 bytes before a block of size 32 in arena "client"
==69691==
You have 2.345000 levels of power.
==69691==
==69691== HEAP SUMMARY:
==69691==     in use at exit: 39,365 bytes in 429 blocks
==69691==   total heap usage: 510 allocs, 81 frees, 45,509 bytes allocated
==69691==
==69691== LEAK SUMMARY:
==69691==    definitely lost: 16 bytes in 1 blocks
==69691==    indirectly lost: 0 bytes in 0 blocks
==69691==      possibly lost: 13,090 bytes in 117 blocks
==69691==    still reachable: 26,259 bytes in 311 blocks
==69691==         suppressed: 0 bytes in 0 blocks
==69691== Rerun with --leak-check=full to see details of leaked memory
==69691==
==69691== For counts of detected and suppressed errors, rerun with: -v
==69691== Use --track-origins=yes to see where uninitialised values come from
==69691== ERROR SUMMARY: 5 errors from 2 contexts (suppressed: 0 from 0)

我在 OS X 优胜美地。 Valgrind 通过 brew 使用此命令安装 $ brew install valgrind --HEAD

那么,有人知道这里的问题是什么吗?如何修复 valgrind 错误?

最佳答案

如果您通过 Valgrind 运行的程序正是您在问题中发布的程序,那么它显然没有任何内存泄漏。事实上,您自己甚至都不使用 malloc/free!

在我看来,这些是 Valgrind 在 OS X 上(仅!)检测到的虚假错误/误报,类似于 what happened to myself some time ago .

如果您可以访问不同的操作系统,例如一台 Linux 机器,尝试在该系统上使用 Valgrind 分析程序。

编辑:我自己还没有尝试过,因为我现在无法访问 Mac,但你应该尝试一下 M Oehm 建议:try to use a supressions file as mentioned in this other SO question .

关于c - Valgrind 报告一个非常简单的 C 程序的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27842968/

相关文章:

c - 指针 vector 中值的神秘变化

c - 如何显示浮点值的编码

c - 在c中使用带有**的指针

shared-libraries - 您如何告诉Valgrind完全禁止显示特定的.so文件?

c++ - 查找正在运行的 valgrind 版本

c - 使用 C 进行套接字编程中的 recvfrom

c - 在 C 中与 atoi() 一起使用

c - OS X 上的 GCC 分配的内存比预期的多

c++ - 如果我将 unsigned int 分配给 signed int,是否可以有未初始化的位

c++ - 调试堆上损坏的对象