Valgrind报告一个非常简单的C程序的错误
我正在学习C语言。我在工作,虽然我能让它工作,但valgrind报告了很多错误 下面是从文件Valgrind报告一个非常简单的C程序的错误,c,valgrind,C,Valgrind,我正在学习C语言。我在工作,虽然我能让它工作,但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
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;
}
我在优胜美地操作系统上。Valgrind通过brew
使用此命令安装$brew安装Valgrind--HEAD
那么,有人知道这里的问题是什么吗?如何修复valgrind错误?如果您正在运行的valgrind程序正是您在问题中发布的程序,那么它显然没有任何内存泄漏。事实上,你甚至不使用malloc/free 在我看来,这些都是Valgrind在OSX上检测到的虚假错误/误报(仅限!),类似于 如果您可以访问不同的操作系统,例如Linux机器,请尝试在该系统上使用Valgrind分析程序 编辑:我自己没有尝试过,因为我现在没有访问Mac的权限,但你应该尝试什么 M Oehm建议:。从主题判断,我假设valgrind不能保证在您的平台上给出正确的结果。如果可以,请在其他平台上尝试此代码 罪魁祸首要么是valgrid本身,要么是您的系统实现的
printf
,这两个问题都无法解决
使用--leak check=full重新运行以查看泄漏内存的详细信息。
这将为您提供有关所遇到泄漏的更多信息。如果没有任何帮助,您可以创建一个对话框来阻止错误显示。对于Darwin 14.3.0(Mac OS X 10.10.2),此问题已通过使用Xcode6.2的Valgrind r14960和VEX r3124
以及Xcode 6.3的Valgrind r15088
解决
如果您正在使用Macports(撰写本文时),sudo-port安装valgrind-devel
将为您提供带有VEX r3093的valgrind r14960
下面是我要用VEX r3124安装Valgrind r14960的构建脚本:
#! /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
(参考资料:)
安装在valgrind上的My macports位于/opt/local/bin/valgrind
如果我现在跑
/opt/local/bin/valgrind--leak check=yes--suppressions=`pwd`/objc.supp./ex6
我将得到与上面描述的完全相同的错误。(此处使用我的objc.supp
文件)
但如果我跑
/usr/local/bin/valgrind--leak check=yes--suppressions=`pwd`/objc.supp./ex6
一切正常,我没有发现系统级内存泄漏错误。是否链接到某个外部库?在我的Linux上,您的示例没有报告任何错误。在相关链接侧栏中,有@IngoLeonhardt:float
类型的变量参数被提升为double
,因此这应该不是问题。(正确的原型在
中,包括在内。)这是--partial loads ok=yes
应该修复的误报的特征。具有相同问题和稍微不同答案数组的类似线程:我找不到OS X Yosemite的抑制文件。SA的回答对Valgrind的输出没有任何影响。另一方面,使用linux在vagrant中执行相同的步骤产生了干净的Valgrind输出,我在自己的机器上确认了这一点。我在Mac OS X上复制了这个简单的程序,使用Valgrind运行,并获得了一个条件跳转。不幸的是,您当前无法为“大小为32的无效读取”创建抑制文件。Darwin端口中存在此新错误,但不支持抑制大小大于16的错误。实现这一点应该是时间问题(听起来像是一个微不足道的修复)。
#! /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