2011-11-04 11 views
9

Chúng tôi có một mã nguồn lớn Delphi XE chúng tôi muốn chuyển sang 64 bit.Chuyển mã Delphi sang 64 bit - Tại sao không có cảnh báo trình biên dịch?

Tôi sở hữu giấy phép Delphi XE2 và tôi không thể tìm thấy bất kỳ cảnh báo cũng như gợi ý nào có thể giúp tôi phát hiện các cấu trúc 32 bit hợp lệ có thể dẫn đến mất dữ liệu theo nền tảng 64 bit. Ví dụ: THandle đến Hồng y các bài tập hoàn toàn hợp lệ với trình biên dịch 32 bit không gây ra bất kỳ cảnh báo nào khi biên dịch cho Win64.

Khi di chuyển sang Unicode với Delphi 2009, chúng tôi đã có rất nhiều cảnh báo giúp chúng tôi theo dõi và sửa chữa mã đáng ngờ. Với XE2, tôi không thể tìm thấy gì cả. Tôi không thể tưởng tượng không có gì được tích hợp ở cấp độ trình biên dịch để tránh chúng tôi thực hiện việc xem xét thủ công tất cả các mã của chúng tôi.

Tôi có bỏ lỡ điều gì đó không? Làm thế nào bạn cổng bạn dự án đến 64 bit, nếu bạn đã thử?

Cảm ơn!

+0

'THANDLE' không được ánh xạ tới' số nguyên' nữa, nhưng với 'NativeUInt' (nghĩa là' chỉ số 'duy nhất trong Win32). Nó có thể giúp xác định các vấn đề. –

+0

Tôi dường như không thể nhận được những loại tin nhắn này trong XE (1) hoặc, ví dụ gán một int cho một byte ... – GolezTrol

+1

@GolezTrol: bạn nói đúng, nhưng từ bài tập POV của tôi có thể dẫn đến kết quả khác nhau khi chúng được biên dịch cho Win32 hoặc Win64 nên giới thiệu _a lớp cảnh báo trình biên dịch mới. –

Trả lời

0

Khoảng 5 năm trước, tôi đã chuyển chúng sang Pascal miễn phí 64 bit. (ngay cả khi chỉ các bộ phận có thử nghiệm đơn vị đơn giản để thực hiện chúng)

Thử nghiệm với cả hai trình biên dịch chỉ đơn giản là tìm thấy nhiều vấn đề hơn.

+1

Cảm ơn ... Tuy nhiên, tôi sẽ tìm thấy một chút thất vọng rằng bạn sẽ phải sử dụng HAI trình biên dịch để phá vỡ những hạn chế của một trong những chính thức bạn mua ở một mức giá đáng kể! –

+0

@ Adrien, điều gì khiến bạn nghĩ Delphi là gì ** ** trình biên dịch Pascal chính thức? –

+0

Vâng, AFAIK dcc64.exe là trình biên dịch Delphi 64 bit "chính thức" nếu bạn muốn biên dịch mã Delphi. –

2

Bạn không bỏ lỡ bất cứ điều gì. Không có gì trong sản phẩm để giúp bạn.

Tôi cũng thấy điều này một chút đáng thất vọng nhưng tôi hoàn toàn mong đợi rằng các nhà thiết kế Emba nghĩ về điều này. Tôi chỉ có thể kết luận rằng kinh nghiệm của họ là việc thêm các cảnh báo như vậy dẫn đến nhiều tiếng ồn hơn tín hiệu. Trình biên dịch Delphi chưa bao giờ cảnh báo khi gán cho các kiểu số nguyên không tương thích. Ví dụ, nó chưa bao giờ là một cảnh báo hoặc một lỗi để gán một số nguyên cho một byte.

Đó là thời gian để cháy lên grep và tìm kiếm Integer\(.*\), Longint\(.*\), Cardinal\(.*\), Longword\(.*\), THandle, vv


Để đáp lại lời nhận xét và trả lời Arnaud, tôi cung cấp đoạn mã sau đó biên dịch miễn phí các cảnh báo và lỗi khi nhắm mục tiêu 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

Tôi không thể hiểu tại sao họ không bao gồm bất kỳ cảnh báo OPTIONAL nào có thể dễ dàng xử lý ... Typecasts là một điều, nhưng như tôi đã nói, các bài tập từ/đến kiểu dữ liệu có kích thước khác nhau trong Win64 (ví dụ THANDLE) khó khăn hơn để grep và có thể dẫn đến mất dữ liệu/dữ liệu tham nhũng là tốt. Tôi thực sự không hiểu lựa chọn của họ. –

+0

Bằng cách sử dụng grep, tìm kiếm là OK nhưng mọi người nên biết không sử dụng nó cho toàn bộ tùy chọn "thay thế" - điều này chắc chắn có thể phá vỡ mã. Trong mọi trường hợp, khi được biên dịch theo Win64, các kiểu 'integer()' của 'THandle' hoặc' pointer' sẽ làm cho trình biên dịch * lỗi rõ ràng *. Vì vậy, IMHO tìm kiếm không phải là bắt buộc: trình biên dịch sẽ làm cho nó vào mục đích cho bạn, khi thiết lập nền tảng mục tiêu để Win64. –

+0

@Arnaud Tôi phải làm điều gì sai. Làm thế nào để bạn cấu hình XE2 để cảnh báo hoặc lỗi cho mã tôi thêm vào câu hỏi? –

0

Như bạn nói, hầu hết các vấn đề tiềm năng đến từ:

  • thay đổi WinAPI (nhưng hầu hết thời gian giống hệt/tương thích);
  • THandle không được ánh xạ tới integer nữa, nhưng đến NativeUInt (nghĩa là, cardinal chỉ trong Win32);
  • Trong số học con trỏ, Integer typecast không được ánh xạ tới NativeInt.

Mới nhất sẽ nâng cao trình biên dịch lỗi, không chỉ cảnh báo (nó là một loại không phù hợp rõ ràng), và sự thay đổi THandle nên được cảnh báo như.

Tôi sẽ không quá khó với Embarcadero về trình biên dịch chính - Tôi quan tâm nhiều hơn đến các trình biên dịch nền (ví dụ: CodeInsight) là not synchronized with the main compiler.Đối với tôi, trình biên dịch chính hoạt động tốt, và tôi không bao giờ phàn nàn về việc thiếu cảnh báo. Chỉ cần tìm kiếm một cách rõ ràng THandle không phải là quá khó khăn.

+0

Vui lòng xem câu hỏi được cập nhật của tôi. Cho đến khi tôi có thể nói, những gì bạn nói trong câu trả lời này là không chính xác. Tôi sẽ không downvote bởi vì tôi tôn trọng thực tế là bạn luôn luôn chính xác và rằng nó nhiều hơn khả năng là tôi đã chỉ đơn giản là bỏ qua một cái gì đó. Vì vậy, xin vui lòng, những gì tôi đã bỏ qua? –

+0

Vâng, tôi có nghĩa là câu trả lời cập nhật tất nhiên. –