Неверный доступ к указателю (чтение 4 байтов 0*1) ошибка из PREfast
Я пытаюсь скомпилировать немного кода, который выглядит примерно так: (примеры начинаются со строки 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 ответ
http://social.msdn.microsoft.com/forums/en-US/vstscode/thread/0505289d-4501-4f99-bc06-650c6b481566
Ошибка Visual Studio. Предупреждающий пример подавления в ссылке выше. Это не было исправлено в VS2010 еще!