Портирование кода Delphi на 64-битные - почему нет предупреждений компилятора? - PullRequest
9 голосов
/ 04 ноября 2011

У нас есть большая кодовая база Delphi XE, которую мы хотим портировать на 64 бита.

У меня есть лицензия Delphi XE2, и я не могу найти ни предупреждения, ни подсказки, которые могли бы помочь мне обнаружить действительные 32-битные конструкции, которые теперь могут привести к потере данных на 64-битной платформе. Например, назначения THandle до Cardinal , которые были полностью допустимы для 32-битного компилятора, не вызывают никаких предупреждений при компиляции для Win64.

При переходе на Unicode с Delphi 2009 у нас было множество предупреждений, которые очень помогли нам отследить и исправить подозрительный код. С XE2 я ничего не могу найти. Я не могу себе представить, что на уровне компилятора ничего не интегрировано, чтобы мы не делали ручной просмотр всего нашего кода.

Я что-то пропустил? Как вы переносили свои проекты на 64-битные, если пытались?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

Вы ничего не пропустили. В продукте нет ничего, что могло бы вам помочь.

Я тоже нахожу это немного разочаровывающим, но я полностью ожидаю, что дизайнеры Emba подумали об этом. Я могу только заключить, что их опыт заключался в том, что добавление таких предупреждений приводило к большему количеству шума, чем сигнала. Компилятор Delphi никогда не предупреждал при назначении несовместимых целочисленных типов. Например, никогда не было предупреждением или ошибкой присваивать байту целое число.

Пора запустить grep и искать Integer\(.*\), Longint\(.*\), Cardinal\(.*\), Longword\(.*\), THandle и т. Д.


Чтобы ответить на комментарий и ответ Арно, я предлагаю следующий код, который компилируется без предупреждений и ошибок при нацеливании на 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;
0 голосов
/ 05 ноября 2011

Как вы заявили, большинство потенциальных проблем возникает из-за:

  • Изменения WinAPI (но в большинстве случаев идентичны / совместимы);
  • THandle не сопоставлены с integer больше, но до NativeUInt (то есть cardinal только под Win32);
  • В арифметике указателей Integer typecast не сопоставлено с NativeInt.

Последний вызовет компилятор ошибки , а не только предупреждение (это явное несоответствие типов), а изменение THandle должно быть предупреждено как.

Я не будутак сложно с Embarcadero по поводу основного компилятора - меня больше волнуют фоновые компиляторы (например, CodeInsight), чтобы не синхронизировался с основным компилятором .Для меня основной компилятор работает нормально, и я никогда не жалуюсь на пропущенные предупреждения.Просто явно найти THandle не так уж и сложно.

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

Около 5 лет назад я перенес их на 64-битный Free Pascal.(даже если только части с простым модульным тестом для их измерения)

Тестирование с обоими компиляторами просто обнаруживает больше проблем.

...