news 2026/9/25 8:09:57

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CodeQL 1.26 C/C++ 分析改进解析:查询精度调整与库级污点流模型扩展
  • 静态分析
  • SAST
  • 应用安全
  • 漏洞扫描
  • 代码质量

【免费下载链接】codeql

CodeQL: 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 parameter(cpp/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会把实例化函数映射回其模板原型,参数名提取谓词functionParameterNames(L38-L46)在取参数名时通过getConstructedFrom(f).getDefinition() = fe强制只从模板定义的形参声明中取名字,从而避免了把实例化伪影当作真实参数匹配、消除模板场景下的误报。

2.2 Inconsistent direction of for loop(cpp/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 size(cpp/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 same(cpp/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.SimpleRangeAnalysis(L14)调用其upperBound/lowerBound,TaintedAllocationSize.ql同样导入了它(L15)。此前乘法表达式的边界往往只能取保守的"无上界",导致a * b < 0、a * b > N这类比较无法判定;支持无符号/常量乘法后,上下界可以实际计算出来。这正是 2.4 节cpp/constant-comparison正确性改进的底层来源——库能力增强会静默地提升多个上层查询的判定能力,这是阅读此类变更说明时应关注的传导关系。

四、升级与使用建议

  1. 回归验证定制查询:若自有套件引用了Block(旧类名)或依赖上述 4 条官方查询的结果集合,升级 1.26 后应全量重跑并 diff 结果;Block→BlockStmt是唯一的编译级破坏点。
  2. 预期安全告警增多:models 库新增的 STL/字符串/流污点模型会让污点追踪类安全查询检出更多真实路径,属预期行为而非回归。
  3. 注意cpp/uncontrolled-allocation-size的展示变化:查询仍在执行,但默认不再展示 medium 精度结果;若流程中需要该告警,应在查询套件中显式配置展示策略。
  4. 利用新的范围分析能力:编写自定义算术/边界类查询时,可以直接依赖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
  • 应用安全
  • 漏洞扫描
  • 代码质量

【免费下载链接】codeql

CodeQL: 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
点击查看免费下载

相关推荐

上一篇:OpenUSD终极指南:突破3D数据交换壁垒的深度探索
下一篇:3个关键步骤解决Android设备完整性验证难题

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 8:05:24

本地CLI驱动的LLM代码审查工作流

1. 项目概述&#xff1a;这不是一个工具&#xff0c;而是一套可落地的代码审查工作流“open-code-review”这个名字乍看像某个开源项目仓库名&#xff0c;但结合当前技术生态里高频出现的关键词——CLI、LLM、Git、codex cli、trae cli、dify、embedding、prompt injection——…

作者头像 李华
网站建设 2026/9/25 8:03:52

jQuery对象与DOM对象互转:本质差异与实战避坑指南

写 jQuery 写了两三年&#xff0c;见过不少新同事第一个卡壳的地方不是复杂插件&#xff0c;反而是最基础的三个概念&#xff1a;$到底是什么、document.getElementById拿到的对象和$(#id)拿到的对象差在哪、为什么有时候能直接.val()&#xff0c;有时候又要[0]一下。这套对象体…

作者头像 李华
网站建设 2026/9/25 8:03:07

DeepSpeed 高级安装指南:Ops 预编译、多节点分发与 GPU 架构定制

推理引擎大模型 【免费下载链接】FlexGen Running large language models on a single GPU for throughput-oriented scenarios. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/fl/FlexGen 点击查看 免费下载 DeepSpeed 在训练与推理时依赖一组 C/CUDA 扩展&#xff0…

作者头像 李华
网站建设 2026/9/25 8:00:36

自建CRM实战:DeskcommCRM部署、权限管理与数据安全指南

做销售管理的朋友&#xff0c;大概率都动过“自己搞一套CRM”的念头&#xff0c;尤其是当你发现市面上的免费CRM越用越别扭&#xff0c;收费CRM又贵得肉疼的时候。我团队之前就卡在这个点上&#xff0c;客户资料散在好几个人的微信和Excel里&#xff0c;月底统计全靠人工对表&a…

作者头像 李华