C 优化标志之前运行的valgrind测试的有效性

C 优化标志之前运行的valgrind测试的有效性,c,gcc,optimization,arm,valgrind,C,Gcc,Optimization,Arm,Valgrind,我遇到一个问题,在Valgrind和optimization标志打开时,我的代码无法正确运行 我正在测试的可执行代码是一个简单的精简包装器,它围绕着我编写的数值计算库。代码对有效性进行了测试,我可以打印各种调试信息(包括库结果的有效性) 当使用-O3编译库时(与-O2或更低版本相比),从命令行运行的可执行文件将正确运行并输出预期结果 当在valgrind下运行相同的可执行文件时,输出不正确,valgrind抱怨内存访问(可能是由于临时结果错误-由打印输出验证-干扰分配) 通过优化-O2,无论是在

我遇到一个问题,在Valgrind和optimization标志打开时,我的代码无法正确运行

我正在测试的可执行代码是一个简单的精简包装器,它围绕着我编写的数值计算库。代码对有效性进行了测试,我可以打印各种调试信息(包括库结果的有效性)

当使用
-O3
编译库时(与
-O2
或更低版本相比),从命令行运行的可执行文件将正确运行并输出预期结果

当在valgrind下运行相同的可执行文件时,输出不正确,valgrind抱怨内存访问(可能是由于临时结果错误-由打印输出验证-干扰分配)

通过优化
-O2
,无论是在Valgrind环境下还是在隔离环境下,一切都可以正常工作

我意识到使用更高优化运行Valgrind的潜在问题(尽管我还没有找到关于我遇到的确切问题的讨论)。有鉴于此,我的问题是:

假设测试的其他方面(即数据有效性测试)仍然正确,我可以相信GCC启用优化不会导致通过Valgrind的代码无效吗

换句话说,我是否需要用更高的优化运行Valgrind,以确信用较低优化测试的Valgrind的一切仍然正常


有关更多信息,在ARM 32位上运行时会遇到此问题。在x86 64位上,所有优化似乎都很好。

高优化级别可能会导致生成的代码不正确或更慢。您可以查看以查看启用了哪些额外标志
-O3
,然后在使用“仅”
-O2
时逐个添加。当您的程序停止工作时,您应该知道导致它的标志。请注意,多个标志可能会导致奇怪的行为,或某些优化组合。此外,永远不要在启用优化的情况下进行调试,这可能会扭曲结果,并使单步执行代码或设置断点变得困难或不可能。@JoachimPileborg Yes,这很清楚:)。我的问题就是:是否存在这样一种情况,即没有优化的测试会导致优化,从而可能导致问题?实际上,我已经尝试独立地打开每个标志(使用
gcc-Q--help=optimizers
的结果以及您引用的文档),但我无法复制这个问题!当然,确实存在大量未定义的行为,你在实践中可以侥幸逃脱,直到一个特别积极的优化突然将地毯从你下面拉出来。查看所有关于发布应用程序调试版本的恐怖故事,因为发布版本无法工作…也许
-pedantic
是我在这里的朋友。。。