我有一个 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
。
我尝试将这些变量应用于发布和调试版本,但这次以上都没有检测到我期望的警告。
我错过了什么?
最佳答案
CMake 的默认/“调试”构建配置文件完全禁用优化,这会阻止编译器通过执行转换和静态分析来确定变量是否未初始化使用。虽然这在某种程度上改善了单步源代码行的调试体验,但正如您发现的那样,它隐藏了警告,而且往往会隐藏代码中未定义行为的后果。
传统上,“对非发布版本完全禁用优化”在面向 unix 的开发人员中并不受欢迎。这是 MSVC 世界中常见做法的延续,反射(reflect)了 CMake 的起源和用户群。
关于c - 在 cmake 调试版本中未检测到 GCC 警告,但在发布版本中检测到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57082513/