본문 바로가기
이론/[책]WRITINGSOLIDCODE

[1장]가상 컴파일러

by 사과잼빵 2017. 2. 4.

컴파일 단계에서 소스코드의 버그를 잡아 줄 수 있다면 버그 없는 프로그램을 작성하는데 큰 도움이 될 것이다.

따라서 코드 상에서 가상 컴파일러를 흉내 내도록 노력해서 버그를 자동으로 발견할 수 있는 모든 기회를 이용하자.

흔히 자주 틀리는 구문이지만 이 구문이 프로그래머가 의도한 것일 수도 있는 구문일 경우 컴파일러에서는 에러로 표시하는 구문이 있다.

ex)
int count = 0;
while( count < 5 );    <-- ; 세미콜론 실수
  ++count;

위 코드는 무한 루프를 돌게 되는데 세미콜론이 실수로 들어갔기 때문이다. 이 경우 null 값을 갖는 while문으로 보아 정상적인 것으로 판단한다.
이러한 흔한 실수를 방지하기 위해서 컴파일러에서는 명시적으로 NULL 문을 사용하지 않을 경우 버그로 알려주는 경고 옵션을 제공한다.

ex)
int count = 0;
while( ++count < 5 )
 NULL;

위와 같이 명시적으로 NULL을 표현 했을 경우 정상적인 코드로 허용하고 그 외의 의도하지 않은 NULL은 에러로 처리하는 방식은 프로그래머의 실수를 막을 수 있는 훌륭한
방식이라 할 수 있다.

C 프로그래밍에서 흔히 하는 실수 중에는 다음과 같은 실수도 있다.
if ( ch = '\t)
   ExpandTab();

위와 같은 실수는 한줄한줄 디버깅을 해보면 바로 알 수 있겠지만 코드는 그냥 눈으로 훓어봐서는 찾기가 쉽지 않다.
어떠한 컴파일러들에서는 &&, ||, 표현식과 if, for, while의 조정 표현식에서는 단순한 할당문을 허용하지 않음으로써 이러한 버그를 찾아내기도 한다.
이러한 할당 실수록 막기 위해 비교의 l-value에는 상수값을 넣는 코딩 규칙도 엄청 유용하다.

함수의 원형 강화하기 또한 컴파일 단계에서 버그를 찾을 수 있는 좋은 방식인데 예를 들면 연,월,일을 받는 함수가 있다 하자.

int processDate(int year, int month, int day);

위 함수를 호출 할 때 연월일의 순서를 잘못 넘겨 줄 경우 함수가 엉뚱하게 동작 할 것이다. 따라서 이를 막기 위해 int 같은 기본 타입들을  Wrapping 해서 사용하기도 한다.

 

1장 내용의 핵심
1.  컴파일 단계에서 버그를 잡을 수 있도록 프로그래밍 하는 것을 지향
2.  모든 컴파일러 경고 옵션을 활성화 시키자
3.  lint 툴과 단위 검사 툴을 사용하자이다. ( 아주 적은 노력으로 버그를 잡는데 소요되는 시간을 단축 시켜줄 수 있다.)

 

 

'이론 > [책]WRITINGSOLIDCODE' 카테고리의 다른 글

[2장]ASSERT YOURSELF  (0) 2017.02.12