티스토리 뷰

학습자료

컴파일러 환경차이에 따른 오류 경험 1

알 수 없는 사용자 2017. 1. 6. 21:50

일단 이글을 학습자료라고 생각하고... 올릴게요


visual studio에서 잘 돌아가는 코드를 짰는데... 제출 시에 오류가 뜨는 경우가 있어요〆(・∀・@)

컴파일러가 다르기 때문이죠. 물론 코드가 잘못된거에요



가상 우분투(c9)에서 gcc로 돌려보고 Segmentation fault를 뜬걸 보고 뭔갈 잘못되었음을 깨달았습니다 

(강조) visual studio가 잘못한게 아니에요, 제가 잘 짰으면 그럴일 없었어요(이 글은 이렇게 시작되었다)



결론부터 말하지만 visual studio는 편리한 IDE이지만 우리의 코딩을 뭔가 간과하게 만드는 것이있어요.

gcc로 넘어오세요(추천사항)


 

gcc깔고 제트브레인 IDE으로 넘어오세요 하하(홍보아님)

불편하겠지만 gcc깔고 visual studio와 연동하는 법이있어요(찾아보아요)

아니 또 굳이 연동할것 까지도 없죠 텍스트에디터만 있다면야(메모장이란 것도 있는데뭘)


저의 gcc 버전과 바로 위에 오류메세지 8ㅅ8



대부분(이 아니라 100프로겠지) 알고리즘 트레이닝 싸이트의 컴파일러는 gcc로 되어있습니다. 

C언어 기준 컴파일러



  • 백준 : gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609)
  • 코드그라운드 : gcc - 4.8.3
  • 더블릿 : gcc (버전확인 안됨)

더블릿께서 말하시길..


네.. visual studio(VC)에서 돌아가더라도 다른곳에서 안돌아가면 끝이죠

지금까지 글을 읽고 계시는 여러분이 한번도 컴파일러 환경차이로 나타나는 오류를 만나지 않았다면

visual studio는 위대한거겠지만 더블릿이 말한 것처럼 그의 말은 틀리지 않아요



음.. 저는 듀얼뷰팅으로 OS를 두 개씀에도 불구하고 visual studio가 편해서

알고리즘 트레이닝은 거의 윈도우즈 환경에서만 해왔습니다(gcc깔면 되면서)

하지만 이런 오류를 최근에 접하고 코딩습관이 좀 잘못들여졌다는 걸 깨달았어요 (첫번째 결론)

그래서 저의 우분투로 갈아탔습니다 vim에서 사용하기 귀찮아서 CLion깔고...(제트브레인 홍보아님)





아.. 그래서 무슨오류를 겪었는가? 왜 VC는 그걸 무시했는가...는 VC 만드는사람들이 그렇게 하고 싶었나본데요..

참고로 저는 Visual Studio 2017 RC 최신입니다

  • Segmentation fault

[나와 같은 경험을 한 외국인 칭구]

http://stackoverflow.com/questions/29809018/segmentation-fault-core-dump-code-works-in-vs-but-not-in-the-linux-terminal

[번역] 리눅스 터미널에선 안돌아가는데 VS에선 잘 돌아가더라!


그러면 Segmentation fault는 언제 일어나는가?

간단히 말하자면, 메모리 접근 위반시다 ( limit를 벗어난 경우도 해당됨 ).

http://stackoverflow.com/questions/2346806/what-is-a-segmentation-fault


Segmentation fault의 원인을 요약하자면

  • Dereferencing NULL pointers ! – 널포인터에 어떤 값을 대입시
  • 존재하지 않는 메모리 주소를 접근하려고 했을 경우(바깥에서 돌고있는 프로세스가 있었는데 그걸 참조했다 던지)
  • 메모리 접근권한이 없을 때
  • RO 영역 메모리를 Write하려고 했을 때

더 세세히 풀어서 쓰자면


  • 역참조 또는 초기화되지 않은 포인터에 값 대입 (허상포인터가 랜덤한 메모리 주소를 가르킬때)
  • free 해버린 포인터에 값 대입 (허상포인터가 freed/deallocated/deleted 경우)
  • 버퍼 오퍼플로우 ( 이것은 limits 문제 )
  • 스택 오버플로우 ( 역시 limits 문제, bash창에서 커맨드로 ulimit를 쳐서 확인 가능 )
  • 컴파일이 정확하게 안되었는데 프로그램을 execute 하려는 경우




그러면 어떠한 경우는 VS가 잡아줄텐데 못 잡아줄 경우

gcc에서 저런 오류 어떻게 잡느냐?


1. gdb를 사용해 디버깅 해본다 (메모리 덤프 확인가능)

2. gcc 컴파일러를 지원하는 IDE에서 디버깅 해본다

3. 눈으로 찬찬히 살펴본다



어떤 오류와 어떤 해결을 했었는지 다음시간에...(글을 두번쓰려는 속셈)


참고

https://en.wikipedia.org/wiki/Segmentation_fault

http://story.wisedog.net/null-pointer-dereference-란/

https://ko.wikipedia.org/wiki/허상_포인터



댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크