我从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 yosemite上。使用此命令brew
通过$ brew install valgrind --HEAD
安装Valgrind。
那么,有谁知道这里的问题是什么?如何修复valgrind错误?
答案 0 :(得分:11)
如果您通过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。
答案 1 :(得分:10)
此问题已针对Darwin 14.3.0(Mac OS X 10.10.2)修复,使用Valgrind r14960 with VEX r3124
表示Xcode6.2,Valgrind r15088
表示Xcode 6.3。
如果您使用的是Macports(在撰写本文时),sudo port install valgrind-devel
将为您提供Valgrind r14960 with VEX r3093
。
这是我的安装Valgrind r14960 with VEX r3124
的构建脚本:
#! /usr/bin/env bash
mkdir -p buildvalgrind
cd buildvalgrind
svn co svn://svn.valgrind.org/valgrind/trunk/@14960 valgrind
cd valgrind
./autogen.sh
./configure --prefix=/usr/local
make && sudo make install
# check that we have our valgrind installed
/usr/local/bin/valgrind --version
(参考:http://calvinx.com/2015/04/10/valgrind-on-mac-os-x-10-10-yosemite/)
我的macports-installed valgrind位于/opt/local/bin/valgrind
。
如果我现在运行
/opt/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6
我将得到与您上面描述的完全相同的错误。 (在https://gist.github.com/calvinchengx/0b1d45f67be9fdca205b使用我的objc.supp
文件)
但如果我跑
/usr/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6
一切都按预期工作,我没有出现系统级内存泄漏错误。
答案 2 :(得分:1)
从this主题判断,我认为valgrind无法保证在您的平台上提供正确的结果。如果可以,请在另一个平台上试用此代码。
罪魁祸首可能是在valgrid本身,也可能是在你的系统printf
的实现中,这两者对你来说都是不切实际的。
Rerun with --leak-check=full to see details of leaked memory.
这可以为您提供有关您遇到的泄漏的更多信息。如果没有任何帮助,您可以创建suppression file以阻止显示错误。