2016-03-02 5 views
6

Рассмотрим код:У компиляторов Pascal нужна функция SecureZeroMemory?

procedure DoSmthSecret; 
var 
    Seed: array[0..31] of Byte; 

begin 
// get random seed 
    .. 
// use the seed to do something secret 
    .. 
// erase the seed 
    FillChar(Seed, SizeOf(Seed), 0); 
end; 

Проблема с кодом является: FillChar является компилятор внутренней и потенциально компилятор может «оптимизировать его». Проблема известна для компиляторов C/C++, см. SecureZeroMemory. Может ли такой компилятор Pascal (Delphi, FPC) сделать такую ​​оптимизацию, и если да, то могут ли они предоставить эквивалент SecureZeroMemory?

+1

Delphi компилятор, конечно, не может сделать эту оптимизацию, не знаю о FPC –

+0

FillChar определенно не оптимизирован. Во всяком случае, оптимизация никогда не должна меняться, и начинка памяти - такой результат. –

+1

@RudyVelthuis Код, который записывает переменные, которые впоследствии не могут быть прочитаны, может быть оптимизирован. Вот почему существует «SecureZeroMemory». –

ответ

3

FPC не может выполнять такую ​​оптимизацию на данный момент, а afaik даже с C++ они входят в «неопределенный» класс. (так как состояние программы из-за этой оптимизации игнорирует то, что говорит программист)

Решение такой проблемы - вопрос определения, какие конструкции можно оптимизировать, а какие нет. Он не нуждается в помощи API/ОС как таковой, любой связанный с внешним объектом объектный файл с такой функцией будет делать (с тех пор глобальная оптимизация не коснется его)

Обратите внимание, что статья не называет компилятор C++, поэтому я ожидаю, что это более общая функция функции, когда пользователь компилятора попадает в проблемы, не слишком сильно ударяя документы, или когда он должен легко работать с несколькими компиляторами (только для Windows!), не слишком усложняя сборку.

Выбор функции non-inlinable API может быть не оптимальным в других случаях, особенно с небольшими, постоянными размерами до нуля, поскольку он не будет встроен, поэтому я буду осторожен с этой функцией и убедитесь, что есть Жесткая потребность

Это может быть важно, главным образом, когда внешний объект может изменять память (DMA, сопоставление памяти и т. д.) программы или стирать пароли и другую конфиденциальную информацию из образа памяти, даже если программа в соответствии с компилятором никогда не прочитает его

+0

"(так как состояние программы из-за этой оптимизации игнорирует то, что программист говорит ей)« Точно. Такой код существует с определенной целью и никогда не должен быть оптимизирован. –

+0

Такие уровни оптимизации и функции, как SecureZeroMemory, предназначены для людей, которые знают, что они делают, и много времени для этого. Если бы не было недостатков для более высоких уровней оптимизации, они были бы дефолтными. –

+0

Я все еще не хочу, чтобы оптимизатор устранил код, который может выглядеть мертвым, но это не так. Если этот код не нужен, я его выдержу. –

1

Even if FreePascal оптимизирует запись в память, которая никогда не читается снова (что я сомневаюсь, что это atm, reg безразлично, как долго вы, ребята, обсуждаете это), он поддерживает модификатор типа , который гарантирует (документированно), чтобы никогда не оптимизировать (в некоторой степени похожий на volatile в C/C++).

+0

Delphi тоже этого не делает. Аргумент заключается лишь в том, должен ли язык делать или разрешать это вообще. Я говорю нет. –

+0

Тогда сделайте это. ;) Я сказал да. – tofro

+0

Я имел в виду, если это должно позволить радикальные оптимизации, как обсуждалось здесь. Я говорю нет. –

 Смежные вопросы

  • Нет связанных вопросов^_^