推荐一招:gcc如何忽略第三方库引发的告警
2018-02-28 本文已影响51人
而立不惑之年
问题提出
业务代码使用了google buffer以后,编译时会有大量告警,导致CI失败。告警如图:
编译告警
问题解决
在CMake中可以在CMakefiles实现目录和文件来忽略告警。
- 对于cpp文件:
set_property(
SOURCE PythonHelper.cpp
APPEND_STRING
PROPERTY COMPILE_FLAGS
"-Wno-shadow -Wno-conversion -Wno-sign-conversion -Wno-format-security -Wno-format-nonliteral"
)
- 对于目录:
set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG")
因为头文件的包含关系,很多时候处理时会扩大范围,导致忽略的太多,操作起来不方便。利用代码可以精准实现忽略处理,思路:
参考《6.61.12 Diagnostic Pragmas》可以解决。示例代码:
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wall"
#pragma GCC diagnostic ignored "-Wconversion"
#pragma GCC diagnostic ignored "-Wsign-conversion"
#pragma GCC diagnostic ignored "-Wshadow"
#endif
#include <google/protobuf/descriptor.h>
#include <google/protobuf/message.h>
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif
特殊情况说明
- diagnostic ignored不识别多个告警写一行情况,也不报错。
#pragma GCC diagnostic ignored "-Wall -Wformat=2 -Wconversion -Wsign-conversion -Wshadow"
- 如果需要忽略 -Wformat=2,应该使用忽略-Wformat。
//编译错误
#pragma GCC diagnostic ignored "-Wformat=2"
//正确
#pragma GCC diagnostic ignored "-Wformat"
错误