chemistrae03   2달 전

아래의 코드(더럽게 짠 것 이해해주세요...)가 그냥 C++로 했을 때 AC를 받지만, C++ 17 Clang으로 했을 때 런타임 에러를 내뱉내요.. 혹시 그 이유를 알 수 있을까요?

eric00513   2달 전

제 생각엔 그럴 수도 있을 것 같아요 C++이 C++17 (Clang) 와 다른 함수를 가졌을 수도 있어요


 http://www.cplusplus.com/refer...참고해 보면 좋을 것 같아요

N이 최대 1000인데 배열을 100까지 잡으셨어요. 그냥 C++에서 맞았다는게 더 신기하네요.

chemistrae03   2달 전

근데 그러기엔...

함수를 너무 기본적인 것만 쓰지 않았나요?

eric00513   2달 전

생각해 보니 그렇네요

chemistrae03   2달 전

그러고보니 그렇네요 ㅋㅋㅋㅋ

왜 내가 n을 100으로 잡았지...

chemistrae03   2달 전

1000으로 잡으니까 clang에서 통과되네요...

컴파일러마다 테스트케이스가 다른건가요???

eric00513   2달 전

이런 건 수학적으로 계산해 보지 않는 이상 배열을 몇 가지 잡는지 결정할 수 없을 것 같아요 num배열은 1000개를 저장할 필요가 없어요

eric00513   2달 전

데이터는 모든 컴파일러에서 같게 나오는데, Clang 컴파일러가 무언가 부족한가봐요

numbers[100]일 때 numbers[1000]을 참조했다고 치면, 이것은 undefined behavior이기 때문에 어떤 식으로 처리될지 알 수 없습니다. 아마 대부분의 경우 런타임 에러가 뜰텐데 C++에서 정말 운이 좋게 맞았다고 생각하시면 될 것 같아요. 컴파일러마다 테스트케이스가 다른건 아니고요. 

eric00513   2달 전

C++17(Clang) 컴파일:  clang++ Main.cc -o Main -O2 -Wall -lm -static -std=c++17 -DONLINE_JUDGE -DBOJ

C++컴파일:  g++ Main.cc -o Main -O2 -Wall -lm -static -std=gnu++98 -DONLINE_JUDGE -DBOJ

https://www.acmicpc.net/help/l...에 나와 있어요.

chemistrae03   2달 전

흠.. 옛날 코드라 생각하는데 시간이 오래 걸렸네요..

저 numbers라는 배열을 100으로 잡은게 p가 97이라서 나머지는 항상 100보다 작게 나올 것 같아서 100으로 잡았었는데...

????????

eric00513   2달 전

어떤 N에서도 사이클의 길이가 100을 안 넘어갔나봐요

findnumbers(n)이 호출되자마자 numbers[n]을 참조하네요

chemistrae03   2달 전

BaaaaaaaaaaarkingDog 님의 말씀이 무슨 뜻인지 이해가 갔습니다.

처음 부터 n*n % p 를 호출해야 되는데 그게 clang에서는 런타임 에러로 걸렸고, 실제로 코드를 저렇게 고치면, numbers의 배열의 사이즈를 수정하지 않아도, 잘 통과가 됩니다.

그런데 그 코드가 gcc에서 틀렸습니다가 나오지 않았다는게 조금 마음에 걸리긴 하네요...

jung2381187   2달 전

운이 엄청 좋은 거죠....

seico75   2달 전

메모리 잡는 위치가 서로 달라서 다른 결과가 나온 것 같습니다.

gcc 의 경우 numbers, n, p 가 

0x40c060, 0x40c044, 0c40c040 (그러니까 p, n, numbers 순서로)

잡히고

clang 의 경우  numbers, n, p 가 

0x40c040, 0x40c1d0, 0x40c1d4 (그러니까 numbers, n, p 순서로)

잡히네요.

clang 의 경우 index 가 넘어가면 n, p 메모리를 쳐서 값을 바꿔서 혹은 다른 중요한 메모리를 쳐서 문제가 되었고, 

gcc 의 경우는 heap 메모리의 빈 곳을 쳐서 큰 문제가 없었던 것 같습니다.

gcc 에서 위 변수의 위치를 바꾸면 gcc 에서 죽고 clang 에서 안죽는 경우도 있을 수 있을 것 같네요.

아무튼 gcc 에서 운이 좋았던 것은 분명 맞겠네요.

eric00513   2달 전

雲이 좋다

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