Компилятор Delphi выполняет оптимизацию? - PullRequest
1 голос
/ 03 ноября 2010

Я использую Delphi 7 IDE.Оптимизирует ли компилятор Delphi коды так же, как это делает компилятор C ++ в следующей ссылке?

http://msdn.microsoft.com/en-us/library/aa366877(VS.85).aspx

WCHAR szPassword[MAX_PATH];
// Retrieve the password
if (GetPasswordFromUser(szPassword, MAX_PATH))    
   UsePassword(szPassword);
// Clear the password from memory
SecureZeroMemory(szPassword, sizeof(szPassword));

Если в этом примере вместо * 1008 были вызваны ZeroMemory*, компилятор может оптимизировать вызов, потому что буфер szPassword не читается, пока не выйдет из области видимости.Пароль будет оставаться в стеке приложений, где он может быть захвачен в аварийном дампе или проверен вредоносным приложением.

Ответы [ 5 ]

12 голосов
/ 03 ноября 2010

Да, конечно, Delphi выполняет оптимизацию.Однако он не выполняет оптимизацию, которую должна обойти функция SecureZeroMemory.Нет необходимости использовать эту функцию в Delphi;просто используйте старый ZeroMemory или даже FillChar.Они не макросы и не делают ничего, что Delphi распознает как неиспользуемые операторы присваивания, которые можно оптимизировать.

2 голосов
/ 03 ноября 2010

Delphi выполняет оптимизацию кода по умолчанию, ее можно отключить в Проект> Параметры> Компилятор .

Справка Delphi содержит несколько советов о том, какой тип оптимизации используется:

Директива $ O управляет оптимизацией кода.В состоянии {$ O +} компилятор выполняет ряд оптимизаций кода, таких как размещение переменных в регистрах ЦП, устранение общих подвыражений и генерация переменных индукции.

В нем также говорится, что «компилятор не выполняет« небезопасных »оптимизаций» , но в том смысле, что они не изменят путь выполнения, не с точки зрения безопасности.

0 голосов
/ 24 июля 2015

Delphi, безусловно, оптимизирует код (это современный и отличный компилятор). Другой пример оптимизации удаления строк:

SomeFunction();  // Set breakpoint here, then step (F10)
myInt := 7;      // Next line will not hit this...
myInt := 13;     // ...but will instead skip to here

Мне бы хотелось убедиться, что оптимизация находится в правильном состоянии (и не случайно оставлена ​​включенной или выключенной), добавив {$I MyProjectOptions.inc} в каждый файл .pas в моем проекте. Это идет чуть ниже имени устройства (справа вверху файла). В «MyProjectOptions.inc» вы просто добавляете этот код:

// Is this a debug or non-debug build?
{$IF Defined(DEBUG)}
    {$O-}   // Turn optimization off
{$ELSEIF Defined(NDEBUG)}
    {$O+}   // Ensure optimisation is on
{$IFEND}

Наконец, убедитесь, что вы определили «DEBUG» и «NDEBUG» (или ваш эквивалент в более старых версиях Delphi) в разделе «Условные определения» в Project> Options> Diectories / Conditionals.

0 голосов
/ 04 ноября 2010

В некоторых случаях компилятор может определить, недоступен ли код, и удалить код.

Например, компилятор правильно удаляет «недоступную» часть кода ниже.
Он не будет генерировать код для этой строки, поэтому:

  1. Таким образом, нет синих пуль, указывающих на наличие кода
  2. Точки останова, установленные на этой линии, будут визуально помечены как «недостижимые»

Только что протестировано в Delphi XE, но более старые версии Delphi ведут себя аналогично.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure Test;
begin
  if (True = False) then
    Writeln('Unreachable')
  else
    Writeln('Reachable');
end;

begin
  try
    Test();
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Требуется довольно много времени, чтобы понять, когда (или когда нет) активируется оптимизатор на уровне кода и на уровне liker.

Например: если у вас включены оптимизации, компилятор также удалит переменные, как только они не будут использованы.
Иногда это даже устраняет глобальные символы. Дэнни Торп (бывший инженер компилятора Delphi и главный ученый) однажды написал магический метод Touch , который предотвращает это.
Просто вызовите этот метод Touch в конце вашего метода, чтобы обмануть оптимизатор во время отладки:

procedure Touch(var arg);
begin
end;

- Йерун

0 голосов
/ 03 ноября 2010

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

...