0

Klocwork は次のエラーを報告します:-

「ABR – バッファ オーバーフロー、'oidsp' の配列インデックスが範囲外の可能性があります。サイズ 64 の配列 'oidsp' は、インデックス値 -2..-1 を使用する可能性があります。」

この行の場合:-

if (check_index_lower_legality (len,-1))
{
oidsp[len-1] = specProb;
}

check_index_lower_legality が次の場合:-

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 ; 
}

ただし、次の場合はバグはありませんcheck_index_lower_legality:- (ちなみに、これは間違った答えです。-2 または -1 のオフセット値については、実行時に実際のエラーが発生します。

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;
}

何か案は?

4

3 に答える 3

1

これは偽のバグです。len が常に > 1 であることを伝えるためのチェックを追加する必要があります。

したがって、まったく不要な if 条件を追加することで、このバグをスキップできます。

if (check_index_lower_legality (len,-1)) 
{
if(len > 1) 
oidsp[len-1] = specProb; 
} 

または、このバグを誤報としてマークし、klockworks を再度実行することもできます。次のレポートでは、ほとんどの場合、これをスキップします。

于 2010-07-15T09:01:51.423 に答える
0

何か不足している可能性がありますが、関数 (check_index_lower_legality) は「len」変数を変更せず、関数からの戻り値も配列へのアクセスに使用されないため、提供されたスニペットは実行時バッファー アンダーフローを正しく生成するように見えます ( len < 0 の値の場合)。レポートが本当に間違っていると思われる場合は、例をさらに詳しく説明していただけますか?

ありがとう、グウィン。

于 2010-07-15T12:39:16.097 に答える
0

Klocwork がこのタイプのロジックを実行できるとは思えません。check_index_lower_legality がこのように動作することを伝える必要があります。

于 2010-07-15T08:50:40.950 に答える