Delphi W1024组合有符号和无符号类型-加宽了两个操作数
我如何才能防止此警告? [DCC Warning]uFvSystem.pas(293):W1024组合有符号和无符号类型-加宽了两个操作数Delphi W1024组合有符号和无符号类型-加宽了两个操作数,delphi,Delphi,我如何才能防止此警告? [DCC Warning]uFvSystem.pas(293):W1024组合有符号和无符号类型-加宽了两个操作数 function LinkerTimestamp: TDateTime; overload; begin Result := PImageNtHeaders(HInstance + PImageDosHeader(HInstance)^._lfanew) ^.FileHeader.TimeDateStamp / SecsPerDay + UnixD
function LinkerTimestamp: TDateTime; overload;
begin
Result := PImageNtHeaders(HInstance + PImageDosHeader(HInstance)^._lfanew)
^.FileHeader.TimeDateStamp / SecsPerDay + UnixDateDelta;
end;
\u lfanew
字段是一个LongInt
。HInstance
变量可能是一个THandle
,它是Cardinal
或某些等效类型的别名。有您的签名类型和未签名类型
金额应该是什么类型的?可能值的范围比THandle
的大小宽一点。(m位数字和n位数字之和最多需要max(m,n)
bit。)所涉及的两种类型都不够大,因此编译器将它们提升为更宽的类型,以适应整个范围
您知道一些编译器不知道的关于这些变量范围的信息。特别是,您知道,\l新的
是一个内存范围内的偏移量,它以HInstance
为基础。只要没有文件损坏,HInstance
和\u lfanew
的总和将是一个有效地址,因此您可以安全地将cast\u lfanew
键入一个无符号类型,并确信总和不会溢出:
Result := PImageNtHeaders(HInstance + UIntPtr(PImageDosHeader(HInstance)^._lfanew))
^.FileHeader.TimeDateStamp / SecsPerDay + UnixDateDelta;
如果您的Delphi版本提供,请使用
uintpttr
。否则,NativeUInt
或Cardinal
就可以了。错误消息表明您正在使用混合有符号和无符号操作数执行整数算术。唯一的整数算法如下所示:
HInstance + PImageDosHeader(HInstance)^._lfanew
第一个操作数是无符号的,第二个操作数是有符号的,即使它必须是正的
可以使用强制转换抑制警告。最好在无符号上下文中执行该算法,从而避免范围检查错误。因此,将强制转换放置在第二个操作数周围:
HInstance + NativeUInt(PImageDosHeader(HInstance)^._lfanew)
或
如果您有一个没有NativeUInt
的旧Delphi
但是,您实际上是在指针上执行算术运算,因此我将这样编写:
PByte(HInstance) + PImageDosHeader(HInstance)^._lfanew
或
在较旧的Delphi版本中,
PByte
不支持算术 第二段并不能真正证明这个警告是正确的。即使这两种类型相同,加法也可能溢出。我认为这个警告实际上是因为编译器没有理由为表达式选择类型。表达式是a+b。a+b应该是a型还是b型?
PByte(HInstance) + PImageDosHeader(HInstance)^._lfanew
PAnsiChar(HInstance) + PImageDosHeader(HInstance)^._lfanew