아래의 코드를 비주얼 스튜디오 2019에서 작동 시,
겉보기로는 문제없이 작동합니다만 m에 쓰는 동안
버퍼 오버런이 일어나기도 하며 사이트 심사에서는
오답으로 처리됩니다.
비쥬얼 스튜디오 상의 버퍼 오버런 문구는
어떻게 해야 사라지게 할 수 있나요?
('m'에 쓰는 동안 버퍼 오버런이 발생했습니다.
쓰기 가능한 크기는 'sizeof(int *)*row'바이트인데
실제로는 '8'바이트만 쓸 수 있습니다.)
scanf_s를 scanf로 정정해보기도 하고
if (m == NULL) return -1; 등을 빼보기도 하였으나
마찬가지로 오답처리되었습니다.
심사는 어떤 부분을 고쳐야 통과될 수 있을까요?
문의한 코드는 삭제합니다.
(도장_ 관리자님이 수정함 - 원문 제출일: 2020년 3월 27일, 금요일, 오전 8:11)
심사문제에서는 입력을 숫자 1개만 받습니다.
따라서 숫자 2개를 입력 받으면 안 됩니다.
단위 행렬은 N X N 행렬이니까 숫자는 1개만 입력 받아야 합니다. 문제의 요구사항을 정확하게 파악하세요.
scanf의 서식 지정자는 "%d%d"가 아니라 "%d %d"처럼 쓰세요.
scanf_s는 비표준 함수이므로 Visual Studio에서만 쓸 수 있습니다. 리눅스, macOS 등 다른 환경에서는 해당 함수를 사용할 수 없습니다.
표준 함수인 scanf를 써야 합니다. 비록, Visual Studio에서는 독자적인 함수들을 만들고, scanf_s 같은 독자적인 함수를 사용하라고 강요하지만, 비표준이므로 사용하지 않는 게 좋습니다.
리눅스, macOS 같은 다른 환경에서 컴파일하고 실행할 수 있는 호환성을 무시하고 Visual Studio 전용, 윈도 환경에서만 동작하는 프로그램을 개발한다면 scanf_s를 쓸 수 있지만, 보통은 그렇게 하지 않습니다.
int** m = (int**) malloc(sizeof(int*) * row);
C 언어는 malloc 함수를 사용할 때 형변환을 하지 않습니다. 저런 형태는 C++ 형태의 문법이고, C 언어에서는 오류가 발생했을 때 오류를 가릴 수 있는 형태의 문법이므로 (int**) 같은 것을 쓰지 않는 걸 권장하고 있습니다.
malloc에 형변환은 하지 않습니다.
버퍼 오버런 문제는 Visual Studio에서는 경고를 표시하지만, 실제로는 문제가 되지 않습니다. 내부적으로 C++ 컴파일러를 사용해서 그런 것 같습니다. 온라인 심사가 이뤄지는 리눅스 환경에서 clang으로 문법이나 오류를 검증해보아도 문제가 발생하지 않습니다. 물론, 형변환은 모두 삭제하고, 올바르게 C 언어 스타일로 작성했을 때를 뜻합니다.
포인터를 할당했으면 memset으로 초기화하세요. 전체를 초기화하면 if 문으로 판단하면서 0을 채우지 않아도 됩니다.
초기화하지 않은 공간에 쓰면 버퍼 오버런 문제가 발생할 수 있습니다.
수정할 일
scanf_s를 scanf로 바꾼다
입력은 숫자 1개만 받는다.
row, col 변수가 아니라 N x N 행렬이니 1개만 입력 받는다
malloc에서 형변환하지 않는다
memset으로 초기화한다
자세히 알지 못하던 부분들이었는데 관리자님덕분에 많은걸 알아갑니다.
앞으로도 꾸준히 배우겠습니다.