pytype

Pysa:Facebook最新开源Python静态分析工具

南笙酒味 提交于 2021-01-14 03:31:50
Python代码静态分析是一个标准化工程必不可少的一个环节,工程在上线之前需要对代码规范、语法问题进行详细的检查,防止问题随着代码发布到生产环境,避免酿成更大的故障。 这一点,在很多大型公司是非常重视的。因此,Python方面的静态检查工具层出不穷,处理经常使用的 pylint ,还有除此知名公司的一些工具: Google的pytype Microsoft的pyright Facebook的Pyre 虽然这些静态检查工具出自不同公司,但是核心功能如出一辙。都是基于PEP规范,去检查Python代码中的语言风格,判断是否符合编程规范,是否满足Python语法的要求,而对于更深层次的 安全 问题却从未涉足。 而Facebook最新开源的 Pysa 则是一款专注于检测和预防Python代码中 安全性问题 的静态检查工具,本文就来介绍一下这款出自Facebook的Python静态检查工具。 Pysa Pysa是一个专注于安全性的工具,它是在Facebook之前开源的静态检查工具 Pyre 的基础上进行开发的。 它主要用于检查代码中的数据流问题,这一点至关重要,因为,许多安全和隐私问题都可以归结为数据流入和流出过程中产生的。 Pysa使用了一些Facebook内部框架进行开发而成,这些框架主要基于隐私策略相关技术来防止用户数据的访问和泄露,这对于一家以社交为主的公司,可以说是非常擅长。

Python虚拟机类机制之descriptor(三)

久未见 提交于 2020-05-02 04:00:37
从slot到descriptor 在 Python虚拟机类机制之填充tp_dict(二) 这一章的末尾,我们介绍了slot,slot包含了很多关于一个操作的信息,但是很可惜,在tp_dict中,与__getitem__关联在一起的,一定不会是一个slot,原因很简单,slot不是一个PyObject,它不能存放在dict对象中。当然,我们再深入思考一下,会发现slot也不会被“调用”。既然slot不是一个PyObject,那么它就没有type,也就无从谈起什么tp_call了,所以slot是无论如何也不满足前面所描述的Python的“可调用”这个概念 前面我们说过,Python虚拟机会在tp_dict找到__geiitem__对应的操作后,调用该操作,所以在tp_dict中与__getitem__对应的只能是另一个包装了slot的PyObject,在Python中,我们称为descriptor 在Python内部,存在多种descriptor,与PyTypeObject中的操作对应的是PyWrapperDescrObject。在此后的描述,我们将用术语descriptor来专门表示PyWrapperDescrObject。一个descriptor包含一个slot,其创建是通过PyDescr_NewWrapper descrobject.h #define PyDescr

Python虚拟机类机制之自定义class(四)

蓝咒 提交于 2020-05-02 02:57:42
用户自定义class 在本章中,我们将研究对用户自定义class的剖析,在demo1.py中,我们将研究单个class的实现,所以在这里并没有关于继承及多态的讨论。然而在demo1.py中,我们看到了许多类的内容,其中包括类的定义、类的构造函数、对象的实例化、类成员函数的调用等 demo1.py class A(object): name = "Python" def __init__(self): print("A::__init__") def f(self): print("A::f") def g(self, aValue): self.value = aValue print(self.value) a = A() a.f() a.g(10)    我们都知道,对于一个包含函数定义的Python源文件,在Python源文件编译后,会得到一个与源文件对应的PyCodeObject对象A,而与函数对应的PyCodeObject对象B则存储在A的co_consts变量中。那么对于包含类的Python源文件,编译之后的结果又如何呢? >>> source = open("demo1.py").read() >>> co = compile(source, "demo1.py", "exec") >>> co.co_consts ('A', <code object A at

Python虚拟机类机制之从class对象到instance对象(五)

柔情痞子 提交于 2020-05-02 01:44:19
从class对象到instance对象 现在,我们来看看如何通过class对象,创建instance对象 demo1.py class A(object): name = "Python" def __init__(self): print("A::__init__") def f(self): print("A::f") def g(self, aValue): self.value = aValue print(self.value) a = A() a.f() a.g(10)    在 Python虚拟机类机制之自定义class(四) 这一章中,我们看到了Python虚拟机是如何执行class A语句的,现在,我们来看看,当我们实例化一个A对象,Python虚拟机又是如何执行的 a = A() //字节码指令 22 LOAD_NAME 1 (A) 25 CALL_FUNCTION 0 28 STORE_NAME 2 (a)    在前面一节 Python虚拟机类机制之自定义class(四) ,我们看到在创建class对象的最后,Python执行引擎通过STORE_NAME指令,将创建好的class对象放入到local名字空间,所以在实例化class A的时候,指令"22 LOAD_NAME 1 (A)"会重新将class A对象取出,压入到运行时栈中。之后