警告:'TSmallPoint'到'Integer'的不安全类型转换

Vla*_*lad 10 delphi delphi-7

我在我的项目中使用此代码:

var
  P: TPoint;

MyControl.Perform(WM_LBUTTONDOWN, 0, Longint(PointToSmallPoint(P)));
Run Code Online (Sandbox Code Playgroud)

编译器给了我一个警告:

[Warning]: Unsafe typecast of 'TSmallPoint' to 'Integer'
Run Code Online (Sandbox Code Playgroud)

但是,在Controls.pas 没有任何警告的情况下使用相同的代码- 例如在TControl.BeginDrag方法中:

....
Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P)));
Run Code Online (Sandbox Code Playgroud)

我看不出有任何{$warnings off}Controls.pas单元.

为什么编译器会警告我,但会跳过警告Controls.pas
这段代码不安全吗?


编辑:在我的项目选项 - >编译器消息 - > 选中不安全的类型转换(默认情况下未选中).
也许这就是@David和@Ken无法重现警告的原因.

Ken*_*ite 11

这是因为您unsafe typecast在Project-> Options-> Compiler Messages中检查了警告.这是安全的,取消选中(因为是unsafe typeunsafe code它上面.(见下文).

我无法重现警告,因为我有不安全的类型转换未经检查.它已不再适用.(当他们开发Delphi for .NET时,它在Delphi 6或7中添加了.net兼容性,以便更容易编写适用于.NET和Win32的代码;因为Delphi for .NET产品已停止使用,该警告(以及它上面的两个)不再适用).这三个警告中的"不安全"使用.NET的"不安全"含义,意思是"不受管理".

从Delphi 7帮助文件(搜索"编译器更改")(强调我的):

Delphi dcc32编译器现在支持三个额外的编译器警告:Unsafe_Type,Unsafe_Code和Unsafe_Cast. 默认情况下禁用这些警告,但可以使用编译器指令{$ WARN UNSAFE_CODE ON},编译器命令行开关(dcc32 -W + UNSAFE_CODE)以及IDE中的Project | Options | Compiler Messages页面启用这些警告.

此功能旨在帮助您将代码移植到Microsoft .NET平台的托管执行环境中.在托管执行环境中,"不安全"意味着在由实时(JIT)编译器执行的静态分析期间无法验证操作.此类代码可能会带来安全风险,因为JIT编译器没有足够的信息来验证其运行时行为.不安全代码的示例包括指针操作和内存覆盖.


Dav*_*nan 5

如果您自己编译控件单元,并启用了不安全的类型转换警告,那么您将看到警告.但是如果你链接预先构建的.dcu文件,那么你看不到任何警告.编译器仅对其编译的单元发出警告.

作为一般规则,RTL和VCL单元会生成大量提示和警告.如果我不得不重新编译它们,我总是要在这些单元上关闭提示和警告.


警告的现代文档说:

您使用的数据类型或操作静态代码分析无法证明它不会覆盖内存.例如,您可能将一个记录(另一个)记录到另一个记录或一个实例.

并且该警告确实适用于您的代码.您的代码不安全.编译器无法验证将两个16位整数叠加到32位整数上是否正确.所以编译器警告你.由您来决定代码是否正确.

现在,警告似乎主要用于.net编译器.尽管如此,它仍然对Win32编译器有意义.将一条记录叠加在另一条记录上是可疑行为.