1

現在の 32 ビット アプリケーションを 64 ビットに移植するプロセスで、コンパイラ オプション /we4302 を追加しました (SO Question Clarification: Porting 32 to 64 bitおよびHans Passantによる提案された回答を参照してください)。インクルード ファイルにポインタの切り捨てがあるようです。

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 を追加するのは悪い考えですか?
4

2 に答える 2

2

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して、すべての実際のエラーを見つけて修正します。ビルド サーバーで有効にするには誤検知が多すぎる可能性があります。

于 2013-03-02T16:48:58.587 に答える
0

ブラッドリーの答えに追加するには、次のことを見つけました。

Visual Studio 2013 Update 4 と比較した VS 2015 RC の MFC & ATL の変更点の包括的な比較 (パート 1)

... ... ...

  • afxtempl.h

    164 行目: テンプレート関数 HashKey が C4311 コンパイラ エラーを抑制するようになりました

そのため、VS 2015 で最終的に修正されたようです。

于 2016-05-09T07:41:18.820 に答える