Myślę o manipulowaniu kodami bajtowymi (myślę o programowaniu genetycznym) w Pythonie.Jak sprawdzić kod bajtowy Pythona?
natknąłem przypadku testowego w crashers test section drzewa źródłowego Pythona, który stwierdza:
Broken bytecode objects can easily crash the interpreter. This is not going to be fixed.
zatem pytanie, w jaki sposób sprawdzić poprawność podane manipulowane kodu bajtowego, że to nie będzie katastrofy tłumacza? Czy to możliwe?
źródło Test, po http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
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, ""
), {}
)()
)
tutaj, to moduł definiuje cc
że jeśli nazywa, mymod.cc()
awarii tłumacza. Jest to bardzo podstępny przykład, który utworzył nowy obiekt kodu z niestandardowym bajtowym kodem "KABOOM"
, a następnie uruchamia go.
Przyjmę coś, co weryfikuje predefiniowany kod bajtowy, np. z pliku .pyc
.
Nie znam żadnej metody potwierdzającej kod bajtowy, nie. To trudne zadanie; lepiej po prostu wydaj prawidłowy kod bajtowy. –
Myślę, że może to być nierozstrzygalne. Załóżmy, że masz kod bajtowy równoważny: 'if method_that_may_loop_forever(): crash()'. musiałbyś rozwiązać [problem z zatrzymaniem] (http://en.wikipedia.org/wiki/Halting_problem), aby ustalić, czy ulegnie awarii, czy nie. – Kevin
@Kevin Z pewnością nie chcę rozwiązać problemu z zatrzymaniem. Chcę tylko określić, czy dana sekwencja kodu bajtowego jest gwarantowana jako bezpieczna lub potencjalnie niebezpieczna. Podobne do tego, co robi JVM. –