OASIS:用于面向对象 Ada 代码分析的 ASIS 二级库
代码分析视角
从 ASIS(Ada 语义接口规范)的角度来看,代码由两个编译单元组成,它们都定义了诸如标记类型声明、类型扩展声明和子程序声明等语法元素。使用 ASIS 主要查询分析代码时,我们可以手动或通过实例化 ASIS 的 Traverse_Element 通用过程来遍历其结构。借助 ASIS 元素分类查询,能轻松检测标记类型、记录组件、类型扩展和子程序。
从面向对象范式的角度看,代码定义了一个包含三个类的层次结构,以及一个包含三个派生项的派生层次结构。每个派生项在层次结构中有其位置,并有一组组件和一组可继承的基本操作。根派生项是标记类型 A,它有可派生组件 Comp 以及基本操作 Pack1.P1 和 Pack1.P2,注意 Pack2.P3 不是该类型的基本操作,因此不属于该派生项。
要对面向对象代码进行此类分析,ASIS 工具首先要为派生项和派生类的概念创建抽象,然后使用标准“基于元素”查询的非平凡组合来收集和整合所需信息。以下是仅基于主要查询的可能方法:
- 派生项与表示标记类型或类型扩展声明的 ASIS 元素相关联。对应于类型扩展的派生项的完整组件集是继承组件和扩展部分成员组件的并集,工具可使用 Asis.Definitions.Implicit_Inherited_Declarations 查询来检索继承组件。
- 要获取派生项的操作集,即对应类型的基本操作集,工具必须遍历包含相应类型声明的包声明。遍历过程中,对于遇到的每个子程序声明,包括继承子程序的隐式声明,都要检查该子程序是否为该类型的基本操作。
- 要找到以某个派生项为根的派生类,例如与 Pack1.A 关联的派生