ABR - KLOCWORK 거짓 경보 및 잘못된 버그 처리
문제
KlocWork는 다음의 오류를보고합니다. -
"ABR - 버퍼 오버플로, 배열 색인 'oidsp'가 범위를 벗어날 수 있습니다.정렬 크기 64의 'oidsp'는 인덱스를 사용할 수 있습니다 값 (s) -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;
}
.
아이디어가 있습니까?
해결책
뭔가를 누락 할 수 있지만 기능 (check_index_lower_legality)은 'LEN'변수를 수정하지 않으며 배열에 액세스하는 데 사용되는 함수의 리턴이 아니므로 제공된 스 니펫은 런타임을 올바르게 생성하는 것처럼 보입니다.버퍼 언더 플로우 (LEN <0 값).보고서가 정말로 부정확하다고 믿는다면이 예제에서 확장 될 수 있습니까?
감사합니다, Gwyn.
다른 팁
이것은 거짓 버그입니다.Len이 항상> 1인지 알려주는 추가 수표를 추가해야합니다.
이 버그를 건너 뛰는 경우 완전히 원하지 않는 조건을 추가하십시오.
if (check_index_lower_legality (len,-1))
{
if(len > 1)
oidsp[len-1] = specProb;
}
.
이 버그를 잘못된 알람으로 표시하고 Klockworks를 다시 실행할 수 있습니다.그것은 가장 가능성이있는 의미에서 다음 보고서에서 건너 뜁니다.
Klocwork는 이러한 유형의 논리를 따를 수 있다고 생각하지 않습니다.CHECK_INDEX_LOWER_LEGALITY 가이 방법을 작동시키는 것을 알려야합니다.