当前位置:  开发笔记 > 运维 > 正文

Valgrind在c库中的错误?

如何解决《Valgrind在c库中的错误?》经验,为你挑选了1个好方法。

Valgrind显示出8号错误的未初始化值.偶尔,下面的条件跳转未初始化的值错误.

我正在做的就是使用gcc附带的stdc ++库和内置的vsnprintf打印格式化的字符串.

这是一个名为format的方法,它是自定义字符串类的一部分.现在怎么办?一切看起来都正确 错误似乎在_itoa.c中.但是我所能想到的就是在外面做的不是使用这个功能,这是不太可能的!

==4229== Memcheck, a memory error detector
==4229== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==4229== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==4229== Command: ./test
==4229== 
==4229== Use of uninitialised value of size 8
==4229==    at 0x54A3DF1: _itoa_word (_itoa.c:196)
==4229==    by 0x54A5138: vfprintf (vfprintf.c:1613)
==4229==    by 0x555C74F: __vsnprintf_chk (vsnprintf_chk.c:65)
==4229==    by 0x407E57: myString::format(char const*, ...) (stdio2.h:79)
==4229==    by 0x419D14: ID::toString() (id.cpp:151)
==4229==    by 0x41D03D: main (test.cpp:126)
==4229== 
==4229== Conditional jump or move depends on uninitialised value(s)
==4229==    at 0x54A3DF8: _itoa_word (_itoa.c:196)
==4229==    by 0x54A5138: vfprintf (vfprintf.c:1613)
==4229==    by 0x555C74F: __vsnprintf_chk (vsnprintf_chk.c:65)
==4229==    by 0x407E57: myString::format(char const*, ...) (stdio2.h:79)
==4229==    by 0x419D14: ID::toString() (uuid.cpp:151)
==4229==    by 0x41D03D: main (test.cpp:126)
==4229== 
==4229== 
==4229== HEAP SUMMARY:
==4229==     in use at exit: 0 bytes in 0 blocks
==4229==   total heap usage: 6 allocs, 6 frees, 1,340 bytes allocated
==4229== 
==4229== All heap blocks were freed -- no leaks are possible
==4229== 
==4229== For counts of detected and suppressed errors, rerun with: -v
==4229== Use --track-origins=yes to see where uninitialised values come from
==4229== ERROR SUMMARY: 3 errors from 2 contexts (suppressed: 4 from 4)

mark4o.. 6

这是C库中实际查看您的数字以便将其格式化为字符串的位置,它表示您格式化的数字来自未初始化的存储.

添加valgrind选项--track-origins=yes以获取有关未初始化值的原点的更多详细信息.

因为通常复制未初始化的内存,例如结构中的填充,valgrind会跟踪未初始化值的复制,并且在实际使用该值的方式之前不会抱怨,这可能会影响程序的外部可见行为.这可能会使确定未初始化值的原始来源变得混乱,因为它可能在其他任何操作之前已被复制多次.该选项--track-origins=yes跟踪附加信息以精确定位未初始化值的来源,以便在未初始化值最终被使用的情况下显示该信息.



1> mark4o..:

这是C库中实际查看您的数字以便将其格式化为字符串的位置,它表示您格式化的数字来自未初始化的存储.

添加valgrind选项--track-origins=yes以获取有关未初始化值的原点的更多详细信息.

因为通常复制未初始化的内存,例如结构中的填充,valgrind会跟踪未初始化值的复制,并且在实际使用该值的方式之前不会抱怨,这可能会影响程序的外部可见行为.这可能会使确定未初始化值的原始来源变得混乱,因为它可能在其他任何操作之前已被复制多次.该选项--track-origins=yes跟踪附加信息以精确定位未初始化值的来源,以便在未初始化值最终被使用的情况下显示该信息.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有