Есть ли способ изменить байтовое представление объекта Python во время выполнения? - PullRequest
0 голосов
/ 10 июля 2020

Цель состоит в том, чтобы смоделировать среду с высоким уровнем излучения.

Обычно следующий код:

a = 5
print(a)
print(a)

выводит:

5
5

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

a = RandomlyChangingInteger(5)
print(a)
print(a)

может привести к:

4
2

Один из способов сделать это для таких языков, как C и C ++, - это вставить дополнительные инструкции, которые потенциально может изменять a перед каждым использованием a в скомпилированном коде. Я думаю о чем-то вроде BITFLIPS (который использует valgrind).

Возможно ли это даже в Python?

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вы пытаетесь смоделировать побитовые перевороты, вызванные излучением, но ваши ожидания относительно того, что это будет делать, не соответствуют цели. Эффекты излучения с большей вероятностью могут взломать sh Python программу, чем изменить значение объекта на другое допустимое значение. Это делает моделирование эффектов излучения не очень полезным. ударить что-то, что вызывает трещину sh. Возможно, поврежден указатель типа объекта, что вызовет плохой доступ к памяти в следующий раз, когда вы попытаетесь что-то сделать с объектом, или, возможно, повреждение счетчика ссылок, в результате чего объект будет освобожден, пока он все еще используется. Возможно, повреждение длины int (Python целые числа имеют переменную ширину), в результате чего Python пытается прочитать за пределами конца выделения.

Где массив C целых может быть просто гигантский блок числовых данных, в котором можно обнаружить или управлять случайным повреждением битов, список Python целых чисел в основном состоит из указателей и других метаданных.

Если вы действительно хотите имитировать случайные перевороты битов, лучший способ to go, скорее всего, будет перестроить CPython с помощью такого инструмента, как связанная вами штука BITFLIPS.

1 голос
/ 10 июля 2020

Ты можешь это вроде как. Встроенный int неизменяем, поэтому вы не можете изменить его значение. Однако вы можете создать собственный класс, который имитирует int:

import random


class RandomlyChangingInteger(object):
    def __int__(self):
        return random.randint(0, 10)

    def __str__(self):
        return str(self.__int__())

, тогда

a = RandomlyChangingInteger()
print(a)
print(a)

должен напечатать что-то вроде

4
5

Обратите внимание, что вы не можете использовать этот класс для математических вычислений в его нынешнем виде. Сначала необходимо реализовать другие методы int (например, __add__, __mul__, и т. Д. c).

...