Содержит ли скомпилированный автономный исполняемый файл Cython весь исходный код? - PullRequest
0 голосов
/ 18 ноября 2018

Я экспериментирую с Cython и возможностями обфускации кода ( статья ). В этой статье особо отмечено:

Когда компиляция завершена, невозможно скомпилировать библиотеки обратно в читаемый исходный код Python!

Я использую этот вопрос Информация для компиляции моего кода в автономном исполняемом файле. В моем понимании и, как упоминалось в статье 1 , Cython переводит код Python в код C с соответствующими вызовами библиотеки Python (это правильно?). В других случаях у нас есть только файл C в качестве вывода, и он не может быть декомпилирован обратно, как файлы .pyc.

Мой тестовый код очень прост:

def my_crashing_function():
    x = "1"
    y = 2
    test = x + y  # we will crash here

if __name__ == "__main__":
    my_crashing_function()

Но когда я запускаю этот исполняемый файл (после cython --embed -o test.c main.py и gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl -s) Я получаю ошибку, как это:

user@debian:~# ./hello 
Traceback (most recent call last):
  File "main.py", line 7, in init main
   my_crashing_function()
  File "main.py", line 4, in main.my_crashing_function
   test = x + y  # we will crash here
TypeError: Can't convert 'int' object to str implicitly

Как видите, у нас есть трассировка со всеми именами методов, правильными именами переменных и строками, даже с оригинальными комментариями исходного кода. Если мы переименуем переменную или изменим комментарий - он также будет изменен при трассировке. Я не понимаю, как traceback может отображать всю эту информацию. Это может работать таким образом, только если полный исходный код также хранится в исполняемом файле. Пожалуйста, объясните мне, где я не прав?

Обновление. Traceback в моей ситуации был сгенерирован из оригинального .py файла. Этот файл находился в той же папке, что и скомпилированный исполняемый файл, и только благодаря этому я получил весь исходный код и комментарии в traceback. После удаления оригинального .py файла трассировка будет содержать только тип исключения и номера строк, без другой информации.

1 Ответ

0 голосов
/ 18 ноября 2018

Нет, код не вставляется.Он полагается на возможность найти файл .pyx - если вы переместите этот файл, вы получите трассировку, но без исходного кода.

Если вы осмотрите сгенерированный источник C, вы обнаружите, что ошибкапроцедура обработки проходит через __Pyx_AddTraceback, затем __Pyx_CreateCodeObjectForTraceback, что создает PyCodeObject, связанный с вашим .pyx исходным файлом.

При некоторых обстоятельствах (я не уверен, чтохотя) вместо этого он ссылается на ваш файл .c.Однако будут применяться те же правила - если он не может найти источник, он не покажет эту строку.


Даже без файла .pyx вы все равно получите трассировку с полезными именами методов - этисохраняются в скомпилированном исполняемом файле.

...