'2009/06/11'에 해당되는 글 3

  1. 2009/06/11 undefined behavior (4)
  2. 2009/06/11 객체 모델링 (2)
  3. 2009/06/11 CJ 슈퍼레이스 1전 안재모씨 인캠 (5)

undefined behavior

전산 2009/06/11 01:30
C/C++ 같은 언어를 다루다 보면 아무래도 사람인 이상 메모리를 꽤나 깨먹게 된다. 표준에는 그냥 간단히 undefined behavior 라고 해서 "니가 잘못한거니까 무슨일이 일어나도 놀라지 마셈~" 정도로 다루고 있는데 이런 정의되지 않은 동작을 대했을때 프로그래머의 대응이 난 중요하다고 본다.

얼마전 키즈에 이런 질문 (#2) 이 올라왔었는데 대번에 붙는 대답이 "그건 99% 님이 메모리를 깨먹어서 그런거임." 이라던가 "부동소수점은 == 로 비교하면 안됨" 같은 대답이 달렸었다. 사실 저건 extended floating point 변환 문제였고 다른분이 http://kldp.org/node/105975 에 해답을 주셨다. (참고로 중간에 How not to program in C++(2003) 책에 소개되어 있는 문제라고 하는분이 있는데 그 책의 해당 내용은 그냥 일반적인 부동소수점 유효숫자 내용으로 본래 문제와 별 상관이 없는걸로 알고있다.)

원 질문자의 소스코드를 보고서는 저건 메모리 문제가 아니라는걸 알아챌 수 있다면 좋을 것이다. 사실 힌트는 충분히 있었다. 이미 printf() 가 앞뒤로 정상 동작했기에 스택은 최소한 수행 결과를 왜곡할 만큼 심각하게 망가지지 않았다는걸 알 수 있고, 메모리가 밀린경우 부동소수점이 0.00001 식으로 사람이 읽기 좋게 떨어지는 경우는 거의 드물기 때문이다. 그리고 단순히 메모리를 읽기만 하는 독립적인 명령어들의 순서를 바꿨는데 결과가 달라졌다면 이건 최적화등과 관계가 있다는것도 알 수 있다.

"메모리를 깨먹었겠지" 라는건 달콤한 유혹이다. 이건 '내가 모르는 모든 문제들' 에 대해 항상그럴듯한 답변이 되어줄 수 있기 때문이다. 어떤 문제가 발생했는데 인과관계를 증명하기도 전에 근처 어딘가에 숨어있던 메모리 버그를 발견하고 "이것 때문이었군!" 하고 탐색을 중단하는 프로그래머를 주변에서 많이 봤다. (사실 고백하자면 내가 그랬었다. -_-;) 물론 그것으로 해결되지 않는 문제들이 많았다.

그래서 나는 undefined behavior 가 일어났을때, 왜 그런 결과가 나왔는지 증명하는 것을 권장한다. 어떤 예외가 발생했는지, 어디의 메모리를 접근하다 문제가 터졌는지, vtbl 은 어떻게 되어 있는지, 스택과 레지스터의 상태는 어떤지 등등.. 리버서 수준까지 될 필요는 없다. 그냥 예외정보가 확실한지 증명만 하면 된다.

진짜 이렇게 까지 하면서 프로그래밍 해야되나 싶지만 C/C++ 이란게 원래 좀 그렇다. -_-
2009/06/11 01:30 2009/06/11 01:30

객체 모델링

전산 2009/06/11 01:07
http://gpgstudy.com/forum/viewtopic.php?t=23443

OOP 모델링을 한방에 잘 해내는것은 무척 어렵다. 링크에서 보듯 사람을 버스에 태운다는 간단한 개념도 의견을 모으기가 힘든데 하물며 처음 접해보는 것을 모델링 하는것은 얼마나 어렵겠는가...

구현 도중에 기획이 휙휙 바뀌는 게임 개발쪽에 한참 있어서 그런지 모르겠는데, 나는 그냥 고민할 시간에 일단 대충 돌아가는걸 만들고 나중에 이게 아니다 싶으면 리팩토링 하자는 주의다. 스타일상의 문제도 있겠지만, 내경우는 백날 고민하는 것보다 한번 덤벼서 깨져 보는게 대상을 이해하는데 더 빨랐다.

사실 하드코딩이나 개념적으로 세련되지 못한 디자인은 리팩토링 하기 그다지 어렵지 않다고 본다. 리팩토링 하기 어려운건 설계상의 문제보다는 매직넘버, 중복코드등 코딩 스타일 문제인 경우가 더 많다.

개인적으로도 남의 코드 넘겨받을때는 개념적으로 오류가 없이 잘 추상화된 코드는 그닥 좋아하지 않는다. (설계자의 사고를 그대로 다시 따라가 보아야 하기 때문이다.) 사실 real world 가 세련되게 추상화 될 수 있다고 믿지도 않고... 차라리 하드코드를 보는게 속 편했었다.

덧. 링크에 대한 질문에 대한거라면 구지 탑승에 대한 구현을 둘 중 하나에 둬야한다면 난 bus 에 있는게 맞다고 본다.긴말 필요 없이 Human.h 에다가 #include "Vehicle.h" 를 타이핑 하는 순간 아 이건 뭐가 좀 아니다라는 생각이 들어야 하지 않겠는가..?
2009/06/11 01:07 2009/06/11 01:07

* Video VBox 인지 뭔지 G 가 그대로 기록되는데 저거 있으면 짱일듯? 혼자 돌고 와서 그래프 그리고 리플레이 보면 팀 없이도 초가 무진장 빨라질것 같다. 구지 써킷 안뛰더라도 차에 달고 다니면서 나쁜버릇 교정에도 효과가 있을것 같고... 근데 가격이 400만원+. ㅎㄷㄷ 역시 레이스의 세계는 돈빨인건가.. ( -_-)

* 태백 1번코너를 3단기어로 도는것 같다. 2단으로 돌아야 될것 같은데 380GT 는 토크가 남아돌아서 괜찮은건가...? 코너 돌자마자 한대한테 따인걸로 봐서는 아닌것 같기도 하고...

* 3:20 에서 힐앤토 미스로 기어가 갈렸다. 바로 앞차하고 거리가 살짤 벌어짐. 그렇게 자이언트 코너 돌아나가기 전까지 또 두대한테 따임.

* 근데 저기서 안재모씨가 2등 했다. 난 포디움 서는 사람들은 실수 하나도 안하는지 알았는데 꼭 그런건 아닌가보다. 여튼 풀영상이 보고싶다...!

사용자 삽입 이미지

이분이 Video VBox 라는분.... 아 진짜 이런거 하나 있어줘야 되는거 아닌가.. [..]


2009/06/11 00:32 2009/06/11 00:32