简体   繁体   English

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

[英]Valgrind reports errors for a very simple C program

I'm learning C language from Learn C The Hard Way . 我正在通过“学习C 艰辛的方式”学习C语言。 I'm on exercise 6 and while I can make it work, valgrind repots a lot of errors. 我正在练习6 ,虽然我可以使它起作用,但是valgrind报告很多错误。

Here's the stripped down minimal program from a file ex6.c : 这是ex6.c文件中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;
}

Content of Makefile is just CFLAGS=-Wall -g . Makefile内容只是CFLAGS=-Wall -g

I compile the program with $ make ex6 (there are no compiler warnings or errors). 我用$ make ex6编译程序(没有编译器警告或错误)。 Executing with $ ./ex6 produces the expected output. $ ./ex6执行会产生预期的输出。

When I run the program with $ valgrind ./ex6 I get errors which I can't solve. 当我使用$ valgrind ./ex6运行程序时,出现无法解决的错误。 Here's the full output: 这是完整的输出:

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

I'm on OS X yosemite. 我正在使用OS X优胜美地。 Valgrind is installed via brew with this command $ brew install valgrind --HEAD . Valgrind是通过安装brew用这个命令$ brew install valgrind --HEAD

So, does anyone know what's the issue here? 那么,有人知道这是什么问题吗? How do I fix the valgrind errors? 如何解决valgrind错误?

If the programme you are running through Valgrind is exactly the one you posted in your question, it clearly doesn't have any memory leaks. 如果您通过Valgrind运行的程序恰好是您在问题中发布的程序,则显然没有任何内存泄漏。 In fact, you don't even use malloc/free yourself! 实际上,您自己甚至都不使用malloc / free!

It looks to me like these are spurious errors / false positives that Valgrind detects on OS X (only!), similar to what happened to myself some time ago . 在我看来,这些都是Valgrind在OS X上(仅!)检测到的虚假错误/误报,类似于一段时间前发生在我身上的情况

If you have access to a different operating system, eg a Linux machine, try to analyze the programme using Valgrind on that system. 如果您可以访问其他操作系统,例如Linux机器,请尝试在该系统上使用Valgrind分析程序。

EDIT: I haven't tried this myself, since I don't have access to a Mac right now, but you should try what M Oehm suggested: try to use a supressions file as mentioned in this other SO question . 编辑:我自己还没有尝试过此操作,因为我现在无法访问Mac,但是您应该尝试M Oehm的建议: 尝试使用另一个SO问题中提到的 supressions 文件

This issue is fixed for Darwin 14.3.0 (Mac OS X 10.10.2) using Valgrind r14960 with VEX r3124 for Xcode6.2 and Valgrind r15088 for Xcode 6.3. 对于使用Valgrind r14960 with VEX r3124 r3124和Xcode 6.3的Valgrind r15088 Darwin 14.3.0(Mac OS X 10.10.2),此问题已修复。

If you are using Macports (at this time of writing), sudo port install valgrind-devel will give you Valgrind r14960 with VEX r3093 . 如果您正在使用Macports(在撰写本文时),那么sudo port install valgrind-devel将为您Valgrind r14960 with VEX r3093

Here's my build script to install Valgrind r14960 with VEX r3124 : 这是我Valgrind r14960 with VEX r3124安装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 

(reference: http://calvinx.com/2015/04/10/valgrind-on-mac-os-x-10-10-yosemite/ ) (参考: http//calvinx.com/2015/04/10/valgrind-on-mac-os-x-10-10-yosemite/

My macports-installed valgrind is located at /opt/local/bin/valgrind . 我的macports安装的valgrind位于/opt/local/bin/valgrind

If I now run 如果我现在跑步

/opt/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6

I will get exactly the same errors you described above. 我将得到与上述完全相同的错误。 (Using my objc.supp file here https://gist.github.com/calvinchengx/0b1d45f67be9fdca205b ) (在这里使用我的objc.supp文件https://gist.github.com/calvinchengx/0b1d45f67be9fdca205b

But if I run 但是如果我跑步

/usr/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6

Everything works as expected and I do not get the system level memory leak errors showing up. 一切都按预期工作,并且我没有出现系统级内存泄漏错误。

Judging from this topic, I assume that valgrind is not guaranteed to give correct results on your platform. 主题来看,我认为不能保证valgrind在您的平台上给出正确的结果。 If you can, try this code on another platform. 如果可以,请在其他平台上尝试此代码。

The culprit is either in valgrid itself or in your system's implementation of printf , both of which would be impractical for you to fix. 罪魁祸首要么在valgrid本身,要么在系统的printf实现中,而这两者对于您都无法修复。

Rerun with --leak-check=full to see details of leaked memory. This should give you some more information about the leak you are experiencing. 这应该为您提供有关所遇到的泄漏的更多信息。 If nothing helps, you can create a suppression file to stop the errors from being displayed. 如果没有帮助,则可以创建一个抑制文件以阻止显示错误。

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

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