CodeQL C 有效可见性分析:isEffectivelyPrivate / isEffectivelyInternal / isEffectivelyPublic 谓词的重做与语义
静态分析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# 分析库Modifiable类的三个可见性谓词——isEffectivelyPrivate、isEffectivelyInternal与isEffectivelyPublic。这一组谓词曾在 2021-06-15 的变更说明csharp/old-change-notes/2021-06-15-effective-visibility.md中宣告重做核心目的是正确处理 C# 的private protected、internal protected组合可见性以及显式接口实现成员的可见性。读完本文你将理解有效可见性effective visibility与声明可见性的区别、三个谓词的判定规则与实现细节以及如何通过测试用例验证这些规则从而在你的自定义查询中准确过滤掉实际上不可从当前程序集外部访问的成员。变更背景从声明修饰符到有效可见性在 C# 中一个成员的实际可访问范围并不总是与它声明的访问修饰符一一对应。典型例子包括嵌套类型中的成员一个声明为public的成员如果它所在的类型本身是internal或private那么该成员实际上不可能被程序集外部引用受保护成员的可重写性protected成员虽然可以被派生类访问但private protected与protected internal在跨程序集场景下行为不同显式接口实现void I.Foo() { }这样的成员没有普通意义上的可见性它只能通过接口引用访问因此其有效可见性取决于被实现的接口本身。为此CodeQL 的 C# 库在 csharp/ql/lib/semmle/code/csharp/Member.qll 的Modifiable类中提供了三个有效可见性谓词回答的不是这个成员写了什么修饰符而是这个成员在程序语义上到底能被谁引用。谓词语义三个判定规则有效私有isEffectivelyPrivate在 Member.qll 中isEffectivelyPrivate()的定义为该声明只能从以下位置引用——声明它的类型及其嵌套类型与普通private一致以及它的封闭类型enclosing types。其实现包含三条判定路径predicate isEffectivelyPrivate() { this.isReallyPrivate() or this.getDeclaringType().(Modifiable).isReallyPrivate() or this.(Virtualizable).getExplicitlyImplementedInterface().isEffectivelyPrivate() }自身为私有isReallyPrivate()是一个私有辅助谓词要求isPrivate()且不是isProtected()同时排除极少数同名成员跨程序集以不同可见性定义的情况Member.qll封闭类型链私有this.getDeclaringType()沿声明类型逐级向上查找表示一个或多个步骤只要任一封闭类型真正私有成员即视为有效私有显式接口实现通过getExplicitlyImplementedInterface()取得显式实现的接口若接口本身有效私有则该实现成员同样有效私有。文档注释特别强调两点显式接口实现在接口本身有效私有时被视为有效私有而private protected成员不被视为有效私有因为它可以在声明程序集内被重写override。有效内部isEffectivelyInternalisEffectivelyInternal()的语义是该声明只能从声明它的程序集内部引用Member.qllpredicate isEffectivelyInternal() { this.isReallyInternal() or this.getDeclaringType().(Modifiable).isReallyInternal() or this.(Virtualizable).getExplicitlyImplementedInterface().isEffectivelyInternal() }其辅助谓词isReallyInternal()判定两条路径Member.qllinternal且非protected即普通internalprivate且protected即private protected——注意它与internal的可达范围相同都限于本程序集。同样需要排除同名成员跨程序集不同可见性的稀有情况。文档注释中的两个关键限定通过InternalsVisibleToAttribute声明的友元程序集friend assemblies不在考虑范围内——即只要理论上可能被其他程序集看到就归为有效内部之外internal protected即protected internal成员不被视为有效内部因为它可以在声明程序集之外被派生类重写显式接口实现成员若实现的接口本身有效内部则该成员同样被视为有效内部。有效公开isEffectivelyPublicisEffectivelyPublic()是一个兜底定义Member.qll凡不是有效私有、也不是有效内部的声明即可从程序集外部引用predicate isEffectivelyPublic() { not this.isEffectivelyPrivate() and not this.isEffectivelyInternal() }因此对任意Modifiable三个谓词构成穷尽且互斥的三分任何成员必然恰好落在有效私有有效内部有效公开之一。测试验证库测试 Modifiers仓库在 csharp/ql/test/library-tests/modifiers/ 提供了完整的库测试来锁定这些语义。被测代码Modifiers.csModifiers.cs 构造了覆盖各类修饰符组合的样例其中与本次重做直接相关的成员包括internal protected readonly int F3; // 内部保护字段 public int P1 { get; set; } // 公开属性 public int P2 { get; private set; } // 公开属性、私有 setter internal interface I2 { void M1(); } // 内部接口 public class C2 : I2 { void I2.M1() throw null; // 显式接口实现 protected private void M2() { } // private protected protected internal void M3() { } // internal protected }测试查询Effectively.qlEffectively.ql 专门用于本组谓词它找出三种声明可见性与有效可见性不一致的情况并标记实际的有效可见性from Modifiable m, string s where m.fromSource() and ( m.isEffectivelyInternal() and not m.isInternal() and s internal or m.isEffectivelyPrivate() and not m.isPrivate() and s private or m.isEffectivelyPublic() and s public ) select m, s即对每个源码中的声明若isEffectivelyInternal()成立但声明中并没有internal修饰符就报告为internal若isEffectivelyPrivate()成立但没有private修饰符报告为private凡有效公开者报告为public。预期结果Effectively.expected对照 Effectively.expected可以看到重做后的判定结果Modifiers.cs:12:14的M1注释标记的私有方法→internal因为其封闭类型C默认是internalunsafe class C无可见性修饰符默认为 internal成员随类型被限制在程序集内Modifiers.cs:24:22的C1被同时报告为internal与privatesealed class C1声明于internal类内其构造器C1()是public但随类型降至 internal而类本身随内部类 C 降至有效私有Modifiers.cs:52:19的Spublic struct→publicModifiers.cs:68:14的I2.M1内部接口的默认实现方法→internalModifiers.cs:73:17的显式接口实现void I2.M1()→internal这正是本次重做新增的判定——显式实现成员的可见性继承自被实现接口I2的可见性Modifiers.cs:75:32的protected private void M2()private protected→internal证明private protected被纳入有效内部而非有效私有Modifiers.cs:76:33的protected internal void M3()→public因为internal protected可以被程序集外的派生类重写故不归为有效内部。这些预期输出同时验证了重做后的三条核心规则显式接口实现的可见性跟随接口、private protected归入有效内部、internal protected归入有效公开。谓词在查询中的实际应用这一组谓词在仓库的多个查询与库模块中被广泛使用用于过滤从外部实际不可达的成员提升查询精度。csharp/ql/lib/semmle/code/csharp/telemetry/ExternalApi.qll在统计外部 API 使用情况时需要区分真正暴露给外部的成员与内部实现细节isEffectivelyPublic()等谓词正是判定的基础csharp/ql/src/Useless code/DefaultToStringQuery.qll、csharp/ql/src/Language Abuse/MissedReadonlyOpportunity.ql、csharp/ql/src/Likely Bugs/Collections/WriteOnlyContainer.ql这些查询在判断成员是否可被外部观察时使用有效可见性避免把仅程序集内部可见的成员当作公开 API 处理csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll 与 csharp/ql/src/utils/modeleditor/ModelEditor.qll模型生成工具需要按可见性决定是否为成员生成数据流模型csharp/ql/lib/semmle/code/csharp/dataflow/internal/Steps.qll、csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll数据流与派发分析中跨程序集边界的数据流需要以有效可见性为准private protected/internal protected的可重写性直接影响跨程序集调用图的构造。从源码结构看重做后的谓词通过统一收敛到isReallyPrivate/isReallyInternal两个私有辅助谓词并把封闭类型链与显式接口实现两类场景显式建模使得三个公开谓词在所有Modifiable声明上构成互斥且完备的划分任何后续查询只需选择其一即可得到精确的可见性分类。小结isEffectivelyPrivate、isEffectivelyInternal、isEffectivelyPublic是 CodeQL C# 库中关于成员可见性的核心抽象。2021-06-15 的重做补齐了三个此前处理不准确的场景private protected归入有效内部、internal protected因其可跨程序集重写而归入有效公开、以及显式接口实现可见性继承自被实现接口。理解这三条规则不仅有助于读懂ExternalApi、Dispatch等库模块的实现也能帮助你在编写自定义安全查询时正确判断一个成员是否真正暴露在程序集外部从而减少误报、提升分析的准确性。赞分享静态分析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 溢出分析库 SimpleRangeAnalysisexprMightOverflow* 谓词如何变得更可靠CodeQL C 溢出分析库 SimpleRangeAnalysisexprMightOverflow 谓词如何变得更可靠 本文以 CodeQL C静态分析SAST应用安全漏洞扫描代码质量CodeQL C 库 0.0.10 新增特性Variable::isStructuredBinding 谓词详解CodeQL C 库 0.0.10 新增特性 Variable::isStructuredBinding 谓词详解 CodeQL 的 C 查询库在版本静态分析SAST应用安全漏洞扫描代码质量CodeQL C/C 查询库通过 Function 新谓词精确分析 virtual、override 与 final 声明CodeQL C/C 查询库通过 Function 新谓词精确分析 virtual、override 与 final 声明 导读 在编写 C 安全查询静态分析SAST应用安全漏洞扫描代码质量上一篇BadPods项目深度挖掘can-they.sh脚本实现集群令牌自动化审计下一篇javascript-mini-projects深度剖析从贪吃蛇游戏看Canvas API的实战应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

跨平台C/C++头文件设计:vllm_platform.h统一平台契约

跨平台C/C++头文件设计:vllm_platform.h统一平台契约

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:40:57 阅读更多 →
C# Winform 绘图程序实战:GDI+ 实现线条、矩形、圆与多边形

C# Winform 绘图程序实战:GDI+ 实现线条、矩形、圆与多边形

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 6:41:34 阅读更多 →
多模态推荐工具箱实战:从环境搭建到模型训练与调优

多模态推荐工具箱实战:从环境搭建到模型训练与调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:12:01 阅读更多 →

最新新闻

Python职位推荐系统实战:协同过滤与内容相似度融合

Python职位推荐系统实战:协同过滤与内容相似度融合

简介:这份资源是面向Python初学者与推荐算法入门者的职位推荐系统完整项目资料,围绕基于用户与物品的协同过滤思路,解决招聘场景下职位个性化匹配的实践问题。压缩包共79个文件,约942KB,以47个py源码文件为核心&#x…

2026/10/11 14:15:23 阅读更多 →
【计算机毕设精品】基于SpringBoot的智慧博物馆综合信息管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目

【计算机毕设精品】基于SpringBoot的智慧博物馆综合信息管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目

💖💖作者:计算机毕业设计杰瑞 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括…

2026/10/11 14:15:23 阅读更多 →
LangAlpha多模型适配指南:Claude、GPT、Kimi、本地模型如何自由切换

LangAlpha多模型适配指南:Claude、GPT、Kimi、本地模型如何自由切换

【免费下载链接】LangAlpha Claude Code for Financial Market 项目地址: https://gitcode.com/gh_mirrors/la/LangAlpha 点击查看 免费下载 LangAlpha 是一个面向金融市场的 AI 投研 Agent(Claude Code for Financial Market),内…

2026/10/11 14:15:23 阅读更多 →
C++超级玛丽源码解析:SDL2选型、碰撞检测与手感调校

C++超级玛丽源码解析:SDL2选型、碰撞检测与手感调校

简介:C版《超级玛丽》完整游戏源码,适合游戏开发初学者及对2D平台跳跃游戏实现感兴趣的读者。资源基于经典任天堂玩法重构,包含游戏主循环、马里奥角色与敌人对象、关卡地图数据、物理碰撞检测及图像音频加载等核心模块,可帮助学习…

2026/10/11 14:15:23 阅读更多 →
AnyPS5:将游戏主机能力封装为统一REST/WebSocket接口的自动化中间件

AnyPS5:将游戏主机能力封装为统一REST/WebSocket接口的自动化中间件

先回答两个问题:AnyPS5 到底是个什么东西,它又值不值得你花几分钟看看。简单说,它不是模拟器,也不是破解工具,而是一层把某款主流游戏主机(为了避免型号念起来太长,后文统一叫 A5)的…

2026/10/11 14:15:23 阅读更多 →
PS5外围能力开发指南:USB-C多模接口与AnyPS5工程实践

PS5外围能力开发指南:USB-C多模接口与AnyPS5工程实践

项目标题:“AnyPS5”——这个名称本身带有强烈的指向性与模糊性并存的特征。它不是官方命名,也不属于索尼公开产品线中的任何已知型号或代号;没有出现在PlayStation官网、开发者文档或正规硬件白皮书中。但正因如此,“AnyPS5”在中…

2026/10/11 14:14:22 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →