문제

우리가 사용하는 정적 분석 도구는 중요한 버퍼 오버 플로우와 같은 다음과 유사한 C 코드를 표시하고 있습니다.

#define size 64
char  buf [size + 1] = "";
memset (buf, 0, size + 1);

도구의 오류 메시지는 다음과 같습니다. 버퍼 오버 플로우 (배열 인덱스 OUT) : 배열 'buf'크기는 1입니다. 배열 'buf'는 0..64 인덱스를 사용할 수 있습니다.

이것이 합법적입니까? 빈 문자열에 문자 배열을 할당하면 실제로 길이가 단일 바이트로 줄어 듭니다. char buf [] = "";?

도움이 되었습니까?

해결책

BUF [size+1]에 ""에 ""를 할당하는 것은 BUF의 크기를 재설정하지는 않지만, 후속 밈 세트가하는 것의 작은 부분을 복제하기 때문에 무의미합니다. 그것에 대한 버그 보고서).

다른 팁

Char Buf [size+1]은 크기가 런타임 값이기 때문에 컴파일하지 않을 것이라는 사실 외에도 BUF가 65 배열로 BUF를 빌드 할 수 있다고 가정하면 Memset (Buf, 0, 65)이 오버플로가되지 않습니다.

귀하의 구문 문제에 의해 도구가 혼란 스러울 것입니다.

편집 : 추가 정보

원래 게시물에 대한 의견을 바탕으로 다음을 제안합니다.

#define size 64
char buf[size+1];
strcpy(buf, "");
memset(buf, 0, size+1);

나는 Rob Kennedy가 옳다고 믿는다. 공구는 빈 문자열 이니셜 라이저 값을 정적 배열 선언 대신 배열 크기로 사용합니다.

버퍼 오버플로가 아닙니다.

이것은 아마도 그것을하는 더 깨끗한 방법 일 것입니다. 확실히 코드 줄이 적습니다.

#define size 64
char buf[size + 1] = {0};

합법적입니다 - 버퍼는 충분히 큽니다. 이 도구는 size_t가 int보다 클 수 있으며 인덱서로 사용하려고하면 예측할 수없는 결과를 초래할 수 있음을 경고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top