반응형
프로그래밍 과제를 디버깅 하던 와중, 아래와 같은 오류가 떴다.
심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 경고 C6385 'list[i]'에서 잘못된 데이터를 읽고 있습니다. 읽기 가능한 크기는 '16'바이트인데 실제로는 '-4'바이트만 읽을 수 있습니다.
알아보니, 배열의 인덱스값이 정해진 범위를 벗어나서 생기는 오류라고 한다.
오류와 관련한 공식문서(https://docs.microsoft.com/ko-kr/cpp/code-quality/c6385?view=msvc-160&viewFallbackFrom=vs-2019)를 살펴보면
버퍼의 읽기 가능한 범위는 버퍼에서 읽는 데 사용되는 인덱스보다 작을 수 있습니다. 유효한 범위를 벗어난 데이터를 읽으려고 시도하면 버퍼 오버런이 발생합니다.
라고 설명되어 있다.
아래와 같은 코드를 실행할 때 오류가 뜨게 되는데,
void f(unsigned int i)
{
char a[20];
char j;
if (i <= 20) // C6385
{
j = a[i];
}
}
자세히 살펴보자면, 문자열 a의 크기를 20으로 설정했으므로 그 범위는 0~19가 되는데, 조건문에서 범위를 벗어나는 20도 a의 인덱스에 집어넣을 수 있도록 처리되어 있어서 이와 같은 입력이 발생할 경우 오류가 뜨게 된다.
위의 코드의 문제를 해결하기 위해서는 아래와 같이 수정하면 된다고 한다.
void f(unsigned int i)
{
char a[20];
char j;
if (i < 20) // Okay
{
j = a[i];
}
}
실제로 내 프로그램도 위와 같은 이유로 오류가 발생하였고, 관련된 부분을 확인하고 잘못된 범위를 수정하니 오류가 해결되었다.
반응형
'코딩 > C언어' 카테고리의 다른 글
C언어 오개념 %lf에 대하여 (0) | 2021.04.05 |
---|---|
C언어, 배열의 크기를 변수로 선언이 가능한가? (with C99) (0) | 2021.01.31 |