Delphi编译时整数转换警告?

10

在 Delphi XE 或 2006 中,有没有办法在编译时检测到整数类型之间的隐式转换可能会丢失数据?我知道可以通过运行时检查来检测这一点。即使“大”值为1,我也希望它能标记以下示例。(我们正在考虑将int更改为bigint用于某些数据库键,并希望确定对大型遗留代码库的影响。)

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  small: Integer;
  big: Int64;
begin
  big := 3000000000000;
  small := big;  // Detect me!

  Writeln(small);
end.
2个回答

10
您不会在编译时收到任何警告或提示。Delphi编译器不进行任何程序流分析,也就是说,当将一个太大的值赋给small时,它不会告诉您big包含一个太大的值。它会默默地截断这个值,让它适应较小的类型。我尝试使用了Shortint,这是一个带符号的字节大小类型,即使如此,它也没有给出任何警告或提示。
而且没有办法让Delphi发出警告。这将是很好的。也许您可以在QC中建议(如果还没有建议过的话)?

5
它在运行时捕获到了它。如果能在编译时得到关于精度丢失或值截断的提示或警告就好了。 - Rudy Velthuis
3
@daemon认为为了一些微不足道的回报而添加这样一个功能需要付出很多努力。更好的利用时间是编写64位编译器并修复产品中的所有缺陷。 - David Heffernan
1
@David:编译器可以警告你将8字节类型(如Int64)赋值给1字节类型(如Shortint),这可能会导致精度损失或截断。请注意,编译器对AnsiString和UnicodeString之间的转换也进行类似处理,即使UnicodeString仅包含ASCII范围内的代码点。 - Rudy Velthuis
1
他在询问整数类型之间的隐式转换,以及可能会丢失数据。他希望能够收到有关此潜在数据损失的警告。他对值不感兴趣;他甚至说:“即使“大”值为1,我也希望它能标记以下示例。”因此,该值并不重要。 - Rudy Velthuis
3
@David - Rudy说得对。 值并不重要,隐式转换才是关键。 抱歉造成的歧义。 - TrueWill
显示剩余14条评论

1
在Delphi中,即使在Delphi 10.3中也不行。 但是看一下名为“Pascal Analyzer”的软件,由www.peganza.com制造。
他们有很多选项之一是(摘自软件帮助文档):

enter image description here

测试的源代码,请查看第32行:

enter image description here

分析结果显示第32行可能存在错误的赋值:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接