VS2010 Ошибка статического анализа кода? - PullRequest
2 голосов
/ 19 февраля 2012

хорошо, я вполне уверен, что это только из-за очень глючного статического анализатора кода в 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, поэтому я предполагаю, что это еще одна ошибка в анализаторе.

Может ли кто-нибудь подтвердить, что это известная ошибка в анализаторе (очень быстрый поиск соединения не дал результатов), или в моем коде явно очевидная ошибка, которую я просто не вижу?

1 Ответ

0 голосов
/ 24 февраля 2012

Не уверен, связано ли это с предупреждением, но у вас есть ошибка здесь. Если mSize равен 2 ^ 32 - 1, то для newsize будет установлено значение 0 из-за переполнения целого числа, что приведет к переполнению буфера. Подобная ошибка возникает, когда вы делаете index * sizeof( TYPE ), не проверяя, что результат будет соответствовать 32 битам.

Более незначительно, но вам действительно следует использовать size_t вместо UInt32, в противном случае, если вы захотите скомпилировать в 64-битную версию, у вас будет предупреждение о типах, не соответствующих размеру. Memcpy принимает size_t в качестве 3-го аргумента, а size_t - 64 бита в 64-битной Windows.

...