CodeQL C++ 库 3.0.0 变更指南:新数据流 API 迁移与 NonThrowingFunction 弃用

发布时间:2026/9/28 9:17:32

CodeQL C++ 库 3.0.0 变更指南:新数据流 API 迁移与 NonThrowingFunction 弃用 静态分析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点击查看免费下载导读本文基于 cpp/ql/lib/change-notes/released/3.0.0.md 发布说明系统梳理 CodeQL C 查询库 3.0.0 版本中的两项关键变更旧版继承配置类式数据流 API 的移除以及NonThrowingFunction类的弃用。读完本文你将理解新旧两代数据流 API 的形态差异与迁移路径掌握NonCppThrowingFunction的定位、实现类与使用方式并能据此完成自有查询的升级自查。一、3.0.0 版本定位3.0.0是 CodeQL C 库qlpack 版本号体系的一个主版本发布其发布说明存放在 cpp/ql/lib/change-notes/released/ 目录下与后续 4.x、10.x 等版本的说明并列构成完整的版本演进记录。该版本号与仓库根目录下的cpp/ql/lib/CHANGELOG.md中的条目一一对应——CHANGELOG.md 中 3.0.0 小节与发布说明内容完全一致可作为快速检索入口。这一版本的核心信号是兼容性收紧一方面删除长期弃用的旧数据流 APIBreaking Change另一方面宣告NonThrowingFunction进入弃用状态Deprecated API为后续版本的彻底移除铺路。二、Breaking Change旧数据流 API 被删除2.1 旧 API 的形态与删除原因发布说明明确指出Deleted the old deprecated data flow API that was based on extending a configuration class.在旧 API 中编写自定义数据流查询的标准做法是定义一个继承DataFlow::Configuration配置类的子类并在子类中覆写isSource、isSink等谓词最后通过实例化该配置类调用hasFlow来执行分析。这种方式对每个查询都要新建一个类配置与查询逻辑耦合度高且难以做模块化组合与复用因此被官方标记为 deprecated 并最终在 3.0.0 中移除。2.2 新 API 的形态仓库源码佐证新数据流 API 的核心思路是用 QL signature module签名模块取代类继承把配置抽成一个ConfigSig签名模块再通过模块实例化如makeDataFlow、GlobalConfigSig组合出可复用的分析模块。这一形态在仓库当前的 C 数据流库中有直接实现。以 cpp/ql/lib/semmle/code/cpp/ir/dataflow/MustFlow.qll 为例其MustFlow模块内定义了signature module ConfigSig { /** Holds if source is a relevant data flow source. */ predicate isSource(Instruction source); /** Holds if sink is a relevant data flow sink. */ predicate isSink(Operand sink); /** Holds if data flow through instr is prohibited. */ default predicate isBarrier(Instruction instr) { none() } /** Holds if the additional flow step from node1 to node2 must be taken into account. */ default predicate isAdditionalFlowStep(Operand node1, Instruction node2) { none() } /** Holds if this configuration allows flow from arguments to parameters. */ default predicate allowInterproceduralFlow() { any() } } module GlobalConfigSig Config { import Config predicate flowPath(PathNode source, PathSink sink) { ... } }从这段源码可以看出新 API 的几个关键特征配置即签名isSource、isSink等谓词被收敛进ConfigSig其中isBarrier、isAdditionalFlowStep、allowInterproceduralFlow都带默认实现用户只需按需覆写即插即用GlobalConfigSig Config通过导入Config将用户配置注入分析主体调用flowPath即得结果不再需要实例化配置对象模块化组合同一份ConfigSig可以被MustFlowmust-flow确定性流动或DataFlow.qllmay-flow可能性流动等不同分析引擎复用分析策略与用户配置解耦。此外DataFlowUtil.qll、ProductFlow.qll 等文件同样基于这一签名模块模式构建表明这是当前 C 库中数据流分析的标准实现范式。2.3 迁移路径发布说明同时提示迁移方法见官方发布的《new dataflow API for writing custom CodeQL queries》变更日志说明。其要点可概括为三步把配置类改为签名模块将原来class MyConfig extends DataFlow::Configuration中的isSource、isSink及可选的isBarrier、isAdditionalFlowStep谓词原样搬入signature module ConfigSig { ... }用新组合方式接入分析删除配置类实例化与hasFlow调用改为DataFlow::GlobalConfigSig/MustFlow::GlobalConfigSig这类模块化的flowPath查询入口同步更新依赖方检查仓库中所有import旧配置类的查询与库文件逐一替换为新 API 的调用方式。2.4 兼容性影响由于旧 API 在 3.0.0 中被直接删除而非仅标记弃用任何仍引用旧配置类的查询在编译时将直接报错属于硬性破坏性变更。升级 qlpack 后建议先用codeql query compile全量编译自有查询以清单方式定位所有待迁移的查询文件。三、Deprecated APINonThrowingFunction 弃用3.1 弃用声明发布说明的第二项变更是 API 弃用TheNonThrowingFunctionclass (semmle.code.cpp.models.interfaces.NonThrowing.NonThrowingFunction) has been deprecated. Please use theNonCppThrowingFunctionclass instead.弃用对象是全限定名semmle.code.cpp.models.interfaces.NonThrowing.NonThrowingFunction的类替代类是同一模块中的NonCppThrowingFunction。这一更名的背后是语义精化原类名容易让人误以为函数绝不抛出任何异常而实际语义只是不抛 C 异常——函数仍可能抛出 Windows 结构化异常处理SEH异常。3.2 新类的源码定义替代类定义于 cpp/ql/lib/semmle/code/cpp/models/interfaces/NonThrowing.qll/** * A function that is guaranteed to never throw a C exception * * The function may still raise a structured exception handling (SEH) exception. */ abstract class NonCppThrowingFunction extends Function { }要点它是Function的抽象子类属于 C 库的函数模型接口层models/interfaces供各内置函数模型实现类继承文档注释明确限定语义为保证不抛 C 异常但仍可能引发 SEH 异常这正是与旧名NonThrowingFunction的语义差异所在抽象类本身不约束任何函数具体哪些函数不抛由下游实现类决定体现了 CodeQL 库中接口 实现的分层建模风格。3.3 内置实现类示例当前仓库中已有多个模型实现类切换到NonCppThrowingFunctionNoexceptFunction.qll匹配带有noexcept说明符或等价的throw()说明符的函数即class NoexceptFunction extends NonCppThrowingFunction { this.isNoExcept() or this.isNoThrow() }。注意throw()动态异常说明在 C11 中已被弃用、C17 中移除Strcpy.qllStrcpyFunction同时继承ArrayFunction, DataFlowFunction, TaintFunction, SideEffectFunction, NonCppThrowingFunction即把strcpy及其宽字符、定长、Microsoft 变体建模为不抛 C 异常的标准函数同理Strcat.qll、Memset.qll、Memcpy.qll、Printf.qll 等文件也在仓库搜索结果中确认引用了NonCppThrowingFunction。这些实现类在 C 库的 IR 翻译层如 TranslatedCall.qll中被消费用于决定调用点是否可能产生异常路径——不抛异常的函数调用在控制流图上不会分叉出异常处理分支从而让数据流与污点分析更精确。3.4 弃用到移除的演进节奏值得注意的是弃用并非终点。后续 10.0.0 发布说明 记录The deprecatedNonThrowingFunctionclass has been removed, useNonCppThrowingFunctioninstead.同时移除的还有ThrowingFunction改用AlwaysSehThrowingFunction可见**更名 语义精确化是成对进行的**与不抛 C 异常对应的旧类NonThrowingFunction被NonCppThrowingFunction取代与总是抛 SEH 异常相关的ThrowingFunction被AlwaysSehThrowingFunction取代。因此任何在 3.0.0 之后仍未迁移的查询在 10.0.0 中将面临硬性编译失败。四、迁移自查清单针对 3.0.0 的这两项变更建议按如下清单排查自有查询与库代码全文检索旧数据流配置类搜索extends DataFlow::Configuration以及TaintTracking::Configuration等同类模式逐处替换为 signature module 形式的新 API替换 NonThrowingFunction 引用将NonThrowingFunction全部改为NonCppThrowingFunction并确认import semmle.code.cpp.models.interfaces.NonThrowing的导入无需改动新类同属该模块复核自定义函数模型如果自己写过继承NonThrowingFunction的模型类直接改继承NonCppThrowingFunction即可同时确认函数语义——若函数实际会抛 C 异常则不应继承该类编译验证使用codeql query compile对全部.ql/.qll做一次全量编译确保无残留的已删除 API 引用对照变更记录以 CHANGELOG.md 与 change-notes/released 目录为时间轴跟踪每个 API 从弃用到移除的状态迁移提前规划升级窗口。五、小结CodeQL C 库 3.0.0 通过删除旧数据流 API 弃用 NonThrowingFunction双管齐下推动库内 API 向更模块化、语义更精确的方向演进数据流配置从类继承转向签名模块MustFlow.qll 为其直接证据异常建模类则通过NonCppThrowingFunction明确了仅指 C 异常的边界。对于查询作者而言3.0.0 是一次必须响应的迁移节点而本文给出的源码定位与自查清单可以帮你以最小成本完成升级。赞分享静态分析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 C 库 0.12.3 版本解析SecurityOptions 弃用、新数据流谓词与 IRGuards 迁移CodeQL C 库 0.12.3 版本解析SecurityOptions 弃用、新数据流谓词与 IRGuards 迁移 本篇技术指南聚焦 CodeQL静态分析SAST应用安全漏洞扫描代码质量CodeQL C/C 查询库 0.6.0 升级指南新 IR 数据流库与 API 迁移实战CodeQL C/C 查询库 0.6.0 升级指南新 IR 数据流库与 API 迁移实战 本篇指南围绕 CodeQL 仓库中 C/C 查询库 cod静态分析SAST应用安全漏洞扫描代码质量CodeQL C 查询库 0.7.3 版本 API 清理废弃谓词移除与迁移升级指南CodeQL C 查询库 0.7.3 版本 API 清理废弃谓词移除与迁移升级指南 本指南以 CodeQL 仓库中 C 查询库 cpp/ql/lib静态分析SAST应用安全漏洞扫描代码质量上一篇POCO遗传算法资源进化计算与优化下一篇数据结构可视化Learn-Algorithms中的链表与数组实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/28 9:12:32

AI视频剪辑的工业级实践:语义对齐与可控生成

1. 这不是“一键成片”,而是把剪辑师的决策链拆解成可计算的逻辑最近两周,我连续接到7个不同行业的客户咨询,问题高度一致:“你们这个AI视频生成剪辑器,真能替代剪辑师?”——问得直接,但背后藏…

2026/9/28 9:12:32

ESP32S3跑通小智AI语音助手:从接线到唤醒词定制全攻略

1. 为什么选ESP32S3跑小智AI:这块板子的底气在哪正点原子ESP32S3开发板这几年在DIY圈和嵌入式教学圈里出镜率非常高,市面上大量AI语音助手项目都拿它做底板。原因很直接:ESP32-S3这颗芯片天生就是为“本地语音唤醒云端大模型对话”这种场景准…

2026/9/28 9:12:32

MTK平台音频无声问题排查:从路由配置到ALSA全链路解析

MTK平台音频出问题,最折磨人的就是"无声"——不是那种罕见的偶发bug,而是你明明改了配置、烧了版本,上电后喇叭和听筒就是一声不吭。MTK的音频路径配置跟高通的路子不一样,很多从高通平台转过来的工程师第一次碰MTK&…

2026/9/28 9:42:35

从CANoe到TSMaster:车载总线测试工具链迁移实战指南

搞车载总线测试的工程师,电脑里大概率都装着一套CANoe。我最早接触CANoe是刚入行那会儿,跟着前辈在项目里做网络测试,从报文发送、DBC解析到UDS诊断,基本全是靠Vector这套工具撑起来的。说实话,CANoe确实是这个行业的标…

2026/9/28 9:42:35

从刷榜到用榜:GitHub Trending 的增量逻辑、项目筛选与高效落地

1. 日榜的"热度"到底是怎么算出来的先别急着收藏仓库。每天打开 GitHub 的 Trending 页面,你看到的是过去 24 小时内 Star 增量最高的仓库,周榜和月榜则分别看一周、一个月内的增量。官方没有公开完整排序算法,但用久了会发现&…

2026/9/28 9:42:35

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱 网站做好了没人访问,这是很多老板最头疼的事。你花大价钱做的官网,设计精美、功能齐全,但打开一看,流量为零,咨询为零。这时候你才意识到,问题不在“做没做”,而在“怎么快速做出来并推向市场”。面…

2026/9/28 9:37:34

投顾实战:五步搭建AI自动化盯盘工作台

1. 这不是又一个“AI工具测评”,而是一个投顾每天真实在用的工作台实录 我做股票投顾八年,前五年靠盯盘盯到凌晨两点,复盘靠Excel手动拉数据、截图、写总结,周末补作业是常态;后三年开始用WorkBuddy搭自己的AI工作台&…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 0:02:03

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑 改个需求建站公司拖一周,后台改个文案还得再交一笔“技术维护费”。这种憋屈事儿,做外贸的朋友太熟悉了。很多老板在找广州外贸网站建设推广服务商时,光盯着首页好不好看,却忽略了从零搭建一个能…

2026/9/28 0:02:04

搞懂百度竞价推广价格,网站性能优化别掉链子

搞懂百度竞价推广价格,网站性能优化别掉链子 网站突然打不开,浏览器弹出红色警告“此网站存在安全风险”,后台一看全是乱码代码和奇怪的跳转链接。这种网站被黑挂马的绝望感,很多刚转行做网站的朋友都经历过,尤其是那些为了省几百块钱服务器费用的新手。…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑