Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Valgrind报告一个非常简单的C程序的错误_C_Valgrind - Fatal编程技术网

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

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

我正在学习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 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