CN113885854A - 一种Python外部函数的静态类型推断方法及系统 - Google Patents

一种Python外部函数的静态类型推断方法及系统 Download PDF

Info

Publication number
CN113885854A
CN113885854A CN202111105813.3A CN202111105813A CN113885854A CN 113885854 A CN113885854 A CN 113885854A CN 202111105813 A CN202111105813 A CN 202111105813A CN 113885854 A CN113885854 A CN 113885854A
Authority
CN
China
Prior art keywords
external function
python
type
type conversion
external
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202111105813.3A
Other languages
English (en)
Inventor
张昱
胡明哲
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
University of Science and Technology of China USTC
Original Assignee
University of Science and Technology of China USTC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by University of Science and Technology of China USTC filed Critical University of Science and Technology of China USTC
Priority to CN202111105813.3A priority Critical patent/CN113885854A/zh
Publication of CN113885854A publication Critical patent/CN113885854A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/34Graphical or visual programming
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明涉及一种Python外部函数的静态类型推断方法及系统,其方法包括:步骤S1:对Python/C多语言项目进行语言分离;对于分离后得到的C语言文件,识别其中的外部函数声明,分析每个外部函数声明对应的外部函数实现的参数类型转换和返回类型转换;步骤S2:根据所述外部函数声明、参数类型转换和返回类型转换进行类型推断,同时对外部函数声明和对应外部函数实现进行无参函数声明一致性的检查。本发明提供的方法可以推断外部函数的类型签名,增强已有的Python静态类型推断工具,使其能够分析程序中的外部函数调用,并检查外部函数声明与其实现不一致的漏洞。

Description

一种Python外部函数的静态类型推断方法及系统
技术领域
本发明涉及编程语言和静态分析领域,具体涉及一种Python外部函数的静态类型推断方法及系统。
背景技术
静态类型推断是维护动态类型语言程序安全的重要手段之一。然而,另一种编程语言实现的外部函数往往不在宿主语言的类型推断范围内。Python作为一种流行的动态类型语言,其大量广泛使用的Python包都是包含C/C++外部扩展的多语言架构。
学界和业界都在Python的静态类型推断这一问题上做了大量尝试。这些工作可以分为以下三类:
1.通过扩展语法支持类型标注,并基于类型标注进行类型推断。代表性的包括Python社区的Mypy、Microsoft的Pyright和Facebook的Pyre。该方法的弊端在于需要修改源码且影响了Python开发的敏捷性。
2.基于机器学习的方法。代表性的包括Xu等人在2016年提出的方法和Allamanis等人在2020年提出的Typilus。一方面该方法的数据集往往来自传统方法的推断结果,另一方面该方法是非确定性的,只能得到概率的结果。
3.基于数据流分析、抽象解释、SMT求解等传统程序分析方法。代表性的包括来自Google的Pytype、Google和Sourcegraph等公司曾使用过的PySonar、Fritz等人2017年提出的方法、Hassan等人2018年提出的方法、Monat等人2020年提出的方法。这些工作对外部对象的处理往往采用直接忽略(如视为object类型)或预置类型存根(type stubs)等方法,类型推断精度表现不佳或需要人工辅助。
可以看到,已有的确定性的、且不基于类型标注的Python静态类型推断工具无法有效地处理外部函数。因此,如何对Python外部函数的类型进行静态推断,成为一个亟待解决的问题。
发明内容
为了解决上述技术问题,本发明提供一种Python外部函数的静态类型推断方法及系统。
本发明技术解决方案为:一种Python外部函数的静态类型推断方法,包括:
步骤S1:对Python/C多语言项目进行语言分离;对于分离后得到的C语言文件,识别其中的外部函数声明,分析每个所述外部函数声明对应的外部函数实现的参数类型转换和返回类型转换;
步骤S2:根据所述外部函数声明、参数类型转换和返回类型转换进行类型推断,同时对所述外部函数声明和对应所述外部函数实现进行无参函数声明一致性的检查。
本发明与现有技术相比,具有以下优点:
本发明提出了一种Python外部函数的静态类型推断方法,通过分析跨语言接口层的隐性信息来推断外部函数的类型签名,并据此设计实现了静态类型推断系统PyCType。本发明可以可靠地推断大多数外部函数的参数个数和类型。同时,本发明还可以进一步增强已有的Python静态类型推断工具,使其能够分析程序中的外部函数调用。此外,本发明可以检查外部函数声明与其实现不一致的漏洞,从而避免该类漏洞导致无参外部函数可以接收任意类型的参数的错误。
附图说明
图1为本发明实施例中一种Python外部函数的静态类型推断方法的流程图;
图2A为本发明实施例中Python的C扩展模块中外部函数调用的一个例子;
图2B为本发明实施例中外部函数通过Python/C API映射到C实现一个例子;
图2C为本发明实施例中外部函数的C实现的一个例子;
图3为本发明实施例中类型系统视角下的外部函数调用的示意图;
图4为本发明实施例中Python/C多语言软件系统的抽象语法的示意图;
图5为本发明实施例中Python侧的类型;
图6为本发明实施例中Python侧类型的子定型规则;
图7为本发明实施例中C侧类型;
图8为本发明实施例中格式化单元转换规则;
图9为本发明实施例中一个复杂的返回类型转换的例子;
图10为本发明实施例中CPython、NumPy和Pillow中外部函数的参数的类型的推断率;
图11为本发明实施例中类型推断增强实验结果;
图12为本发明实施例中一种Python外部函数的静态类型推断系统的结构框图;
图13为本发明实施例中PyCType结构示意图。
具体实施方式
本发明提供了一种Python外部函数的静态类型推断方法,可以推断大多数外部函数的参数个数和类型,并进一步增强已有的Python静态类型推断工具,以及检查外部函数声明与其实现不一致的漏洞。
为了使本发明的目的、技术方案及优点更加清楚,以下通过具体实施,并结合附图,对本发明进一步详细说明。
在进行Python外部函数的静态类型推断之前,本发明实施例为静态类型推断系统PyCType内置一个依赖配置库和配置调试工具,配置并存储使多语言项目源码可编译所需的依赖。以一个Python/C多语言项目为例,输入PyCType,PyCType的配置调试工具会输出解析文件遇到的问题,如未知的头文件和未定义的对象。依赖配置库会记录成功解析对应文件所需增加的编译参数,对于每个项目,该过程只需执行一次。对于一个已配置的项目,会直接加载其配置库。同时配置库会内置一些通用的编译选项,对于每个项目和新的项目都会默认加载这部分配置。
为了更好的说明本发明,首先对其中使用的符号基础进行说明。推理规则形式化地表示为
Figure BDA0003272261920000031
其中假设判断J1…Jk组成推理前提,J称作结论。形式
Figure BDA0003272261920000032
的假言判断中,符号
Figure BDA0003272261920000033
表示句法后承,即在上下文Γ中可以推出J成立。
实施例一
如图1所示,本发明实施例提供的一种Python外部函数的静态类型推断方法,包括下述步骤:
步骤S1:对Python/C多语言项目进行语言分离;对于分离后得到的C语言文件,识别其中的外部函数声明,分析每个外部函数声明对应的外部函数实现的参数类型转换和返回类型转换;
步骤S2:根据外部函数声明、参数类型转换和返回类型转换进行类型推断,同时对外部函数声明和对应外部函数实现进行无参函数声明一致性的检查。
Python的外部函数接口Python/C API是桥接Python和C/C++的中间层。如图2A所示程序host.py是Python的C扩展模块的一个例子,其中外部函数extm.foo通过如图2B所示程序interface.c中的Python/C API PyMethodDef映射到C实现_foo,再通过Python/C APIPyModuleDef关联到模块extm。如图2C所示程序foreign.c,在外部函数的C实现内部,Python/C API PyArg_ParseTuple是一类常见的参数解析方法,它通过格式化串指明由Python到C的类型转换,Python/C API PyLong_FromLong是一类常见的返回类型转换,它把一个C整型变量转换到Python整型变量并返回到Python侧。
对于静态类型语言,外部函数在声明时带有显式类型,动态类型语言虽然没有这一信息(如图2B中第2行),但在接口层仍需给出包含跨语言的类型转换等信息的调用接口描述。本发明的通过建模并分析这些调用接口描述中的隐式信息,推断作用于外部函数的类型约束。
图3展示了在类型系统视角下的外部函数调用。如果仅仅从单语言视角来看(虚线),外部函数的参数类型和返回类型都是不可知的(灰色框);但在多语言的视角下(实线),结合接口层得到的调用接口描述,外部函数的类型实际是可推导的。本发明实施例把这些隐式信息分成三个部分:
1、外部函数声明(D)建立Python侧外部函数的调用名和C侧外部函数实现之间的映射关系。
2、参数类型转换(P)刻画Python侧传入外部函数的实参到C变量的类型转换。
3、返回类型转换(R)刻画C侧返回值变量返回Python侧时的类型转换。
图4是Python/C多语言软件系统的抽象语法的形式化表示,其中上标p和c分别标记Python和C这两种语言侧。不同于本地函数在Python侧声明与定义、并在Python侧应用,外部函数的应用在Python侧,但其声明和定义都在C侧。
举例来说,作为动态类型语言,如图5所示的Python侧类型,是Python变量在运行时被绑定的类型值,包括str、int、object等内置类型;同时引入函数类型pFunc表示函数,引入积类型pProduct表示list、tuple、dict等类型,引入和类型pUnion支持共用体这一C侧常见的语言特性。一些类型如module、iterator等不在类型集合中,因为它们在传递给外部函数时会被作为object类型对象处理。
Python/C接口层的调用接口描述能够给出更严格的类型/值约束。比如图2C中,Python/C API函数PyArg_ParseTuple的第2个参数值指定的格式化单元之一‘I’要求传入对应的外部函数的实参是一个Python整型并且非负。本发明实施例利用子类型来刻画这类规则。Python侧类型的子定型规则如图6所示。
如图7所示的C侧类型,除了常见的内置类型外,还包括一些CPython解释器内部与Python侧类型实现相对应的结构体。作为Python/C API的一部分,它们也被用于在接口层接收Python侧传递并转换的对象。
在以上核心思路和文法定义的基础上,本发明把类型推断规则定义为形式化的表示形式。
在一个实施例中,上述步骤S1:对Python/C多语言项目进行语言分离;对于分离后得到的C语言文件,识别其中的外部函数声明,分析每个外部函数声明对应的外部函数实现的参数类型转换和返回类型转换,具体包括:
步骤S11:类型推断规则形式化定义为如下“规则描述规则名”的形式:
Figure BDA0003272261920000051
其中,外部函数声明D、参数类型转换P和返回类型转换R共同构成推理前提;fP表示外部函数在Python侧的调用名;pFunc表示函数类型,其两个参数分别对应函数的参数类型和返回类型;
本发明实施例利用外部函数声明D、参数类型转换P和返回类型转换R共同构成推理,从而推导出包含在Python/C接口层调用接口描述中的外部函数的类型签名,函数类型的参数类型和返回类型由D、P、R的具体组合确定。
步骤S12:外部函数声明D表示如下:
Figure BDA0003272261920000052
其中,flag给出调用惯例,fP表示外部函数在Python侧的调用名,fc表示该外部函数对应的C侧实现,该表达式表示外部函数在Python侧的调用名和C侧的实现之间的映射关系;
外部函数声明D描述了Python侧外部函数调用名和C侧实现的映射关系。例如,在CPython中,当调用惯例flag为METH_VARARGS时,它表示外部函数接收一个或多个Python对象作为参数,它们被打包成一个对象并传递到C侧,接口层需要给出把这一打包对象解析到多个C变量的规则。
步骤S13:参数类型转换P表示如下:
Figure BDA0003272261920000053
其中,该表达式表示外部函数从Python侧传入的实参在程序性质
Figure BDA0003272261920000054
成立的上下文下到C变量的类型转换;pType表示一个Python侧类型,cType表示一个C侧类型,类型集合见图5和图7。
步骤S14:返回类型转换R表示如下:
Figure BDA0003272261920000055
其中,该表达式表示外部函数在C侧的返回值在程序性质
Figure BDA0003272261920000061
成立的上下文下返回Python侧时C类型到Python类型的转换;作为Python的一部分,其外部函数也支持多返回(multiple returns)的语言特性,而C本身是不支持的。
在一个实施例中,上述步骤S13:参数类型转换,具体包括:
步骤S131:当调用惯例flag为METH_NOARGS时,外部函数被声明为无参的,其表示如下:
Figure BDA0003272261920000062
其中,形如
Figure BDA0003272261920000063
的判断表示只有当关于程序性质
Figure BDA0003272261920000064
的门限语义谓词
Figure BDA0003272261920000065
为真时,判断J成立,门限语义谓词
Figure BDA0003272261920000066
分析调用惯例标记flag,以判断外部函数是否被声明为无参的,当其为无参时,外部函数的参数类型转换表示为在Python侧和C侧都是对应的空类型;
步骤S132:当所述外部函数对应的C实现对传入的参数不解析和使用时,外部函数视为是无参的,表示如下:
Figure BDA0003272261920000067
其中门限语义谓词
Figure BDA0003272261920000068
对C实现进行参数未使用分析。
动态类型语言(Python)和静态类型语言(C/C++)在类型系统上的差异,以及Python外部函数接口的设计导致了这种声明上的冗余,并且留下了声明不一致的隐患。即只有当上述两个门限语义谓词都为真时,才可以确定外部函数是无参的。
步骤S133:当S131和S132中两个门限语义谓词都为真时,可以确定外部函数是无参的,其表示如下:
Figure BDA0003272261920000069
步骤S134:当S131和S132中两个门限语义谓词都为假时,外部函数至少接收一个Python对象,其表示如下:
Figure BDA00032722619200000610
其中,lap是某个参数解析族的Python/C API,ui是其第i个格式化单元。例如,格式化单元I对应Python非负整型到C无符号int类型的转换,
Figure BDA00032722619200000611
完整的格式化单元转换规则如图8所示。
在本步骤中,当两个门限语义谓词都为假时,外部函数至少接收一个Python对象,这些Python侧对象被打包为接口层的一个中间参数,该参数被解析并恢复到若干个C变量。最常见的,这一类型转换是由参数解析族Python/C API完成。这些Python/C API用一个格式化串指明转换规则,一个格式化串包含零或多个格式化单元,每个格式化单元(特殊含义字符除外)对应一个Python类型到C类型的转换。
在一个实施例中,上述步骤S14:返回类型转换,具体包括:
步骤S141:值构建分析,返回类型转换表示如下:
Figure BDA0003272261920000071
其中,lvb是某个值构建族的Python/C API,uj是其第j个格式化单元,m个C变量根据对应的格式化单元转换到Python对象并共同构成一个tuple对象作为一个支持Python多返回特性的值。
步骤S142:显式转换分析,返回类型转换表示如下:
Figure BDA0003272261920000072
其中,显式转换的Python/C APIιec包含以下三种形式:
a)PyPT_FromCT()把一个CT类型的C变量转换到一个PT类型的Python变量;
b)PyPT_New()创建并返回一个PT类型的Python变量;
c)Py_PT本身直接作为一个PT类型的对象被返回到Python侧。
C程序支持作为右结合算子的显式类型转换,对于一个形如return(β1)...(βn)w的返回表达式可用下述步骤表示。
步骤S143:类型转换分析,返回类型转换表示如下:
Figure BDA0003272261920000073
其中,C类型β1作为外部函数的C实现向Python侧的返回,是与Python内置类型一一对应的结构体。
除了上述三种返回类型外,还存在如图9所示一个复杂的返回类型转换的例子,变量result被声明为T1类型(一般为PyObject*),其可能通过调用前述的一些Python/C API被赋值为更精化的类型(T2,T3)。本发明实施例通过一个过程内的可达定义分析
Figure BDA0003272261920000074
来分析这样的类型传播。
Figure BDA0003272261920000075
内部会调用前面三类的返回类型转换分析,其返回类型转换如下述步骤所示。
步骤S144:可达定义分析,返回类型转换表示如下:
Figure BDA0003272261920000081
其中,
Figure BDA0003272261920000082
内部调用S141、S142和S143中三类的返回类型转换分析变量传播情形下的返回类型。
在一个实施例中,上述步骤S2中根据外部函数声明、参数类型转换和返回类型转换进行类型推断,具体包括:
步骤S21:由S1确定S11中推理前提的具体组合,其中D包含S12一种形式,P包含S133或S134两种形式,R包含S141或S142或S143或S144四种形式;
对于使用参数解析分析进行参数类型转换以及值构建分析进行返回类型转换的外部函数,其类型推断规则由S12中外部函数声明D、S134中参数类型转换Pap和S141中返回类型转换Rvb共同构成前提,并推断如下:
Figure BDA0003272261920000083
对于带有显式返回的无参外部函数,其类型推断规则由S12中外部函数声明D、S133中参数类型转换Pcc和S142中返回类型转换Rec共同构成前提,并推断如下:
Figure BDA0003272261920000084
对于所有可能的推断前提:D包含S12一种形式,P包含S133或S134两种形式,R包含S141或S142或S143或S144四种形式,即一共存在8种组合,其推断规则与上述步骤S21中所述的两种情形类似,此处不再赘述。
步骤S22:对外部函数声明和对应外部函数实现进行无参外部函数声明一致性的检查:当S131中门限语义谓词为真,且S132中门限语义谓词为假时,该声明不一致,则会导致无参外部函数可以接受任意类型的参数的错误。
以图2B中简单的外部函数为例,首先由PyMethodDef建立(D)外部函数声明
Figure BDA0003272261920000085
然后由函数指针找到对应的外部函数实现_foo,由其中的参数解析族Python/C API建立(P)参数类型转换:
Figure BDA0003272261920000091
Figure BDA0003272261920000092
由显式转换的Python/C API建立(R)返回类型转换
Figure BDA0003272261920000093
那么利用规则(TInfer:D-Pap-Rec)的类型推断如下:
Figure BDA0003272261920000094
Figure BDA0003272261920000095
Figure BDA0003272261920000096
Figure BDA0003272261920000097
即Python外部函数foo接收两个非负整型的位置参数作为输入,以一个整型变量作为返回值。当flag为METH_NOARGS,
Figure BDA0003272261920000098
为假,进一步根据外部函数实现分析
Figure BDA0003272261920000099
若其为真,则标记对应的Python侧外部函数存在声明一致性问题。
当完成上述步骤后,PyCType会记录所有包含外部函数声明的文件,对于每一个外部函数,记录其声明和实现的位置,以及参数类型(包括位置参数和可选参数)和返回类型推断的结果。对于每一个漏洞发现,PyCType会记录其对应的外部函数的位置。
得到外部函数的类型推断结果后,根据Python标准的类型标注格式编码成pyi文件,然后即可作为Python单语言类型推断工具Pytype的类型存根,从而使其能够分析Python程序中的外部函数调用。
本发明提供的一种Python外部函数的静态类型推断方法的可靠性是构建以上严格的推理系统的主要目的之一,即类型推断的结果没有错误(但可能不够精确,如把int推断为object)。本发明实施例通过人工检查验证了该静态类型推断系统的可靠性。同时漏洞发现也是没有误报的,所有错误都可以构造出对应的触发代码。
在可靠性基础上,本发明提供的一种Python外部函数的静态类型推断方法的完备性衡量类型推断系统有效性的一个重要指标,即推断率。一方面,参数个数往往多于返回值,另一方面,外部函数调用作为Python程序的一部分,其返回值可能是其他(外部)函数的参数。因此,整个系统的有效性需要和已有的单语言的类型推断工具结合起来进行评估。如图10所示是CPython、NumPy和Pillow中外部函数的参数的类型的推断率。可以看到,对于参数类型转换,规则(Pcc)和(Pap)能够覆盖大多数的情形。同时在规则中描述更多符合条件的Python/C API并不困难。
由于可靠并不等于精确,因此本发明实施例采用图10中推断率最高的Pillow来构建类型增强实验以进一步衡量有效性。来自Google的Pytype是state-of-the-art的Python静态类型推断工具,其不支持外部函数的自动推断,而是通过类型存根预置了一些外部函数的类型签名,如常见的标准库函数。本发明实施例把对Pillow中外部函数类型推断的结果编码成Pytype的类型存根,然后比较这一类型增强前后的推断率。我们选择GitHub中使用了Pillow且星标多于3万的Python仓库作为实验目标,类型推断增强实验结果如图11所示,可以看到,PyCType对Pytype有7%到80%的提升(平均27.5%)。
本发明提出了一种Python外部函数的静态类型推断方法,通过分析跨语言接口层的隐性信息来推断外部函数类型签名,并据此设计实现了静态类型推断系统PyCType。本发明可以可靠地推断大多数外部函数的参数个数和类型。同时,本发明还可以进一步增强已有的Python静态类型推断工具,使其能够分析程序中的外部函数调用。此外,本发明可以检查外部函数声明与其实现不一致的漏洞,从而避免该类漏洞导致该无参外部函数可以接收任意类型的参数的错误。
实施例二
如图12所示,本发明实施例提供了一种Python外部函数的静态类型推断系统,包括下述模块:
识别和分析模块21,用于对Python/C多语言项目进行语言分离;对于分离后得到的C语言文件,识别其中的外部函数声明,分析每个外部函数声明对应的外部函数实现的参数类型转换和返回类型转换;
类型推断模块22,用于根据外部函数声明、参数类型转换和返回类型转换进行类型推断,同时对外部函数声明和对应外部函数实现进行无参函数声明一致性的检查。
如图13所示,展示了PyCType结构示意图,其中,语言分离器分离Python和C代码。预处理配置器配置解析文件所需的依赖。AST(抽象语法树)生成基于Python实现的C99解析器pycparser。在得到接口代码的AST后,多数分析实现为AST访问,当某个分析需要其他中间表示如CFG时,AST转换对对应的AST片段进行变换。其他主要处理模块(圆角矩形)与前文对应。
提供以上实施例仅仅是为了描述本发明的目的,而并非要限制本发明的范围。本发明的范围由所附权利要求限定。不脱离本发明的精神和原理而做出的各种等同替换和修改,均应涵盖在本发明的范围之内。

Claims (6)

1.一种Python外部函数的静态类型推断方法,其特征在于,包括:
步骤S1:对Python/C多语言项目进行语言分离;对于分离后得到的C语言文件,识别其中的外部函数声明,分析每个所述外部函数声明对应的外部函数实现的参数类型转换和返回类型转换;
步骤S2:根据所述外部函数声明、参数类型转换和返回类型转换进行类型推断,同时对所述外部函数声明和对应所述外部函数实现进行无参函数声明一致性的检查。
2.根据权利要求1所述的Python外部函数的静态类型推断方法,其特征在于,所述步骤S1:对所述Python/C多语言项目进行语言分离;对于分离后得到的C语言文件,识别其中的外部函数声明,分析每个所述外部函数声明对应的外部函数实现的参数类型转换和返回类型转换,具体包括:
步骤S11:类型推断规则形式化定义为如下“规则 描述 规则名”的形式:
Figure FDA0003272261910000011
其中,外部函数声明D、参数类型转换P和返回类型转换R共同构成推理前提;fP表示外部函数在Python侧的调用名;pFunc表示函数类型,其两个参数分别对应函数的参数类型和返回类型;
步骤S12:所述外部函数声明D表示如下:
Figure FDA0003272261910000012
其中,flag给出调用惯例,fP表示外部函数在Python侧的调用名,fC表示该外部函数对应的C侧实现,该表达式表示外部函数在Python侧的调用名和C侧的实现之间的映射关系;
步骤S13:所述参数类型转换P表示如下:
Figure FDA0003272261910000013
其中,该表达式表示外部函数从Python侧传入的实参在程序性质
Figure FDA0003272261910000014
成立的上下文下到C变量的类型转换;
步骤S14:所述返回类型转换R表示如下:
Figure FDA0003272261910000021
其中,该表达式表示外部函数在C侧的返回值在程序性质
Figure FDA0003272261910000022
成立的上下文下返回Python侧时C类型到Python类型的转换。
3.根据权利要求2所述的Python外部函数的静态类型推断方法,其特征在于,所述步骤S13:所述参数类型转换,具体包括:
步骤S131:当所述调用惯例flag为METH_NOARGS时,所述外部函数被声明为无参的,其表示如下:
Figure FDA0003272261910000023
其中,形如
Figure FDA0003272261910000024
的判断表示只有当关于程序性质
Figure FDA0003272261910000025
的门限语义谓词
Figure FDA0003272261910000026
为真时,判断J成立;
步骤S132:当所述外部函数对应的C实现对传入的参数不解析和使用时,所述外部函数视为是无参的,表示如下:
Figure FDA0003272261910000027
步骤S133:当S131和S132中两个所述门限语义谓词都为真时,可以确定所述外部函数是无参的,其表示如下:
Figure FDA0003272261910000028
步骤S134:当S131和S132中两个所述门限语义谓词都为假时,所述外部函数至少接收一个Python对象,其表示如下:
Figure FDA0003272261910000029
其中,ιap是某个参数解析族的Python/C API,ui是其第i个格式化单元。
4.根据权利要求2所述的Python外部函数的静态类型推断方法,其特征在于,所述步骤S14:所述返回类型转换,具体包括:
步骤S141:值构建分析,所述返回类型转换表示如下:
Figure FDA00032722619100000210
其中,lvb是某个值构建族的Python/C API,uj是其第j个格式化单元,m个C变量根据对应的格式化单元转换到Python对象并共同构成一个tuple对象作为一个支持Python多返回特性的值;
步骤S142:显式转换分析,所述返回类型转换表示如下:
Figure FDA0003272261910000031
其中,显式转换的Python/C API ιec包含以下三种形式:
a)PyPT_FromCT()把一个CT类型的C变量转换到一个PT类型的Python变量;
b)PyPT_New()创建并返回一个PT类型的Python变量;
c)Py_PT本身直接作为一个PT类型的对象被返回到Python侧;
步骤S143:类型转换分析,所述返回类型转换表示如下:
Figure FDA0003272261910000032
其中,C类型β1作为外部函数的C实现向Python侧的返回,是与Python内置类型一一对应的结构体;
步骤S144:可达定义分析,所述返回类型转换表示如下:
Figure FDA0003272261910000033
其中,
Figure FDA0003272261910000034
内部调用S141、S142和S143中三类的返回类型转换分析变量传播情形下的返回类型。
5.根据权利要求1所述的Python外部函数的静态类型推断方法,其特征在于,所述步骤S2中根据所述外部函数声明、参数类型转换和返回类型转换进行类型推断,具体包括:
步骤S21:由S1确定S11中推理前提的具体组合,其中D包含S12一种形式,P包含S133或S134两种形式,R包含S141或S142或S143或S144四种形式;
对于使用参数解析分析进行参数类型转换以及值构建分析进行返回类型转换的外部函数,其类型推断规则由S12中所述外部函数声明D、S134中所述参数类型转换Pap和S141中所述返回类型转换Rvb共同构成前提,并推断如下:
Figure FDA0003272261910000035
Figure FDA0003272261910000036
Figure FDA0003272261910000037
对于带有显式返回的无参外部函数,其类型推断规则由S12中所述外部函数声明D、S133中所述参数类型转换Pcc和S142中所述返回类型转换Rec共同构成前提,并推断如下:
Figure FDA0003272261910000041
Figure FDA0003272261910000042
步骤S22:对所述外部函数声明和对应所述外部函数实现进行无参外部函数声明一致性的检查:当S131中所述门限语义谓词为真,且S132中所述门限语义谓词为假时,该声明不一致,则会导致所述无参外部函数可以接受任意类型的参数的错误。
6.一种Python外部函数的静态类型推断系统,其特征在于,包括下述模块:
识别和分析模块,用于对Python/C多语言项目进行语言分离;对于分离后得到的C语言文件,识别其中的外部函数声明,分析每个所述外部函数声明对应的外部函数实现的参数类型转换和返回类型转换;
类型推断模块,用于根据所述外部函数声明、参数类型转换和返回类型转换进行类型推断,同时对所述外部函数声明和对应所述外部函数实现进行无参函数声明一致性的检查。
CN202111105813.3A 2021-09-22 2021-09-22 一种Python外部函数的静态类型推断方法及系统 Pending CN113885854A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111105813.3A CN113885854A (zh) 2021-09-22 2021-09-22 一种Python外部函数的静态类型推断方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111105813.3A CN113885854A (zh) 2021-09-22 2021-09-22 一种Python外部函数的静态类型推断方法及系统

Publications (1)

Publication Number Publication Date
CN113885854A true CN113885854A (zh) 2022-01-04

Family

ID=79010125

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111105813.3A Pending CN113885854A (zh) 2021-09-22 2021-09-22 一种Python外部函数的静态类型推断方法及系统

Country Status (1)

Country Link
CN (1) CN113885854A (zh)

Similar Documents

Publication Publication Date Title
US6353925B1 (en) System and method for lexing and parsing program annotations
US7526755B2 (en) Plug-in pre- and postconditions for static program analysis
US7421680B2 (en) Persisted specifications of method pre-and post-conditions for static checking
US7958493B2 (en) Type inference system and method
KR101120853B1 (ko) 관리 도구 환경
US8132156B2 (en) Methods and systems for testing tool with comparative testing
US9710243B2 (en) Parser that uses a reflection technique to build a program semantic tree
RU2395837C2 (ru) Механизм для обеспечения расширенных функциональных возможностей для инструкций командной строки
US9418230B2 (en) Automated tools for building secure software programs
US20070050704A1 (en) XML compiler that will generate an application specific XML parser
CN101751281A (zh) 编译器生成系统和方法
DeLine et al. The Fugue protocol checker: Is your software baroque
US10789154B2 (en) Client server computer code mapping and visualization
US8863115B2 (en) Execution of program code having language-level integration of program models
US8898100B2 (en) Testing for rule-based systems
US8533673B2 (en) Language-level integration of programming models
Flanagan Effective Static Debugging
KR102546424B1 (ko) 학습용 데이터 생성 장치, 소스 코드 오류 분석 장치 및 방법
Hu et al. Static type inference for foreign functions of python
Gondow et al. Towards ANSI C program slicing using XML
Møller et al. Static validation of XSL Transformations
Parr et al. Purdue compiler-construction tool set
Agarwal et al. Copilot Evaluation Harness: Evaluating LLM-Guided Software Programming
CN113885854A (zh) 一种Python外部函数的静态类型推断方法及系统
US7698633B2 (en) Markup metalanguage

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination