2011-11-04 12 views
9

Abbiamo una base di codice XE Delphi grande che vogliamo portare a 64 bit.Porting di codice Delphi a 64 bit - Perché nessun avvertimento del compilatore?

Possiedo una licenza Delphi XE2 e non riesco a trovare alcun avviso né suggerimento che possa aiutarmi a rilevare costruzioni a 32 bit valide che ora possono portare alla perdita di dati in una piattaforma a 64 bit. Ad esempio, THandle a Cardinal assegnazioni perfettamente valide con il compilatore a 32 bit non generano alcun avviso durante la compilazione per Win64.

Durante la migrazione a Unicode con Delphi 2009, abbiamo ricevuto tonnellate di avvertenze che ci hanno aiutato molto a monitorare e correggere il codice sospetto. Con XE2, non riesco a trovare nulla. Non riesco a immaginare che non ci sia nulla di integrato nel livello del compilatore per evitare di fare una revisione manuale di tutto il nostro codice.

Mi manca qualcosa? Come hai portato i tuoi progetti a 64 bit, se ci provavi?

Grazie!

+0

'THandle' non è più mappato a' integer' più, ma a 'NativeUInt' (ovvero,' cardinal' solo in Win32). Può aiutare a identificare i problemi. –

+0

Non riesco a ottenere questo tipo di messaggi in XE (1), ad esempio assegnando un int a un byte ... – GolezTrol

+1

@GolezTrol: hai ragione, ma dai miei incarichi POV che potrebbero portare a risultati diversi quando sono compilati per Win32 o Win64 dovrebbero introdurre _a nuova classe di warning del compilatore_. –

risposta

0

Circa 5 anni fa, li ho trasferiti a 64-bit Free Pascal. (anche se solo le parti con un semplice test dell'unità per strumentarle)

Il test con entrambi i compilatori trova semplicemente più problemi.

+1

Grazie ... Tuttavia, troverei un po 'deprimente che dovresti usare DUE compilatori per aggirare i limiti di quello ufficiale che hai acquistato ad un prezzo significativo! –

+0

@Adrien, cosa ti fa pensare che cos'è Delphi ** compilatore ufficiale ** Pascal? –

+0

Bene, AFAIK dcc64.exe è il compilatore Delphi "ufficiale" a 64 bit se si desidera compilare il codice Delphi. –

2

Non ti è mancato nulla. Non c'è niente nel prodotto per aiutarti.

Anche io lo trovo un po 'deludente, ma mi aspetto che i designer di Emba pensassero a questo. Posso solo concludere che la loro esperienza è stata che l'aggiunta di tali avvertimenti ha comportato più rumore del segnale. Il compilatore Delphi non ha mai avvisato quando si assegna a tipi interi incompatibili. Ad esempio, non è mai stato un avviso o un errore assegnare un intero a un byte.

E 'il momento di accendere grep e la ricerca di Integer\(.*\), Longint\(.*\), Cardinal\(.*\), Longword\(.*\), THandle ecc


Per rispondere a commenti e la risposta di Arnaud, offro il seguente codice che compila privo di avvertimenti e errori quando si mira a 64 bit.

procedure NaughtyCode; 
var 
    Handle: THandle; 
    int: Integer; 
    card: Cardinal; 
    P: Pointer; 
begin 
    Handle := high(Handle); 
    int := Handle; 
    card := Handle; 
    P := Pointer(Handle); 
    int := Integer(P); 
    card := Cardinal(P); 
end; 
+0

Non riesco a capire perché non includano alcun avvertimento OPZIONALE che faciliterebbe il processo ... I caratteri tipografici sono una cosa, ma come ho detto, i compiti da/verso i tipi di dati con dimensioni diverse in Win64 (ad esempio, THandle) sono lontani più difficile da grep e potrebbe portare anche alla perdita di dati/corruzione dei dati. Io davvero non capisco la loro scelta. –

+0

Usando grep, la ricerca è OK ma tutti dovrebbero essere consapevoli di non usarlo per un'intera opzione "sostituisci" - questo potrebbe certamente infrangere il codice. In tutti i casi, quando compilato in Win64, i typecasts 'integer()' di 'THandle' o' pointer' generano un errore * del compilatore * esplicito. Quindi la ricerca IMHO non è obbligatoria: il compilatore lo farà apposta per te, quando imposti la piattaforma di destinazione su Win64. –

+0

@Arnaud Devo fare qualcosa di sbagliato. Come si configura XE2 per avvisare o per errore il codice aggiunto alla domanda? –

0

Come lei ha affermato, la maggior parte dei potenziali problemi provengono da:

  • modifiche WinAPI (ma la maggior parte del tempo identico/compatibile);
  • THandle non mappato a integer altro, ma a NativeUInt (ovvero, cardinal solo in Win32);
  • In aritmetica del puntatore, Integer typecast non mappato a NativeInt.

L'ultima alzerà compilatore errori, non solo di avvertimento (si tratta di un tipo non corrispondente esplicito), e la variazione THandle dovrebbero essere avvertiti come.

Non sarò così difficile con Embarcadero riguardo al compilatore principale - Sono più interessato ai compilatori in background (ad esempio CodeInsight) per essere not synchronized with the main compiler.Per me, il compilatore principale funziona bene e non mi lamento mai degli avvertimenti mancanti. Basta cercare esplicitamente THandle non è così difficile.

+0

Vedere la mia domanda aggiornata. Per quanto posso dire, ciò che affermi in questa risposta è in realtà errato. Non farò downvote perché rispetto il fatto che tu sia invariabilmente accurato e che sia più che probabile che abbia semplicemente trascurato qualcosa. Quindi, per favore, cosa ho trascurato? –

+0

Beh, intendevo ovviamente una risposta aggiornata. –

Problemi correlati