Действительно ли установка переменной, равной самой себе, выполняется в C++?
Я работаю над созданием забытых графовых алгоритмов, которые в основном скрывают схему доступа к памяти алгоритма. Предполагается, что память зашифрована, но злоумышленник может контролировать ее. Предполагается, что процессор находится в облаке, защищен и имеет собственный кэш.
Известно, что шаблон доступа графа может раскрыть информацию об этом графе.
Чтобы сделать алгоритм забывающим, необходимо добавить в алгоритм фиктивную работу. Такая работа включает в себя чтение и запись данных, но таким образом, чтобы не вызывать изменения результатов алгоритма (такие изменения, конечно, сделали бы алгоритм бесполезным).
Необходимо, чтобы фиктивная работа была на самом графике, иначе злоумышленник сможет отследить, какая работа является реальной, а какая - фальшивой.
Конечно, добавление фиктивной работы создает замедления. Таким образом, как простое решение, я хотел бы присвоить переменную себе. Это создаст чтение и запись в местоположение, фактически ничего не меняя. Мой вопрос заключается в том, выполняют ли компиляторы этот код (кажется, в gdb, но только потому, что это отладчик)? Я использую gcc, но было бы лучше, если бы алгоритм мог быть скомпилирован с другими компиляторами и все еще не замечать.
Альтернативой установке переменной, равной самой себе, было бы использование оператора if: проверьте, равна ли переменная некоторому значению, а затем установите переменную на это значение в операторе if. Если возможно, я бы хотел избежать заявлений if, потому что они замедляют работу.
Наконец, этот алгоритм является многопоточным. Если глобальная переменная установлена равной себе, нужно ли на нее устанавливать блокировку мьютекса? Такие замки, конечно, замедляют ход событий, поэтому я бы хотел их избежать, если это возможно.
1 ответ
Оптимизатор компилятора, скорее всего, полностью удалит этот оператор во время компиляции, поэтому, скорее всего, он не будет выполнен. Отладка обычно не использует оптимизированный код, потому что вы проходите через каждый оператор, чтобы он выполнялся там. Если вы хотите, вы можете отключить оптимизацию компилятора, а затем провести тесты. Флаг для GCC это -O0
Как отключить оптимизацию компилятора в gcc?
Изменить: От вашего многопоточного вопроса, зависит. Если единственный доступ к переменной - это самопредставление, то нет, потому что выполнение с чередованием не изменит значение переменной независимо от того, сколько потоков запущено. Однако если хотя бы один поток изменяет переменную каким-либо другим способом, вам придется использовать блокировки.