ABR - Allarmi falsi di Klocwork e smaltimento errato del bug
Domanda
KLOCWORK segnala un errore di: -
."ABR - Overflow del buffer, indice di array di 'Oidsp' potrebbe essere fuori limite.Vettore 'Oidsp' di taglia 64 può utilizzare l'indice Valore (s) -2 ..- 1. "
per questa riga: -
if (check_index_lower_legality (len,-1))
{
oidsp[len-1] = specProb;
}
.
Quando check_index_lower_legalità è: -
bool check_index_lower_legality (int index, int offset)
/**
* This function checks that the index with the offset isn't
* below zero.
* If it is - returns 0 ;
* If isn't - returns 1 ;
**/
{
if ( (index + offset )<0) {
return 0;
}
return 1 ;
}
.
Tuttavia nessun bug quando check_index_lower_legality
è: -
(che è attraverso una risposta errata, come per i valori offset di -2 o -1 ci sarà un vero errore in runtime.
bool check_index_lower_legality (int index, int offset)
/**
* This function checks that the index with the offset isn't
* below zero.
* If it is - returns 0 ;
* If isn't - returns 1 ;
**/
{
if (index <=0) {
return 0;
}
return 1;
}
.
Qualche idea?
Soluzione
Potrei mancare qualcosa, ma la funzione (check_index_lower_legalità) non modifica la variabile 'Len', né è il ritorno dalla funzione utilizzata per accedere al tuo array, quindi il tuo snippet come fornito verrebbe correttamente generare un runtimeBuffer Underflow (per valori di LEN <0).Potresti forse espandere l'esempio se ritieni che il rapporto sia davvero scorretto?
Grazie, Gwyn.
Altri suggerimenti
Questo è un bug falso.Devi aggiungere un ulteriore controllo per raccontare Len è sempre> 1.
In modo da poter saltare questo bug aggiungendo una condizione totalmente indesiderata.
if (check_index_lower_legality (len,-1))
{
if(len > 1)
oidsp[len-1] = specProb;
}
.
O puoi contrassegnare questo bug come falso allarme e eseguire nuovamente Klockworks.Nel senso più probabile salterà questo nel prossimo rapporto.
Non penso che Klocwork può seguire questo tipo di logica attraverso.Dovresti dirlo che check_index_lower_legalità si comporta in questo modo.