본문 바로가기
코딩/C언어

[C, C++/Visual Studio 2019] C6385 오류 해결 방법

by yenua 2021. 9. 25.
반응형

프로그래밍 과제를 디버깅 하던 와중, 아래와 같은 오류가 떴다.

 

심각도 코드 설명 프로젝트 파일 줄 비표시 오류(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];
   }
}

 

실제로 내 프로그램도 위와 같은 이유로 오류가 발생하였고, 관련된 부분을 확인하고 잘못된 범위를 수정하니 오류가 해결되었다.

반응형