some256   2년 전

제출번호: 36793814

아래와 같은 입력에 대해서 -1 을 출력해야 하나 36793814은 런타임 에러를 발생시키지만 통과됩니다.

startlink   2년 전

이 데이터에서 해당 코드 런타임 에러 발생하지 않습니다.

some256   2년 전

런타임 에러가 발생하지 않다시기에 살펴보니 이게 차이가 좀 미묘합니다.

C나 C++은 (unsigned int)(0) - (unsigned int)(1) 같은 산술 연산이 wrapping around로 잘 정의되어 있어서 별 문제 없지만 러스트 언어는 (unsigned int)(0) - (unsigned int)(1) 같은 산술 연산을 의미론적으로 금지합니다. 그래서 러스트 컴파일러는 (unsigned int)(0) - (unsigned int)(1) 연산이 발생하면 C, C++ 과 다르게 런타임 에러를 발생시키는 코드를 추가적으로 생성합니다. 러스트가 C와 C++과 비슷하게 동작하지 않는 이유는 이렇게 함으로써 C나 C++ 보다 더 많은 최적화 기회를 얻을 수 있기 때문입니다. 즉 러스트는 위와 같은 허용되지 않는 산술이 수행되면 런타임 에러를 발생시킵니다.

러스트 컴파일러는 위와 같은 허용되지 않은 산술에 대해서 런타임 에러를 발생시키는 코드가 같이 생성합니다. 그런데 채점 서버는 컴파일할 때 release mode로 최적화하여 빌드합니다. 러스트 컴파일러는 최적화를 위해서 런타임 에러를 발생시키는 코드를 제거합니다. 그래서 테스트하실 때 런타임 에러가 발생하지 않은 것입니다.

의미론적으론 36793814 코드를 실행하면 아래처럼 런타임 에러가 발생합니다.

여기서 미묘한 부분이 나옵니다. 원래 36793814 코드는 러스트 언어가 허용하지 않는 코드인데 단지 최적화 때문에 우연히 에러가 안났을 뿐 입니다. 그리고 채점 서버는 최적화해서 빌드합니다. 원래 코드는 에러인게 명백한데 최적화 때문에 우연히 잘 실행되었고 채점 서버는 기본적으로 최적화해서 실행하고... 사실 이런 부분을 따지면 한도끝도 없긴합니다. 어떻게 보면 데이터를 추가하지 않는 게 맞는 거 같기도 합니다.

댓글을 작성하려면 로그인해야 합니다.