Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何验证Python字节码?_Python_Bytecode Manipulation_Genetic Programming - Fatal编程技术网

如何验证Python字节码?

如何验证Python字节码?,python,bytecode-manipulation,genetic-programming,Python,Bytecode Manipulation,Genetic Programming,我正在考虑用Python做一些字节码操作(比如遗传编程) 我在Python源代码树中遇到了一个测试用例,它说明: 断开的字节码对象很容易使解释器崩溃。这不是 我们会修好的 因此,问题是,如何验证给定的经过调整的字节码,使其不会使解释器崩溃?有可能吗 测试源,在 在这里,这个模块定义了cc,如果调用它,mymod.cc()会使解释器崩溃。当然,这是一个非常棘手的示例,它使用自定义字节码创建了新的代码对象,然后运行它 我会接受一些验证预定义字节码的东西,例如从.pyc文件中。基于问题中所述的原因,P

我正在考虑用Python做一些字节码操作(比如遗传编程)

我在Python源代码树中遇到了一个测试用例,它说明:

断开的字节码对象很容易使解释器崩溃。这不是 我们会修好的

因此,问题是,如何验证给定的经过调整的字节码,使其不会使解释器崩溃?有可能吗

测试源,在

在这里,这个模块定义了
cc
,如果调用它,
mymod.cc()
会使解释器崩溃。当然,这是一个非常棘手的示例,它使用自定义字节码创建了新的代码对象,然后运行它


我会接受一些验证预定义字节码的东西,例如从
.pyc
文件中。

基于问题中所述的原因,Python可能不是此类任务的理想语言

一种方法是:不要创建或接受原始字节码,只接受Python源代码,自己编译


此外,还存在一些库(),它们在AST级别上操纵Python以获得一些安全保证,例如防止沙箱溢出。

使用字节码汇编程序跨跳转进行堆栈跟踪,全局验证堆栈级别预测一致性,并自动拒绝生成死代码的尝试。实际上,不可能意外地生成会使解释器崩溃的字节码

这可能会对您有所帮助。

两个都过时了,第一个没有代码(至少我找不到),但可能有助于了解可以做什么/如何做以及限制是什么

完全有效的字节码仍然可以做可怕的事情


我知道没有任何方法可以验证字节码,没有。这是一项艰巨的任务;最好只生成有效的字节码。我认为这可能是不可判定的。假设您的字节码等价于:
if方法可以永远循环():crash()
。你必须解决这个问题才能确定它是否会崩溃。@Kevin我当然不想解决停车问题。我只想确定一个特定的字节码序列是保证安全的还是潜在的不安全。与JVM类似,如果可以生成python源代码并执行它,为什么要直接生成字节码?第一种方法没有很好的文档记录,缺乏工具等。。。对于您的案例,源代码生成是否存在严重的缺点?在遗传编程中,质量或适合度正在优化。如果无效候选比例过高,则遗传算法无效。通过构造更好地确保候选者是正确的,以便可以计算适合度。但是很难!很好的库/链接,我必须验证它是否确实按照我想要的程度验证字节码。我怀疑对任意代码跳转的验证在技术上是不可判定的,因此问题在于字节码汇编程序是出于谨慎(拒绝潜在的坏字节码)还是出于用户(允许潜在的好代码)的考虑。如果使用字节码汇编模块(),就不需要找出这些东西。就这点而言,它对标签、块处理等有很多支持。它的完整手册在()中。恐怕这句话只适用于使用
BytecodeAssembler
生成代码,而不适用于解析现有字节码。事实证明,将现有字节码映射到API调用序列是可能的,不过,我正在尝试破解一些东西……如果我错了,请纠正我,但是
RestrictedPython
需要python源代码作为输入,不是吗?是的。这就是AST抽象语法树。如果你想学究气,那不是源代码本身。因此,免责声明(可能不适合您的方法)。至少对于一个简单的
“KABOOM”
是由
Python字节码验证器
验证器注意到的。验证器错误:无法验证的代码:堆栈下溢。偏移量:0堆栈:0边界:0必需:2
;当然,这个方案已经过时得令人绝望。
cc = (lambda fc=(
    lambda n: [
        c for c in
            ().__class__.__bases__[0].__subclasses__()
            if c.__name__ == n
        ][0]
    ):
    fc("function")(
        fc("code")(
            0, 0, 0, 0, "KABOOM", (), (), (), "", "", 0, ""
        ), {}
    )()
)