我最近尝试在我的应用程序中使用范围检查,试图捕获数组边界违规等。
不幸的是,这导致了很多与 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
的位置:
但是当共享库中有代码时它会失败。当我将有符号传递给无符号的其他结构时,它也会失败,反之亦然。
编译器可以告诉我吗?
当我混合有符号和无符号类型时,编译器是否有一个警告选项来捕获?显然我将禁用范围检查。
另请参阅
- W1024 Combining signed and unsigned types - widened both operands
- Preventing "combining signed and unsigned types widened both operands" compiler warning
- Range checking
- [D2009] I think SysErrorMessage is wrong...
奖金
所有WinSock函数返回整数:
int WSAAPI getaddrinfo(
_In_opt_ PCSTR pNodeName,
_In_opt_ PCSTR pServiceName,
_In_opt_ const ADDRINFOA *pHints,
_Out_ PADDRINFOA *ppResult
);
int WSAGetLastError(void);
Jcl/Jvcl 有很多修复工作要做。
最佳答案
Does the compiler have a warning option to catch when i mix signed and unsigned types?
W1024将收集混合算术和比较。但编译时没有任何赋值或参数传递的东西,这和赋值本质上是一样的。
关于Delphi 编译器警告将有符号传递给无符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32461771/