2014-10-20 48 views
1

我收到了遗留代码(c),它似乎在不同的时间产生不同的结果。 我能够一直使用intel的编译器和编译器标志-ftrapuv重现这个问题,这个工作非常好,我能够确定未初始化的变量是一些堆栈变量。 问题是,下一个阶段是什么? 有谁知道如何打印所有堆栈变量的回溯? (或者直接打印堆栈内容) 有没有人有建议或知道英特尔可能如何提供帮助?或者我应该继续解决这个问题?如何找到未初始化的堆栈变量

谢谢。

+8

尝试Valgrind的,它发现未初始化变量的读取和打印堆栈跟踪。 – 2014-10-20 15:21:32

+7

您可以使用即将推出的CLang和GCC版本中的新改进UBSanitizer! – rodrigo 2014-10-20 15:21:39

+0

编译时打开所有警告。或者使用任何一种静态分析仪。 (我不会提到我曾经工作过的那个,但它是非常昂贵和最好的。找到一个更便宜的免费的:这个错误并不难找到。) – 2014-10-20 15:35:03

回答

2

使用-ftrapuv或Valgrind的memcheck可以在注释中使用,但这些是动态分析,只会捕获在运行时执行的错误;如果您的测试执行不执行错误代码,这些工具将不会有帮助。

幸运的是,使用未初始化的堆栈变量通常可以通过静态方式轻松检测到,并且您的编译器有可以帮助您理解的标志。海湾合作委员会和英特尔icc都支持-Wuninitialized标志,该标志将打印关于违规代码的警告。 gcc还支持一个-Wmaybe-uninitialized标志,当有某些代码路径时,它会发出警告,其中变量可能在其上未初始化;请注意,后面的分析容易出现误报。