c - 在 cmake 调试版本中未检测到 GCC 警告,但在发布版本中检测到



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

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

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

我在这里阅读了:使用 CMake 设置 CFLAGS 和 CXXFLAGS 选项,不同的构建类型有几个CMAKE_C_FLAGS变量,例如CMAKE_C_FLAGS_RELEASE

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

我错过了什么?

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

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

最新更新