0

次のようなコードを少しコンパイルしようとしています: (例は 38 行目から始まり、throw は 45 です)

VSShader::VSShader(_In_ ICore * const pCore, _In_ const String & path, _In_opt_ const char ** ppArgs) :
    m_Core(pCore), m_Name(path), m_DefaultTechnique(nullptr)
{
    CGcontext context = m_Core->GetCgContext();

    if (!context || !cgIsContext(context))
    {
        throw Exception(L"Voodoo/Core", L"Unable to create parameter (core has no context).", pCore, "VSShader.cpp",  __FUNCTION__  , 45);
    }

    int32_t len = m_Name.ToCharStr(0, nullptr);
    std::vector<char> buffer(len);
    path.ToCharStr(len, &buffer[0]);

    m_CgEffect = cgCreateEffectFromFile(context, &buffer[0], ppArgs);

    if (!cgIsEffect(m_CgEffect))
    {
        throw Exception(L"Voodoo/Core", L"Failed to create shader.", m_Core, "VSShader.cpp",  __FUNCTION__  , 56);
    }
    else
    {
        cgSetEffectName(m_CgEffect, &buffer[0]);
    }

    this->Link();
}

呼び出される ctor は次のようになります。

Exception
(
    _In_ wchar_t * Module,
    _In_ wchar_t * Message,
    _In_opt_ ICore * pCore,
    _In_ char * File,
    _In_ char * Function,
    _In_ int Line
);

これについて分析を実行すると、次のエラーが表示されます。

1>d:\code\voodooshader\framework\core\vsshader.cpp(45): 警告 C6385: 無効なデータ: '引数 3' にアクセスしています。読み取り可能なサイズは '1*0' バイトですが、'4' バイトは読み取り: 行: 40、39、41、43

私が知る限り、それはポインターに読み取り可能なバイトが0つあると主張しており、それを渡すときにそのうちの4つを使用しようとしています(それぞれ間違ったものと正しいもの)。これは 32 ビット ビルドなので、ポインタは 4 バイトにする必要があります。

m_Coreスローの をに変更すると、スロー行だけでなく、どこnullptrにもエラーが発生しません (39 ~ 41 行目と 43 行目に突然エラーが発生しなくなります)。

さらに珍しいことに、throw を完全にコメントアウトすると、次のメッセージが表示されます。

1>d:\code\voodooshader\framework\core\vsshader.cpp(56): 警告 C6385: 無効なデータ: '引数 3' にアクセスしています。読み取り可能なサイズは '1*0' バイトですが、'4' バイトは読む: 行: 40, 39, 41, 43, 48, 49, 50, 52, 54

これにより、一見無関係な行で同じエラーが発生します。

エラーのMSDN の例は、意味のある方法で無関係であるように見え、不正な配列アクセスについて説明しています。

これは何らかの既知のエラーですか、バグですか、それとも単純に読み違えているのですか?

さらに重要なことは、どうすれば修正できるかということです (これは、11kloc コードベースの /w4 /wX のコンパイラまたは PREfast からの唯一の警告です。これは、憎むべき皮肉を山盛りにするのが好きだからです :P)。

編集:いくつかの議論とテストの後、私はさらに2つの奇妙な点を発見しました:

パラメータから注釈を完全に削除して_In_ ICore* const pCoreも、エラーは発生しません。

そのパラメーターの注釈を に変更して_Pre_notnull_ ICore * const pCoreも、エラーは発生しません。_Pre_notnull_の要件のほとんどを備えている_In_ため、これは当面の機能的なソリューションですが、正しくないようです。

4

1 に答える 1

0

http://social.msdn.microsoft.com/forums/en-US/vstscode/thread/0505289d-4501-4f99-bc06-650c6b481566

Visual Studio のバグ。上記のリンクの警告抑制の例。VS2010 ではまだ修正されていません。

于 2011-11-22T18:41:01.417 に答える