在我曾经工作过的一家公司,构建系统被设置为仅在更改的代码中将警告转化为错误。它的工作原理是生成一个diff(通常是在您试图合并的分支和master
之间(,然后将该diff提供给某个编译工具,该工具只会在提供的diff中产生警告。
这很好,因为它允许您弃用某些功能,并让构建系统阻止人们引入该功能的新用途,然后在以后删除该功能的旧用途。
不幸的是,在我离开公司之前,我没有仔细查看设置,也不知道如何复制它。我的问题是:我如何复制这个设置?
问题被标记为Clang,但我也对使用其他编译器工具的答案感兴趣。
如果必须实现它,我的第一个想法是:
- 获取合并文件
- 分析差异,找出哪些区域发生了变化
- 生成一个新文件并注入
#pragma
指令1,这些指令在本地启用/禁用更改区域周围的警告 - 还要注入
#line
指令,使其看起来像来自原始文件的警告/错误 - 编译修改后的文件并保存编译器警告/错误
- 删除修改后的文件
- 向用户展示编译器诊断
1例如。https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-GCC的Pragmas。
Clang支持GCC的#pragma diagnostic
。
例如:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
// ... changed code here ...
#pragma GCC diagnostic pop
MSVC也有类似的东西:
#pragma warning(push, 3)
// ... changed code here ...
#pragma warning(pop)