Delphi编译器警告传递签名到unsigned

时间:2015-09-08 15:32:52

标签: delphi delphi-xe6

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

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

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

SysErrorMessage的调用因 ERangeError 而失败。那是因为:

HRESULT = type Longint;  { from wtypes.h }

function SysErrorMessage(ErrorCode: Cardinal): string;

手动强制转换

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

这对我正在处理的当前项目中的代码运行良好 - 搜索SysErrorMessage并扫描结果以查找我可能传递HRESULT的位置:

enter image description here

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

编译器可以告诉我吗?

当我混合有符号和无符号类型时,编译器是否有警告选项可以捕获?显然,我将禁用范围检查。

另见

加成

所有WinSock函数都返回Integer:

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有很多东西需要做。

1 个答案:

答案 0 :(得分:1)

  

当我混合有符号和无符号类型时,编译器是否有警告选项可以捕获?

W1024将收集混合算术和比较。但是在编译时没有任何内容用于赋值或参数传递,这与赋值基本相同。