2

周りを見回しても、役立つものは見つかりませんでした。カーネルをビルドしていますが、配列の添え字が配列の境界を超えているため、ビルドに失敗するという警告が表示されます。私はLinaroツールチェーンを使用していて-O3に設定しているので、警告があるとビルドが失敗します...すべての助けに感謝します

    drivers/media/video/msm/rawchip/Yushan_API.c: In function 'Yushan_Check_Pad_For_IntrID':
drivers/media/video/msm/rawchip/Yushan_API.c:1751:85: warning: array subscript is above array bounds [-Warray-bounds]
error, forbidden warning: Yushan_API.c:1751

ここで失敗する方法...

bool_t  Yushan_Check_Pad_For_IntrID(uint8_t bInterruptId)
{

    uint8_t     bFirstIndexForSet[] = {1, 5, 11, 17, 23, 27, 58, 62, 69, 77, 79, 82, 83};
    uint8_t     bIntrSetID = 0;
    uint16_t    uwIntrSetsDivertedToPad1 = 0;

    VERBOSELOG("[CAM] %s: Start\n", __func__);
    /* Read the list of the interrupt sets diverted to Pad1 */
    SPI_Read(YUSHAN_IOR_NVM_SEND_ITR_PAD1 , 2, (uint8_t *)&uwIntrSetsDivertedToPad1);

    /* Trace through InterruptSets */
    while(bIntrSetID < TOTAL_INTERRUPT_SETS)
    {

        if( (bInterruptId>=bFirstIndexForSet[bIntrSetID])&&(bInterruptId<bFirstIndexForSet[bIntrSetID+1]) )
        {
            if((uwIntrSetsDivertedToPad1>>bIntrSetID)&0x01) {
                VERBOSELOG("[CAM] %s: End\n", __func__);
                return INTERRUPT_PAD_1;
            } else {
                VERBOSELOG("[CAM] %s: End\n", __func__);
                return INTERRUPT_PAD_0;
            }
        } else
            bIntrSetID++;

    }

    /* Just to remove warning */
    VERBOSELOG("[CAM] %s: End\n", __func__);
    return INTERRUPT_PAD_0;

}

オンラインでエラーが発生します:

if( (bInterruptId>=bFirstIndexForSet[bIntrSetID])&&(bInterruptId < bFirstIndexForSet[bIntrSetID+1]) )
4

1 に答える 1

2

この呼び出しで、インデックスが配列のサイズを超えています。

bFirstIndexForSet[bIntrSetID+1]

bFirstIndexForSet13個の要素があり、0から12までのインデックスが必要です。

未満のすべてのインデックスをループしますTOTAL_INTERRUPT_SETS。これは12を超える必要があります(11 + 1が配列で使用できる最大のインデックスになるため)。

TOTAL_INTERRUPT_SETS回答:それが12以下であることを確認してください。

于 2013-01-17T19:03:21.887 に答える