Delphi 将有符号传递给无符号的编译器警告

Delphi compiler warning for passing signed to unsigned

我最近尝试在我的应用程序中使用范围检查,试图捕获数组边界违规等

不幸的是,这导致了很多与 HRESULT:

有关的非错误
var
    hr: HRESULT;
begin
    hr := E_UNEXPECTED;
    ShowMessage(SysErrorMessage(hr));

调用 SysErrorMessage 失败,出现 ERangeError。那是因为:

HRESULT = type Longint;  { from wtypes.h }

function SysErrorMessage(ErrorCode: Cardinal): string;

手动类型转换

解决方案很简单:每次我将 HRESULT 传递给 SysErrorMessage 时手动强制转换为 Cardinal

这对于我正在处理的当前项目中的代码来说已经足够好了 - 搜索 SysErrorMessage 并扫描我可能传递 HRESULT:[=29 的位置的结果=]

但是当共享库中有代码时失败。当可能存在其他结构时,它也会失败,我正在将有符号传递给无符号,反之亦然。

编译器能直接告诉我吗?

当我混合使用有符号和无符号类型时,编译器是否有一个警告选项来捕捉?显然我要禁用范围检查。

另见

奖金

所有WinSock函数return整数:

int WSAAPI getaddrinfo(
  _In_opt_       PCSTR      pNodeName,
  _In_opt_       PCSTR      pServiceName,
  _In_opt_ const ADDRINFOA  *pHints,
  _Out_          PADDRINFOA *ppResult
);

and

int WSAGetLastError(void);

Jcl/Jvcl 有很多修复工作要做。

Does the compiler have a warning option to catch when i mix signed and unsigned types?

W1024 将收集混合算术和比较。但是在编译时并没有什么赋值或者参数传递,这和赋值本质上是一样的。