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 */
}

上記のコードに問題はないようです。これらが取り上げられる理由と、これを修正する方法はありますか? よろしくお願いします。

4

3 に答える 3

4

MAX_PICTURE_HISTORYは 10 と定義されていますが、Picture要素は 8 つしかありません

于 2013-06-14T15:36:26.463 に答える
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 */
}

これは、提供された要素よりも 2 つ多くの要素がアクセスされています。

于 2013-06-14T15:36:40.277 に答える
0

メッセージは当然です。画像配列には 8 つの要素 (0..7) がありますが、ループは MAX_PICTURE_HISTORY < 10 まで実行され、配列を超えて要素 8 と 9 にアクセスします。

あなたが使用した場合、コードはよりきれいになり、そのようなエラーから保護されます

 TPicture Picture[ MAX_PICTURE_HISTORY ];

ハードコードされた 8 の代わりに。

于 2013-06-14T15:38:03.487 に答える