Domanda

Sto usando Delphi 7 IDE. Fa Delphi codici compilatore ottimizzare, proprio come quello che il compilatore C ++ sta facendo in questa seguente link?

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));

Se ZeroMemory sono stati chiamati in questo esempio, invece di SecureZeroMemory, il compilatore potrebbe ottimizzare la chiamata perché il buffer szPassword non viene letta dal prima che vada fuori portata. La password dovrebbe rimanere sul stack applicativo dove potrebbe essere catturato in un crash dump o sondato da un'applicazione dannosa.

È stato utile?

Soluzione

Si, certo Delphi esegue ottimizzazioni. Tuttavia, non esegue l'ottimizzazione che la funzione SecureZeroMemory ha lo scopo di aggirare. Non v'è alcuna necessità di utilizzare tale funzione in Delphi; basta usare semplice vecchia ZeroMemory, o addirittura FillChar. Non sono le macro, e non fare nulla che Delphi riconosce come istruzioni di assegnazione inutilizzati che potrebbero rimanere ottimizzati fuori.

Altri suggerimenti

Delphi ottimizzazione del codice esegue per impostazione predefinita, è possibile disattivarlo in Progetto> Opzioni> Compiler .

La guida in Delphi fornire alcuni suggerimenti su che tipo di ottimizzazioni sono utilizzati:

  

L'ottimizzazione del codice $ O direttiva controlli. Nella {$ O +} stato, le esegue compilatore numerose ottimizzazioni del codice, come l'immissione variabili nei registri CPU, eliminando sottoespressioni comuni, e la generazione di variabili induzione.

Essa afferma inoltre che "il compilatore non esegue '' ottimizzazioni" non sicuri , ma nel senso che essi non alterare il percorso di esecuzione, non da un punto di vista della sicurezza.

Non credo che il compilatore potrà mai eliminare il codice apparentemente morto in questo modo. Non ho mai avuto punti di interruzione di impostazione Problemi sul codice che potrebbe sono stati eliminati come ridondante.

Per alcuni scenari, il compilatore in grado di rilevare se il codice è irraggiungibile ed eliminare il codice.

Per esempio, il compilatore elimina correttamente la parte "irraggiungibile" del codice sottostante.
Non genererà il codice per quella linea così:

  1. Quindi, non ci sono proiettili blu che indica c'è codice
  2. breakpoint messo su quella linea verranno contrassegnati visivamente come 'non raggiungibile'

Proprio testato in Delphi XE, ma le vecchie versioni di Delphi hanno un comportamento simile.

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.

Ci vuole un bel po 'di tempo per imparare quando (o se no) l'ottimizzatore sul livello di codice e di livello Liker calci in.

Per esempio: Quando si dispone di ottimizzazioni attivate, il compilatore anche eliminare le variabili non appena essi non sono utilizzati
. A volte, si elimina anche simboli globali. Danny Thorpe (ex ingegnere Delphi Compiler e Chief Scientist) una volta ha scritto un metodo magico tocco che impedisce questo.
Basta chiamare questo metodo touch alla fine del tuo metodo per ingannare l'ottimizzatore durante il debug:

procedure Touch(var arg);
begin
end;

- Jeroen

Delphi ottimizza certamente codice (si tratta di una struttura moderna, ed eccellente, il compilatore). Un altro esempio di linee di ottimizzazione cancellazione è:

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

mi piace per garantire l'ottimizzazione è nello stato corretto (e non accidentalmente lasciato acceso o spento) con l'aggiunta di {$I MyProjectOptions.inc} in ogni file .pas nel mio progetto. Questo va sotto il nome dell'unità (a destra nella parte superiore del file). In "MyProjectOptions.inc" è sufficiente aggiungere questo codice:

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

Infine, assicurarsi di avere definito "DEBUG" e "NDEBUG" (o importo equivalente in vecchie versioni di Delphi) al condizionale definisce sezione del Progetto> Opzioni> Diectories / condizionali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top