【问题标题】:How to handle Pointer Truncation in ATLMFC Include files?如何处理 ATLMFC 包含文件中的指针截断?
【发布时间】:2013-02-17 01:01:05
【问题描述】:

在将我当前的 32 位应用程序移植到 64 位的过程中,我添加了编译器选项 /we4302(请参阅 SO Question Clarification: Porting 32 to 64 bitHans Passant 的建议答案),我遇到了一个包含 ATLMFC 的场景文件似乎有指针截断。

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

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

所以我的问题是

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

【问题讨论】:

  • 对于 MS 编译器,long 在 32 位和 64 位模式下都是 32 位。这意味着指针不适合,这绝对是个问题。
  • 另一方面,第 163 行似乎计算了一个哈希值 ldiv_t HashVal = ldiv((long)(ARG_KEY)key, 127773);,其中 key 已经是 ARG_KEY 类型,所以我真的不知道。

标签: c++ windows visual-c++ mfc atl


【解决方案1】:

如果您打开 afxtempl.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 来查找并修复所有真正的错误;最终可能会有太多误报而无法在构建服务器上启用它。

【讨论】:

    【解决方案2】:

    要添加到Bradley's answer,我发现:

    A Comprehensive comparison of the MFC & ATL changes in VS 2015 RC compared to Visual Studio 2013 Update 4 (Part 1)

    ... ...

    • afxtempl.h

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

    看来他们终于在 VS 2015 中修复了它。

    【讨论】:

      猜你喜欢
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多