2013-06-14 2 views
0

В ходе проверки с cppcheck статического кода инструмента анализа (http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page) инструмент обнаружил серьезную ошибку в коде:буфер «» доступен вне границ

#define MAX_PICTURE_HISTORY 10 

#define PICTURE_INTERLACED_ODD 1 
#define PICTURE_INTERLACED_EVEN 2 

typedef struct 
{ 
    unsigned char* pData; 
    unsigned int Flags; 
} TPicture; 


typedef struct 
{ 
    TPicture* PictureHistory[MAX_PICTURE_HISTORY]; 
    unsigned char *Overlay; 
    unsigned int OverlayPitch; 
    unsigned int LineLength; 
    int FrameWidth; 
    int FrameHeight; 
    int FieldHeight; 
    MEMCPY_FUNC* pMemcpy; 
    unsigned int InputPitch; 
} TDeinterlaceInfo; 

Код:

TPicture Picture[ 8 ]; 
int stride = (width*2); 
int i; 

Info.FieldHeight = height/2; 
Info.FrameHeight = height; 
Info.FrameWidth = width; 
Info.InputPitch = stride*2; 
Info.LineLength = stride; 
Info.OverlayPitch = outstride; 
Info.pMemcpy = fast_memcpy; 

Picture[ 0 ].pData = data->f0 + stride; 
Picture[ 0 ].Flags = PICTURE_INTERLACED_ODD; 

Picture[ 1 ].pData = data->f0; 
Picture[ 1 ].Flags = PICTURE_INTERLACED_EVEN; 

Picture[ 2 ].pData = data->f1 + stride; 
Picture[ 2 ].Flags = PICTURE_INTERLACED_ODD; 

Picture[ 3 ].pData = data->f1; 
Picture[ 3 ].Flags = PICTURE_INTERLACED_EVEN; 

Picture[ 4 ].pData = data->f2 + stride; 
Picture[ 4 ].Flags = PICTURE_INTERLACED_ODD; 

Picture[ 5 ].pData = data->f2; 
Picture[ 5 ].Flags = PICTURE_INTERLACED_EVEN; 

for(i = 0; i < MAX_PICTURE_HISTORY; i++) { 
    Info.PictureHistory[ i ] = &(Picture[ i ]); /* <-- The buffer Picture is accessed out of bounds */ 
} 

В приведенном выше коде не должно быть ничего плохого. Любые идеи, почему они берутся и как это исправить? С уважением.

+0

Ваш статического анализа не сказать вам значение 'i' в случай отказа? –

+0

Если у вас появилось сообщение об ошибке с инструментом, включите его в свой вопрос. –

ответ

4

MAX_PICTURE_HISTORY определяется как 10, но Picture имеет только 8 элементов

1

Вы

#define MAX_PICTURE_HISTORY 10 

, а затем

TPicture Picture[ 8 ]; 

for(i = 0; i < MAX_PICTURE_HISTORY; i++) { 
    Info.PictureHistory[ i ] = &(Picture[ i ]); /* <-- The buffer Picture is accessed out of bounds */ 
} 

Это еще два элемента доступны, чем предусмотрено.

0

Сообщение заслуживает внимания. В вашем массиве изображений есть 8 элементов (0..7), а цикл переходит к MAX_PICTURE_HISTORY < 10, обращаясь к элементам 8 и 9 за пределами массива.

код будет чище и охранял от ошибок, как, что, если вы использовали

TPicture Picture[ MAX_PICTURE_HISTORY ]; 

вместо закодированного 8.

Смежные вопросы