我有一个gcc
/ -Werror
项目,其中启用了多个警告和标志cmake
。
我注意到,当我使用-DCMAKE_BUILD_TYPE=Release
标志cmake
时会检测到一些警告,但是当我不应用以上error: ‘var_name’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
标志时却未检测到。 例如,以下警告之一是:
CMAKE_C_FLAGS
我在这里阅读:Set CFLAGS and CXXFLAGS options using CMake,有多个CMAKE_C_FLAGS_RELEASE
变量用于不同的构建类型,例如PartitionKey
。
我试图将这些变量应用于发行版和调试版,但是这次以上都没有检测到我期望的警告。
我缺少什么?
答案 0 :(得分:2)
CMake的默认/“调试”构建配置文件完全禁用了优化,从而阻止了编译器执行转换和进行静态分析(确定使用未初始化的变量)所需的遍历。虽然在某种程度上可以改善单步源代码行的调试体验,但是您已经发现它隐藏了警告,并且还倾向于隐藏代码中未定义行为的后果。
传统上,“完全禁用非发行版的优化”在面向Unix的开发人员中并不是一件容易的事。这是MSVC世界中常见做法的产物,反映了CMake的起源和用户群。