如何让clang对简单的窄化转换场景输出对应警告提示
方案1:添加编译警告参数检测
你之前使用的-Wall和-Wextra默认不包含隐式类型转换的窄化检查,需要额外添加-Wconversion参数:
clang -Wall -Wextra -Wconversion 测试代码文件名.c
使用该命令编译你的测试代码时,会直接输出如下警告:
warning: implicit conversion loses integer precision: 'int' to 'short' [-Wconversion]
foo(i);
如果需要彻底阻断这类风险提交,可以追加-Werror=conversion参数,将此类警告直接转为编译错误。
方案2:修复clang-tidy检查配置
cppcoreguidelines-narrowing-conversions规则未生效的核心原因是调用时未同步编译参数给clang-tidy,正确调用方式如下:
clang-tidy --checks=cppcoreguidelines-narrowing-conversions 测试代码文件名.c -- -std=c11
其中--之后的内容是传递给Clang前端的编译选项,clang-tidy需要基于这些参数识别目标平台的类型长度,才能正确判断窄化风险。
如果需要调整检查严格度,可以在项目的.clang-tidy配置文件中添加如下配置:
CheckOptions: - key: cppcoreguidelines-narrowing-conversions.WarnOnIntegerNarrowing value: true
方案3:静态分析器启用对应检查项
默认的clang -analyze未开启整数截断相关的检查器,需要手动指定启用:
clang --analyze -Xanalyzer -analyzer-checker=alpha.security.IntegerTruncation 测试代码文件名.c
启用该检查器后也会输出对应的窄化转换风险提示。
内容的提问来源于stack exchange,提问作者Chip Grandits
相关产品推荐
相关产品推荐

