CodeQL C/C++ 库 0.12.5 版本解读:PreprocBlock 预处理器块视图与 ThrowingFunction 异常建模抽象类

发布时间:2026/9/27 8:46:11

CodeQL C/C++ 库 0.12.5 版本解读:PreprocBlock 预处理器块视图与 ThrowingFunction 异常建模抽象类 静态分析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/C 查询库cpp/ql/lib在 0.12.5 版本中引入了两项面向安全查询开发的基础设施改进新增PreprocBlock.qll库将#if/#elif/#else等预处理分支组织成可导航的父子树结构新增ThrowingFunction抽象类为建模可能抛出异常的外部函数提供统一入口。本文以该版本发布说明为骨架结合 PreprocBlock.qll 与 Throwing.qll 的源码实现深入讲解这两个 API 的设计动机、核心成员与典型用法帮助读者在自己的 CodeQL 查询中直接复用这两项能力。0.12.5 版本概览本次发布对应的变更记录位于 cpp/ql/lib/change-notes/released/0.12.5.md属于 C 查询库QL library层面的更新包含两条新特性新增PreprocBlock.qll库把#if、#elif、#else等预处理分支指令抽象为代码块并建立可导航的父-子关系树根节点为整个文件新增ThrowingFunction抽象类用于建模外部函数可能抛出异常这一行为供数据流与污点分析在跨函数传播异常路径时使用。下文分别对两者展开。PreprocBlock.qll以树结构视图预处理分支设计动机在 C/C 代码中条件编译指令#if、#ifdef、#ifndef、#elif、#elifdef、#elifndef、#else、#endif会把文件内容切分成大量互斥或嵌套的代码区间。传统做法是逐条处理PreprocessorBranchDirective但遇到深层嵌套时难以回答这段代码处于哪个条件分支内这个#include属于哪个#if块某宏定义在哪个分支生效这类结构性问题。PreprocBlock.qll正是为解决这类问题而设计它将一对开启/关闭指令之间的代码块chunk建模为PreprocessorBlock并通过getParent()/getAChild()形成一棵树树的根节点是源文件本身File。有了这棵树查询代码就可以沿分支层级自由上下导航而不再需要手工计算指令配对关系。核心类PreprocessorBlockPreprocessorBlock定义在 cpp/ql/lib/semmle/code/cpp/headers/PreprocBlock.qll#L41-L46其 characteristic predicate 表明一个块可以是以下三种元素之一File整个文件树的根PreprocessorBranch#if/#ifdef/#ifndef/#elif/#elifdef/#elifndef开启的分支PreprocessorElse#else分支。块的范围从开启指令所在行延伸到关闭指令#elif、#elifdef、#elifndef、#else或#endif的上一行见getEndLine()的实现PreprocBlock.qll#L83-L87。关键成员一览PreprocessorBlock提供的成员可直接用于查询编写成员说明getFile()返回该块所在的源文件getStartLine()/getEndLine()返回块的起始行号与结束行号结束行取关闭指令前一行文件根取总行数getParent()返回直接包围当前块的外层块若为文件本身则无结果顶层指令的父节点是文件getAChild()返回直接嵌套在当前块内部的子块result.getParent() thisgetAnInclude()返回直接位于该块内的#include指令不含子块中的getAMacro()返回直接位于该块内的宏定义不含子块中的hasLocationInfo(...)提供标准的位置信息谓词便于接入 CodeQL 的 Locations 机制toString()返回元素的文本表示值得注意的实现细节getAnInclude()/getAMacro()通过not result this.getAChild().getAnEnclosedInclude()PreprocBlock.qll#L142-L145、PreprocBlock.qll#L157-L160排除掉子块中的指令/宏保证结果严格限定在本层。父子关系的建立原理块的层级关系由私有谓词getParentInternal()计算PreprocBlock.qll#L89-L108通过getPreprocIndex找到当前块对应#if指令在文件全部PreprocessorBranchDirective中的序号ix指令按起始行排序见 PreprocBlock.qll#L14-L17取出排在该#if之前的上一条指令prev若prev是#endif说明当前块并不与#endif平级而是与#endif对应的#if拥有相同的父节点因此递归求解prev.getIf()的父块否则prev就是#if/#ifdef/#ifndef/#elif/#else中层级更高的一层直接作为父块。对外暴露的getParent()在此基础上补充了根处理非文件块若找不到更外层指令则父节点为整个文件PreprocBlock.qll#L114-L125。典型使用场景场景一找出被#if 0或未定义宏禁用的分支。遍历PreprocessorBranch分支块检查其分支条件在预处理后是否成立即可定位死代码或仅供特定平台编译的片段。场景二按条件编译粒度统计依赖。例如统计某个平台宏如_WIN32保护下的#include集合可利用getAnInclude()限定在指定块内import cpp import semmle.code.cpp.headers.PreprocBlock from PreprocessorBlock b where b.getFile().getBaseName() platform.h and b.toString().matches(%_WIN32%) select b, b.getAnInclude()场景三在数据流或污点分析中作为结构约束。当同一变量在不同#if分支中被赋予不同来源时块的父子关系可作为路径约束参与分析。ThrowingFunction外部函数异常行为建模抽象类设计动机安全分析中外部函数标准库、系统 API、第三方库函数的异常行为往往不可见——源码不在当前数据库中但其是否可能抛出异常直接影响调用点的控制流与数据流结论。0.12.5 引入了ThrowingFunction抽象类让库作者可以通过**子类化 特征谓词characteristic predicate**的方式声明性地描述哪些外部函数可能抛出异常。接口定义接口定义在 cpp/ql/lib/semmle/code/cpp/models/interfaces/Throwing.qll其文档注释明确了使用方式要使用该 QL 库请创建一个继承ThrowingFunction的 QL 类用特征谓词选中你要建模其异常流的函数或函数集合。该文件同时声明了AlwaysSehThrowingFunction——表示无条件抛出结构化异常处理SEH异常的函数Throwing.qll#L14-L16。与之配套的还有 NonThrowing.qll 中的NonCppThrowingFunction表示保证永不抛出 C 异常但仍可能触发 SEH 异常的函数。一正一反两个抽象类构成外部函数异常行为的完整建模面。使用方式假设要为某个封装库建模所有my_lib::*命名空间下的函数可能抛出std::exception可以这样写import cpp import semmle.code.cpp.models.interfaces.Throwing class MyLibThrowingFunction extends ThrowingFunction { MyLibThrowingFunction() { this.getName().matches(my_lib::%) } }之后凡是在数据流配置、污点追踪或异常可达性分析中引用ThrowingFunction的位置都会自动纳入这些外部函数。版本演进与弃用路线后续版本对该 API 进行了演进阅读时请注意版本差异5.2.0ThrowingFunction位于semmle.code.cpp.models.interfaces.Throwing被标记为弃用官方建议改用AlwaysSehThrowingFunction见 cpp/ql/lib/change-notes/released/5.2.0.md10.0.0弃用的ThrowingFunction类被移除请使用AlwaysSehThrowingFunction同时弃用的NonThrowingFunction被移除改用NonCppThrowingFunction见 cpp/ql/lib/change-notes/released/10.0.0.md。也就是说0.12.5 中新增的ThrowingFunction是当时版本的建模入口若你当前使用的是较新的 CodeQL 版本请直接使用AlwaysSehThrowingFunction。小结PreprocBlock.qllcpp/ql/lib/semmle/code/cpp/headers/PreprocBlock.qll把 C/C 条件编译指令转换为可导航的树结构PreprocessorBlock提供getParent()、getAChild()、getAnInclude()、getAMacro()等成员适合所有需要按分支粒度分析代码的安全查询ThrowingFunctioncpp/ql/lib/semmle/code/cpp/models/interfaces/Throwing.qll提供了外部函数异常行为的声明式建模入口注意它在 5.2.0 被弃用、10.0.0 被移除新代码应使用AlwaysSehThrowingFunction。这两个 API 虽然只是 0.12.5 变更记录中的两行条目却是支撑 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 C 分析器 1.21 版本更新详解C 8 特性提取与 QL 库建模CodeQL C 分析器 1.21 版本更新详解C 8 特性提取与 QL 库建模 导读 本文基于 CodeQL 仓库 change notes/1.21/an静态分析SAST应用安全漏洞扫描代码质量CodeQL C 库 0.2.2 版本解析AnalyzedString 重命名与 C17 if/switch 初始化器 APICodeQL C 库 0.2.2 版本解析AnalyzedString 重命名与 C17 if/switch 初始化器 API 本文以 CodeQL静态分析SAST应用安全漏洞扫描代码质量CodeQL C 分析库中的 cstdint 标准类型建模FixedWidthIntegralType 与 FixedWidthEnumType 详解CodeQL C 分析库中的 cstdint 标准类型建模FixedWidthIntegralType 与 FixedWidthEnumType 详解 本静态分析SAST应用安全漏洞扫描代码质量上一篇make-sense.ai AI集成功能详解YOLOv5、SSD、PoseNet实战下一篇GitHub_Trending/sum/Summer2025-Internships开发环境本地搭建项目开发环境的步骤创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/27 8:41:11

哪个素材网站免费源码下载

5个免费素材站实测,建站不拖工期最佳实践 改个需求建站公司拖一周,这种绝望感谁懂?我见过太多设计师朋友,明明手里有图,脑子里有方案,结果卡在找素材、切图、写代码这三个环节,硬生生把三天能搞定的事拖成半个月。很多人以为慢在技术,其实慢在资源获…

2026/9/27 9:31:14

第247篇_全网羊毛优惠活动聚合采集

【Python爬虫实战】第247篇:羊毛信息不再东奔西跑——多平台优惠活动聚合去重抓取实战 所属专栏:【Python爬虫实战】从零到企业级爬虫工程师(CSDN 付费专栏) 本篇篇目:第 247 篇(多源聚合与去重专场,每篇都是一个可独立上手的实战项目) 难度等级:中高级,重点练「多源…

2026/9/27 9:31:13

CSS 代码格式化在线工具,前端样式调试整理小工具

一、前言 在前端日常开发工作中,我们经常会接触压缩后的 CSS 代码。线上为了减少资源体积,CSS 文件通常会去除换行、空格和缩进,全部合并为单行文本。 当我们需要分析第三方样式、排查样式冲突问题、阅读线上 CSS 源码时,面对挤…

2026/9/27 9:31:13

使用docker-compose部署项目(mysql、springboot、vue、nginx)

结合前面几篇文章: 9.如何将jar包打包成docker镜像并进行部署 10.docker如何部署一个前端网站 docker系列文章: https://blog.csdn.net/baidu_32523857/article/details/135212681 这篇文章我们使用docker-compose来部署项目。 docker-compose是一个编…

2026/9/27 9:31:13

IDEA按照JSP Model2思想实现用户注册功能

【任务目标】 按照JSP Model2思想编写一个用户注册程序。 组件关系图如下: (1)UserBean: 封装用户信息的JavaBean。 (2)RegisterFormBean是封装注册表单信息的JavaBeanl,用于校验从ControllerServlet中获…

2026/9/27 9:31:13

网站业务员好做吗?拆解3个最佳实践避坑指南

网站业务员好做吗?拆解3个最佳实践避坑指南 网站做好了没人访问,这大概是做建站销售最头疼的事。很多新人觉得,只要网站做得漂亮,客户就会买单,结果发现根本卖不出去。其实,这背后涉及的是 最佳实践…

2026/9/27 0:00:45

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

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

2026/9/27 0:00:45

如何划分训练/验证集: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/27 0:00:45

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

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

2026/9/27 0:00:45

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

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

2026/9/27 0:00:45

如何划分训练/验证集: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/27 0:00:45

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

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

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/25 18:34:56

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

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

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

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

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