ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CodeQL 1.26 C/C++ 分析改进解析:查询精度调整与库级污点流模型扩展

2026/9/25 8:10:05 拓冰建站 浏览量
CodeQL 1.26 C/C++ 分析改进解析:查询精度调整与库级污点流模型扩展 静态分析SAST应用安全漏洞扫描代码质量【免费下载链接】codeqlCodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security项目地址https://gitcode.com/gh_mirrors/co/codeql点击查看免费下载本文基于 CodeQL 仓库中 1.26 版本的 C/C 分析变更说明change-notes/1.26/analysis-cpp.md逐项解读该版本对 C/C 查询与标准库 QL 库带来的全部变化4 条既有查询的误报修复与精度调整、BlockStmt类改名以及 models 库对 STL 容器、std::string、智能指针等新增污点流建模和SimpleRangeAnalysis乘法范围分析能力。读完本文你能准确评估 1.26 升级对现有 C/C 代码扫描结果的影响面并在编写或维护 QL 查询时正确使用这些新增的库能力。一、版本变更总览1.26 版本的 C/C 分析变更覆盖两类对象既有查询4 条查询被修改其中 2 条修复了误报false positive、1 条修正了结果正确性、1 条主动降低了精度等级QL 库一个类被改名会破坏下游查询编译、models 库新增大量 STL 污点流模型、范围分析库支持了更多乘法形式。变更说明原文指出这些变化对所有应用中的 C/C 分析生效因此升级 CodeQL 版本后应重点回归验证依赖上述查询和库的定制规则。二、既有查询的变更2.1 Declaration hides parametercpp/declaration-hides-parameter修复模板函数误报该查询用于发现局部变量遮蔽了同名函数参数的可读性问题标记为recommendation级别。1.26 版本的变更是修复了涉及模板函数的误报结果是误报减少。从源码看DeclarationHidesParameter.ql修复的核心在于新增的getConstructedFrom谓词L14-L23/** * Gets the template that a function f is constructed from, or just f if it * is not from a template instantiation. */ Function getConstructedFrom(Function f) { f.isConstructedFrom(result) or not f.isConstructedFrom(_) and result f }模板实例化函数instantiation的参数名可能继承自声明而非定义属于人工产物。getConstructedFrom会把实例化函数映射回其模板原型参数名提取谓词functionParameterNamesL38-L46在取参数名时通过getConstructedFrom(f).getDefinition() fe强制只从模板定义的形参声明中取名字从而避免了把实例化伪影当作真实参数匹配、消除模板场景下的误报。2.2 Inconsistent direction of for loopcpp/inconsistent-loop-direction支持无符号计数器有意回绕该查询标记for 循环的迭代方向与初始化/条件方向矛盾的问题例如递增计数器却以v 0这类永假条件收尾。1.26 版本的变更是查询现在会识别对无符号循环计数器有意intentional的回绕写法误报减少。源码印证了这一机制。在 inconsistentLoopDirection.ql 的illDefinedDecrForStmt谓词中L51-L60对初始值小于终止条件这一误判前提附加了排除条件upperBound(initialCondition) lowerBound(terminalCondition) and ( // exclude cases where the loop counter is unsigned (where wrapping behavior can be used deliberately) v.getUnspecifiedType().(IntegralType).isSigned() or initialCondition.getValue().toInt() 0 )即只有当循环计数器是有符号整数、或初始值确认为 0 时反向递减循环才会被报告对无符号计数器依赖回绕例如for (unsigned i 10; i 0; i--)之外的回绕技巧的写法不再误报。判断本身依赖semmle.code.cpp.rangeanalysis.SimpleRangeAnalysis的upperBound/lowerBound见 L14 导入并用 IR 级DataFlow::localFlowStep追踪初始值到条件处的数据流L49这正是下一节范围分析乘法增强所能进一步受益的场景。2.3 Overflow in uncontrolled allocation sizecpp/uncontrolled-allocation-size精度由 high 降为 medium变更说明指出该查询的精度precision从 high 降为 medium查询仍会运行但结果默认不再在 LGTM 上展示。从源码看TaintedAllocationSize.ql 的元数据与之一致/** * name Uncontrolled allocation size * kind path-problem * problem.severity error * security-severity 8.1 * precision medium * id cpp/uncontrolled-allocation-size * tags reliability * security * external/cwe/cwe-190 * external/cwe/cwe-789 */该查询检测用外部可控大小分配内存的问题CWE-190/CWE-789内部组合了SimpleRangeAnalysis、IR 级TaintTracking、FlowSources与配套的 Bounded.qll用于判断分配大小是否有界。精度降级后该告警仍可作为自定义套件的一部分运行但默认不再直接呈现给用户——这对依赖其默认结果的 CI 流水线是一个值得注意的行为变化。2.4 Comparison result is always the samecpp/constant-comparison乘法表达式的边界推断增强该查询实现位于 PointlessComparison.ql标记比较结果恒定的代码。1.26 版本的变更是对涉及乘法的表达式现在能在更多情况下确定其取值边界结果是整体更正确。这一能力来自SimpleRangeAnalysis库对乘法形式的支持扩展见第三节 3.3查询侧无需改动即自动受益形如if (a * b c)这类包含乘积因子的比较当操作数可证明为无符号或常量时能给出更紧的上下界减少漏报/误报。相关回归测试可见 PointlessComparison 测试目录。三、QL 库的变更3.1 类Block改名为BlockStmt变更说明指出表示{ ... }块语句的 QL 类Block被改名为BlockStmt。仓库源码印证了这一改名——Block.qll 中现定义class BlockStmt extends Stmt, stmt_block {这是一个破坏性变更breaking change任何在查询或.qll包中引用旧Block类型的自定义代码在升级到 1.26 的semmle.code.cpp库后都会编译失败需要全局替换为BlockStmt。改名本身是命名规范化的产物与ForStmt、IfStmt等一致语义不变。3.2 models 库新增大量 STL 污点流模型models 库semmle.code.cpp.models是 C/C 污点分析中建模库函数污点如何穿越的层。1.26 版本一次性扩展了以下污点流taint flow模型新增建模对象说明std::array、std::vector、std::deque、std::list、std::forward_list大量序列容器中的污点流动std::string大幅扩充的字符串污点流std::istream、std::ostream流对象的污点流动std::shared_ptr、std::unique_ptr、std::make_shared、std::make_unique部分智能指针场景的污点流std::pair、std::map、std::unordered_map、std::set、std::unordered_set更多关联容器中的污点流动bcopy传统字节复制函数以容器建模为例StdContainer.qll 为std::array、std::vector、std::deque、std::list和std::forward_list提供模型。实际影响依赖TaintTracking的安全查询SQL/命令注入、XSS 类此前对污点存入 STL 容器后取出这类多步流动常常断链1.26 之后这些路径能被连通安全类查询的检出数量预计会增加同时依赖模型做污点边界的定制规则也应在升级后重新校准。3.3SimpleRangeAnalysis支持乘法形式变更说明指出SimpleRangeAnalysis库现在支持形如e1 * e2与x * e2的乘法前提是e1和e2为无符号或常量。从源码结构看该库是 C/C 查询的范围推断基础inconsistentLoopDirection.ql通过import semmle.code.cpp.rangeanalysis.SimpleRangeAnalysisL14调用其upperBound/lowerBoundTaintedAllocationSize.ql同样导入了它L15。此前乘法表达式的边界往往只能取保守的无上界导致a * b 0、a * b N这类比较无法判定支持无符号/常量乘法后上下界可以实际计算出来。这正是 2.4 节cpp/constant-comparison正确性改进的底层来源——库能力增强会静默地提升多个上层查询的判定能力这是阅读此类变更说明时应关注的传导关系。四、升级与使用建议回归验证定制查询若自有套件引用了Block旧类名或依赖上述 4 条官方查询的结果集合升级 1.26 后应全量重跑并 diff 结果Block→BlockStmt是唯一的编译级破坏点。预期安全告警增多models 库新增的 STL/字符串/流污点模型会让污点追踪类安全查询检出更多真实路径属预期行为而非回归。注意cpp/uncontrolled-allocation-size的展示变化查询仍在执行但默认不再展示 medium 精度结果若流程中需要该告警应在查询套件中显式配置展示策略。利用新的范围分析能力编写自定义算术/边界类查询时可以直接依赖SimpleRangeAnalysis对e1 * e2、x * e2无符号或常量操作数的边界推断减少手写特判。参考文件变更说明change-notes/1.26/analysis-cpp.md查询实现DeclarationHidesParameter.ql、inconsistentLoopDirection.ql、TaintedAllocationSize.ql、PointlessComparison.ql库实现Block.qll、StdContainer.qll测试PointlessComparison 测试赞分享静态分析SAST应用安全漏洞扫描代码质量【免费下载链接】codeqlCodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security项目地址https://gitcode.com/gh_mirrors/co/codeql点击查看免费下载相关推荐Win11Debloat终极指南三步实现Windows系统极致优化与深度清理 Win11Debloat终极指南三步实现Windows系统极致优化与深度清理 Win11Debloat 是一个强大而简单的PowerShell脚本工具静态分析SAST应用安全漏洞扫描代码质量Structured3D完整指南如何用3D结构化数据轻松构建智能室内场景Structured3D完整指南如何用3D结构化数据轻松构建智能室内场景 如果你正在寻找一个能够将室内设计从平面图转化为智能3D模型的强大工具那么Struc静态分析SAST应用安全漏洞扫描代码质量CodeQL Python 分析 1.24 改进解析污点追踪解包赋值、Value API 扩展与 Web 框架污点源模型CodeQL Python 分析 1.24 改进解析污点追踪解包赋值、Value API 扩展与 Web 框架污点源模型 本文基于 CodeQL 仓库中 ch静态分析SAST应用安全漏洞扫描代码质量上一篇OpenUSD终极指南突破3D数据交换壁垒的深度探索下一篇3个关键步骤解决Android设备完整性验证难题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考