9

64 ビットに移植したい大きな Delphi XE コードベースがあります。

Delphi XE2 ライセンスを所有していますが、64 ビット プラットフォームでデータ損失につながる有効な 32 ビット構造を検出するのに役立つ警告やヒントが見つかりません。たとえば、32 ビット コンパイラで完全に有効だったTHandleからCardinalへの割り当ては、Win64 用にコンパイルするときに警告を発しません。

Delphi 2009 で Unicode に移行したとき、疑わしいコードを追跡して修正するのに役立つ大量の警告がありました。XE2 では、何も見つかりません。すべてのコードを手動でレビューすることを避けるために、コンパイラ レベルで統合されたものは何もないとは思えません。

私は何かが恋しいですか?試した場合、どのようにプロジェクトを 64 ビットに移植しましたか?

ありがとう !

4

3 に答える 3

2

あなたは何も逃しませんでした。この製品には、あなたを助けるものは何もありません。

私もこれには少しがっかりしていますが、エンバのデザイナーがこれについて考えたことを完全に期待しています. 彼らの経験では、そのような警告を追加すると信号よりもノイズが多くなるという結論しか得られません. Delphi コンパイラは、互換性のない整数型に代入するときに警告を発したことはありません。たとえば、バイトに整数を代入しても警告やエラーになることはありません。

grep を起動して、、、、、などを検索Integer\(.*\)します。Longint\(.*\)Cardinal\(.*\)Longword\(.*\)THandle


Arnaud のコメントと回答に対応するために、64 ビットを対象とする場合に警告とエラーなしでコンパイルされる次のコードを提供します。

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;
于 2011-11-04T22:02:11.030 に答える
0

あなたが述べたように、潜在的な問題のほとんどは以下から来ています:

  • WinAPIの変更(ただし、ほとんどの場合、同一/互換性があります)。
  • THandleintegerこれ以上マップされませんが、にマップされますNativeUInt(つまり、cardinalWin32の下でのみ)。
  • ポインタ演算では、Integer型キャストはにマップされていませんNativeInt

最新のものは、警告(明示的な型の不一致)だけでなく、コンパイラエラーTHandleを発生させます。変更はとして警告する必要があります。

私はメインコンパイラについてEmbarcaderoにそれほど苦労することはありません-メインコンパイラと同期されないバックグラウンドコンパイラ(CodeInsightなど)にもっと関心があります。私にとって、メインコンパイラは正常に動作し、警告が欠落していることについて文句を言うことはありません。明示的に検索することTHandleはそれほど難しくありません。

于 2011-11-05T10:47:19.237 に答える
0

約 5 年前、私はそれらを 64 ビット Free Pascal に移植しました。(それらを計測するための単純な単体テストを備えたパーツのみであっても)

両方のコンパイラでテストすると、より多くの問題が見つかります。

于 2011-11-04T19:27:31.460 に答える