【问题标题】:how to find uninitialized stack variable如何找到未初始化的堆栈变量
【发布时间】:2014-12-15 15:25:14
【问题描述】:

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

谢谢。

【问题讨论】:

  • 试试 valgrind,它会找到未初始化变量的读取并打印堆栈跟踪。
  • 您可以使用即将推出的 CLang 和 GCC 版本中新的和改进的 UBSanitizer!
  • 编译时开启所有警告。或者使用任意数量的静态分析器。 (我不会提到我曾经工作过的那个,但它非常昂贵并且最好。找一个便宜的免费的:这个错误对于工具来说并不难找到。)

标签: c++ c stack intel icc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用 cmets 中建议的 -ftrapuv 或 Valgrind 的 memcheck 可以工作,但这些是动态分析,只会捕获运行时执行的错误;如果您的测试执行没有使用有缺陷的代码,那么这些工具将无济于事。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2019-01-01
      相关资源
      最近更新 更多