Неверный доступ к указателю (чтение 4 байтов 0 * 1) ошибка из PREfast - PullRequest
0 голосов
/ 31 октября 2011

Я пытаюсь скомпилировать немного кода, который выглядит примерно так: (примеры начинаются со строки 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 также внезапно теряют ошибки).

Еще более необычно, если я полностью закомментирую бросок, я получаю:

1> d: \ code \ voodooshader \ framework \ core \ vsshader.cpp (56): предупреждение C6385: Неверные данные: доступ к «аргументу 3», читаемый размер составляет 1 * 0 байт, но могут читаться 4 байта: строки: 40, 39, 41, 43, 48, 49, 50, 52, 54

Это дает ту же ошибку на кажущихся несвязанных строках.

Пример MSDN для ошибки не имеет никакого отношения к обсуждению проблем с доступом к массиву.

Является ли это какой-то известной ошибкой, ошибкой или я просто неправильно ее читаю?

Что еще более важно, как я могу это исправить (это единственное предупреждение от компилятора или PREfast, на / w4 / wX, в базе кода 11kloc, потому что он любит нагружать ненавистную иронию: P).

Редактировать: После некоторого обсуждения и тестирования я обнаружил две дополнительные странности:

Если полностью удалить аннотации из параметра _In_ ICore* const pCore, то нетошибка.

Если я изменю аннотацию для этого параметра на _Pre_notnull_ ICore * const pCore, ошибки также не будет._Pre_notnull_ предъявляет большинство требований _In_, так что на данный момент это функциональное решение, но оно не кажется правильным.

1 Ответ

0 голосов
/ 22 ноября 2011

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

Ошибка Visual Studio. Предупреждающий пример подавления в ссылке выше. В VS2010 это еще не исправлено!

...