如何处理指针截断在ATLMFC包括文件

How to handle Pointer Truncation in ATLMFC Include files?

本文关键字:ATLMFC 包括 文件 指针 何处理 处理      更新时间:2023-10-16

在将我当前的32位应用程序移植到64位的过程中,我添加了编译器选项/we4302(请参阅SO问题澄清:将32位移植到64位以及Hans Passant建议的答案),我遇到了一个ATLMFC Include文件似乎有指针截断的场景。

c:Program Files (x86)Microsoft Visual Studio 10.0VCATLMFCINCLUDEafxtempl.h
(163) : error C4302: 'type cast' : truncation from 'CControlBar *' to 'long'
c:Program Files (x86)Microsoft Visual Studio 10.0VCATLMFCINCLUDEafxtempl.h
(163) : error C4302: 'type cast' : truncation from 'HMENU ' to 'long'

我打算将编译器标志永久地添加到我们的构建系统中,但如果我们在MFC Includes中有问题,那将是一个坏主意。

所以我的问题是

  1. 报告的问题是错误警告吗?
  2. 如果这确实导致指针截断,建议的解决方案是什么
  3. 在构建系统中添加编译器选项/we4302是一个坏主意吗?

如果您打开afxtemplate .h头文件,您将在第163行发现以下代码:

template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
    // (algorithm copied from STL hash in xfunctional)
    ldiv_t HashVal = ldiv((long)(ARG_KEY)key, 127773); // *** error is on this line
    HashVal.rem = 16807 * HashVal.rem - 2836 * HashVal.quot;
    if (HashVal.rem < 0)
        HashVal.rem += 2147483647;
    return ((UINT)HashVal.rem);
}

转换为(long)是在计算哈希码的方法中。虽然这并不理想(因为它可能会导致哈希冲突),但在计算哈希码时丢掉前32位并不是错误。因此,这是一个可以忽略的虚假警告。

我会在你的本地开发盒上使用/we4302来查找和修复所有真正的错误;最终可能会出现太多误报,无法在构建服务器上启用它。

除了布拉德利的回答,我还发现:

MFC的综合比较&;VS 2015 RC与Visual Studio 2013 Update 4的ATL变化(第一部分)

... ...

  • afxtempl.h

    第164行:模板函数HashKey现在抑制C4311编译错误

所以看起来他们最终在VS 2015中修复了这个问题。