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

标签 c gcc cmake

我有一个 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/

相关文章:

c - 写入标准输出和文件

javascript - Javascript 中的 C 宏等效项

c++ - 将 -Wtype-limits 与类型通用代码一起使用

c++ - 将 poco 静态库链接到 cmake 中的目标

cmake - 如何自定义 cmake 输出

qt - 使用 CMake 测试支持的 Qt 版本

c - 将数组地址作为函数参数传递

c - 在 C 中是否可以调用一个不等待 sleep 发生而 sleep 的函数?

c++ - 按名称或签名计算函数调用。海合会,C++

c++ - GCC中的函数静态变量是线程安全的吗?