如何找到未初始化的堆栈变量

时间:2014-10-20 15:20:10

标签: c++ c stack intel icc

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

感谢。

2 个答案:

答案 0 :(得分:2)

根据评论中的建议使用-ftrapuv或Valgrind的memcheck可以工作,但这些是动态分析,只能捕获在运行时执行的错误;如果您的测试执行没有运行错误的代码,这些工具将没有用处。

幸运的是,使用未初始化的堆栈变量通常可以很容易地静态检测,并且您的编译器有标记可以帮助您捕获它。 gcc和Intel的icc都支持-Wuninitialized标志,该标志将打印有关违规代码的警告。 gcc还支持-Wmaybe-uninitialized标志,当有某些代码路径时,该标志会在未初始化时使用该变量;请注意,后一种分析容易出现误报。

答案 1 :(得分:0)

您可以使用sparse来执行代码的静态分析。它是开源和非常强大的工具。链接在这里: