【问题标题】:Delphi compile-time integer conversion warnings?Delphi编译时整数转换警告?
【发布时间】:2011-10-15 10:46:27
【问题描述】:

在 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.

【问题讨论】:

    标签: delphi type-conversion compiler-warnings delphi-xe


    【解决方案1】:

    在编译时您不会收到任何警告或提示。 Delphi 编译器进行任何程序流分析,告诉它big 在分配给small 时包含过大的值。它默默地截断值以使其适合较小的类型。我尝试了Shortint,这是一个有符号字节大小的类型,甚至没有给出警告或提示。

    而且没有办法让 Delphi 警告你。这会很好。也许您可以在QC 中提出建议(如果尚未提出建议)?

    【讨论】:

    • 它在 runtime 捕获它。获得关于精度损失或值截断的编译时间提示或警告会很好。
    • @daemon 添加这样一个功能以获得微不足道的回报需要付出很多努力。最好把时间花在编写 64 位编译器和修复产品中的所有缺陷上。
    • @David:编译器会警告您将 Int64 之类的 8 字节类型分配给 Shortint 之类的 1 字节类型,这可能会导致精度损失或截断。请注意,编译器对 AnsiString 和 UnicodeString 之间的转换执行类似操作,即使 UnicodeString 仅包含 ASCII 范围内的代码点。
    • 他在询问整数类型之间的隐式转换,这可能会丢失数据。他希望就这种可能的数据丢失发出警告。他对价值观不感兴趣;他甚至说I would want it to flag the following example even if the "big" value were 1. 所以价值并不重要。
    • @David - Rudy 是对的。值不重要;隐式转换是。很抱歉有歧义。
    【解决方案2】:

    在 Delphi 中,甚至在 Delphi 10.3 中——没有。 但是请看一下www.peganza.com制造的名为“Pascal Analyzer”的软件

    他们有很多选择,其中之一是(取自软件帮助):

    测试源代码,看第32行:

    分析结果显示第 32 行中可能存在错误分配:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 2021-11-17
      相关资源
      最近更新 更多