хорошо, я вполне уверен, что это только из-за очень глючного статического анализатора кода в Visual Studio, но я подумал, что больше взглядов на это не повредит.
Я написал свою собственную коллекцию контейнеров в векторном стиле. Кажется, они работают нормально, но я заметил следующие предупреждения от статического анализатора кода Visual Studio:
предупреждение C6386: переполнение буфера: доступ к «аргументу 1», размер записи составляет «газетное поле» * 4 байта, но может быть записано 4194240 байтов
Вышеприведенное предупреждение появляется в последней строке следующего кода (memcpy) и выделяет все предыдущие строки. Все возможные типы, которые этот конкретный векторный класс может содержать, являются POD. mSpace содержит количество элементов, которое может содержать доступная память в векторе, и mSize текущее количество элементов. mDynamic указывает на блок памяти, в данный момент управляемый вектором.
Bool Insert( UInt32 index, TYPE value, UInt32 count = 1 )
{
if( index < mSize )
{
UInt32 newsize = mSize + count;
if( newsize > mSpace )
{
UInt32 newspace = std::max( Align( newsize, 8 ), mSpace << 1 );
TYPE* ptr = new TYPE[ newspace ];
if( ptr )
{
memcpy( ptr, mDynamic, index * sizeof( TYPE ));
// The remainder of the code copies the second half of the
// existing data and inserts the new values...
Я смотрел на это, пока мои глаза не стали кровоточить (ну, почти), и я не мог понять, почему анализатор выдает это предупреждение. Я видел такое же предупреждение в других местах также с довольно странным значением 4194240, поэтому я предполагаю, что это еще одна ошибка в анализаторе.
Может ли кто-нибудь подтвердить, что это известная ошибка в анализаторе (очень быстрый поиск соединения не дал результатов), или в моем коде явно очевидная ошибка, которую я просто не вижу?