【问题标题】:GCC warnings not detected in cmake debug builds, but detected in release ones在 cmake 调试版本中未检测到 GCC 警告,但在发布版本中检测到
【发布时间】:2019-07-17 18:54:52
【问题描述】:

我有一个cmake/gcc 项目,我在其中启用了几个警告和标志-Werror

我注意到当我使用cmake 标志-DCMAKE_BUILD_TYPE=Release 时会检测到一些警告,但当我不应用上述cmake 标志时不会出现这些警告。 例如,这些警告之一是:

error: ‘var_name’ may be used uninitialized in this function [-Werror=maybe-uninitialized]

我在这里读到:Set CFLAGS and CXXFLAGS options using CMake 有几个 CMAKE_C_FLAGS 变量用于不同的构建类型,例如,CMAKE_C_FLAGS_RELEASE

我已尝试将这些变量应用于发布和调试版本,但这次以上都没有检测到我预期的警告。

我错过了什么?

【问题讨论】:

  • 不存在 of CMAKE_BUILD_TYPE 变量设置并不意味着 Debug 构建。项目可能会默认设置构建类型,但如果不这样做,则构建类型为“无”,并且没有应用特定标志

标签: c gcc cmake


【解决方案1】:

CMake 的默认/“调试”构建配置文件完全禁用优化,这会阻止编译器通过执行转换和静态分析来确定使用未初始化的变量。虽然这在某种程度上改善了单步源代码行的调试体验,但正如您发现的那样,它隐藏了警告并且还倾向于隐藏代码中未定义行为的后果。

传统上,“对非发布版本完全禁用优化”在面向 unix 的开发人员中并不存在。这是 MSVC 世界中常见做法的继承,反映了 CMake 的起源和用户群。

【讨论】:

  • 如何告诉 gcc 从不自动初始化变量?
  • @Dan:这不是自动初始化变量。是什么让你认为它是?问题是编译器需要通过分析程序流程来确定变量在访问时是否未初始化,仅作为优化的一部分发生。 “非优化模式”对于现代编译器来说是一件非常不自然的事情,并且缺乏进行任何有用分析的能力。
  • 我使用的是std c99,据我了解,在使用这个标准时,它将局部变量初始化为0(似乎在发布模式下除外)
  • @Dan:不。这正是他们所占据的内存中出现的情况。它们没有被初始化。
  • "... 禁用优化,这会阻止编译器传递执行转换和静态分析所需的确定变量未初始化使用的情况。" - 您确定吗?据我所知,优化 (-O<something>) 和警告选项 (-W<something>) 完全独立
猜你喜欢
  • 2018-04-18
  • 1970-01-01
  • 2017-02-17
  • 2010-09-08
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2013-03-12
相关资源
最近更新 更多