
静态分析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# 查询库的 5.4.6 版本变更记录csharp/ql/lib/change-notes/released/5.4.6.md深入解析该版本在 Minor Analysis Improvements 层面的两项核心改动一是数据流摘要模型SummarizedCallable.propagatesFlow谓词新增Provenance来源与isExact是否精确两列同时移除旧谓词二是新增 C# 14 空条件赋值null-conditional assignment支持并增强MaybeNullExpr对?.空条件访问的可空性建模。读完本文你将掌握这两项改动背后的库结构、谓词签名变化对自定义模型编写的影响以及空条件赋值在控制流与可空性分析中的处理方式。5.4.6 版本概览CodeQL C# 查询库的版本变更记录按“Minor Analysis Improvements”次要分析改进归类5.4.6 共包含两条改动均不涉及破坏性查询行为变更但其中第一条涉及公共 API 的谓词签名调整需要自定义数据流模型flow summary的作者关注。两条改动的核心脉络改动涉及模块影响面SummarizedCallable.propagatesFlow增加Provenance p与boolean isExact列移除hasProvenance与hasExactModel数据流摘要FlowSummary.qll自定义 flow summary 的编写与查询 APIC# 14 空条件赋值如c?.Prop p支持MaybeNullExpr纳入?.空条件访问可空性分析Nullness.qll对 C# 14 语法与可空值传播的建模精度下面分别展开。一、SummarizedCallable.propagatesFlow的列扩展与 API 调整1.1 背景CodeQL 的流摘要Flow Summary机制在 CodeQL C# 数据流分析中SummarizedCallable是“被摘要化的可调用体”的统一抽象它把库函数通常没有源码的数据流行为浓缩为一条条“输入 → 输出”的传播规则供污点分析、数据流分析等安全查询复用。公共入口定义在FlowSummary.qll 第 26 行class SummarizedCallable Impl::Public::RelevantSummarizedCallable;FlowSummaryImpl.qll 中的module Public提供实际实现。SummarizedCallable自身又分为SummarizedCallable::Range供自定义模型声明的范围类与RelevantSummarizedCallable真正参与分析的实例层次关系如下见 FlowSummary.qllmodule SummarizedCallable { class Range Impl::Public::SummarizedCallable; } class SummarizedCallable Impl::Public::RelevantSummarizedCallable; class Provenance Impl::Public::Provenance;1.2 谓词签名变化从“两个辅助谓词”到“两列内联”5.4.6 之前propagatesFlow只携带传播规则的核心信息而“模型来源”与“是否精确”需要分别通过SummarizedCallable.hasProvenance和SummarizedCallable.hasExactModel两个谓词查询。5.4.6 之后这两个信息被直接并入propagatesFlow谓词本身新签名为predicate propagatesFlow( string input, // 输入端点如 Argument[0] string output, // 输出端点如 Argument[0].Parameter[delegate-self] boolean preservesValue, Provenance p, // 新增模型来源 boolean isExact, // 新增是否精确模型 string model // 模型标识如 heuristic-callback )同时SummarizedCallable.hasProvenance与SummarizedCallable.hasExactModel两个谓词被移除。1.3 源码证据SummarizedCallableWithCallback的重写实现仓库中的具体重写示例位于 FlowSummaryImpl.qll。SummarizedCallableWithCallback针对“可能调用回调的库函数”参数类型为委托且无方法体生成启发式传播模型private class SummarizedCallableWithCallback extends Public::SummarizedCallable { private int pos; SummarizedCallableWithCallback() { mayInvokeCallback(this, pos) } override predicate propagatesFlow( string input, string output, boolean preservesValue, Public::Provenance provenance, boolean isExact, string model ) { input Argument[ pos ] and output Argument[ pos ].Parameter[delegate-self] and preservesValue true and provenance hq-generated and isExact true and model heuristic-callback } }该实现说明了两列新语义的实际用法provenance hq-generated表示该模型由仓库内部“启发式生成”heuristic generation机制产生而非用户手工编写的模型文件。从源码结构看Provenance 的取值目前以字符串常量承载用于标记模型的来源类型。isExact true表示该传播规则是精确模型模型描述与实际行为一致没有过度抽象或放大的近似。isExact列与preservesValue、model一起供下游分析在评估传播可信度时使用。该机制由 ExternalFlow.qll 导入形成“内置框架模型 外部模型”的统一流摘要体系。1.4 对自定义模型编写者的影响如果你在自己的查询或模型文件中重写SummarizedCallable::Range的propagatesFlow需要同步适配新签名将原先通过hasProvenance/hasExactModel提供的来源与精确性信息改为在propagatesFlow中直接为p、isExact两列绑定值。迁移要点删除对hasProvenance/hasExactModel的重写或调用在propagatesFlow参数列表中补齐Provenance p与boolean isExact为每条传播规则显式声明来源与精确性参考上文的hq-generated/true用法。二、C# 14 空条件赋值支持与MaybeNullExpr增强2.1 改动内容5.4.6 为 C# 14 新增了空条件赋值null-conditional assignment的建模支持典型语法如c?.Prop p;其语义是当c为null时整个赋值语句静默跳过不访问成员、不执行赋值当c非空时才执行c.Prop p。同时MaybeNullExpr“可能为 null 的表达式”类现在会把**空条件访问?.**纳入可空值建模当限定符qualifier本身可能为 null 时c?.Prop的结果也会被判定为可能为 null。2.2 源码证据MaybeNullExpr与maybeNullExprMaybeNullExpr定义在 Nullness.qll/** An expression that may be null. */ class MaybeNullExpr extends Expr { MaybeNullExpr() { this maybeNullExpr(_) } }其判定逻辑由私有谓词maybeNullExpr递归描述Nullness.qllprivate Expr maybeNullExpr(Expr reason) { G::Internal::nullValue(result) and reason result or result instanceof AsExpr and reason result or result.(AssignExpr).getRightOperand() maybeNullExpr(reason) or result.(CastExpr).getExpr() maybeNullExpr(reason) or result any(ConditionalExpr ce | ce.getThen() maybeNullExpr(reason) or ce.getElse() maybeNullExpr(reason) ) or result.(NullCoalescingOperation).getRightOperand() maybeNullExpr(reason) or result any(QualifiableExpr qe | qe.isConditional() and reason qe.getQualifier() and not qe instanceof AssignableWrite ) }结合 5.4.6 的变更说明可以推断本次改动作用于最后一条分支QualifiableExpr中isConditional()为真的表达式即?.空条件访问现在参与MaybeNullExpr的判定。判定规则可以概括为显式 null 字面量、as转换表达式赋值右操作数、CastExpr包装、条件表达式分支、??右操作数空条件访问?.只要限定符可能为 null则整个访问结果可能为 null但排除了AssignableWrite即赋值目标本身不算“可能为 null 的结果”。maybeNullExpr进一步被下游使用defMaybeNullNullness.qll与 SSA 定义SsaDefinition联动将“该定义可能为 null”作为可空性数据流的source见 Nullness.qll从而支撑 Nullness 查询与后续的流分析。2.3 测试佐证ConditionalAccess.cs仓库控制流库测试 ConditionalAccess.cs 覆盖了空条件访问的各种形态其中M9方法正是空条件赋值null-conditional assignment的用例集合void M9(ConditionalAccess ca) { ca?.IntField 42; // 空条件赋值字段 ca?.StringProp Hello; // 空条件赋值属性 ca?[0] Set0; // 空条件赋值索引器 ca?.Prop?.IntField 84; // 链式空条件赋值 ca?.Prop?.StringProp World; ca?.IntField - 1; // 空条件复合赋值 ca?.StringProp !; // 空条件复合赋值 }该测试同时覆盖了读取侧形态M1–M8包括s?.Length ?? 0、(s1 ?? s2)?.Length、Prop?.Out(out i)等组合说明控制流图对?.及空条件赋值形成了完整的建模矩阵。从源码结构看5.4.6 的改动正是在既有条件访问建模基础上补齐了“赋值目标”一侧在可空性分析中的处理。2.4 实战意义查询侧能获得什么对使用 CodeQL 编写 C# 查询的开发者而言这两点增强意味着涉及 C# 14 空条件赋值的代码如obj?.Field value、obj?.Prop?.Method()链在控制流、SSA 与可空性数据流中不再被遗漏能够正确进入“可能为 null”的传播路径依赖MaybeNullExpr的查询如空引用解引用、不必要的判空、可空性相关的安全查询对?.表达式的判断更精确减少漏报?.的结果被视为“可能为 null”在流经??、条件表达式等还原逻辑时会与既有NullCoalescingOperation规则衔接形成自洽的可空性推理。三、如何验证与查阅在仓库中可以从以下路径交叉验证 5.4.6 的两项改动变更记录原文csharp/ql/lib/change-notes/released/5.4.6.md流摘要公共 APIFlowSummary.qll流摘要实现与propagatesFlow重写示例FlowSummaryImpl.qll可空性分析Nullness.qll空条件访问控制流测试ConditionalAccess.cs若需在自己的查询中使用新 API请确保使用包含 5.4.6 及以上版本的codeql-csharp查询包qlpack并参照上文签名调整自定义模型代码。结语5.4.6 是 CodeQL C# 查询库的一次“小而精”的改进一方面通过把Provenance与isExact内联进propagatesFlow让流摘要的元信息更聚合、更便于下游分析消费另一方面紧跟 C# 语言演进为 C# 14 的空条件赋值补全了可空性建模。对库使用者来说理解这两处 API 与语义变化是升级查询包后保持自定义模型正确性与分析精度的前提。赞分享静态分析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.3.1 变更深度解析AnalysedExpr 空值检查分析增强CodeQL C 库 0.3.1 变更深度解析AnalysedExpr 空值检查分析增强 本篇技术指南围绕 CodeQL C 查询库 cpp/ql静态分析SAST应用安全漏洞扫描代码质量CodeQL C/C 查询库 1.4.4 版本变更深度解析包装函数警报定位、线程数据流模型与 MaD 扩展CodeQL C/C 查询库 1.4.4 版本变更深度解析包装函数警报定位、线程数据流模型与 MaD 扩展 本篇文章以 CodeQL 开源仓库中 cpp/静态分析SAST应用安全漏洞扫描代码质量CodeQL 1.26 C/C 分析改进解析查询精度调整与库级污点流模型扩展CodeQL 1.26 C/C 分析改进解析查询精度调整与库级污点流模型扩展 本文基于 CodeQL 仓库中 1.26 版本的 C/C 分析变更说明静态分析SAST应用安全漏洞扫描代码质量上一篇B站成分检测器完整指南3分钟掌握智能评论分析下一篇DLSS Swapper 使用指南3 步切换游戏里的 DLSS 版本创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考