주식회사 누리아이티

정보자산의 보안강화를 위한 2차인증 보안SW 및 지문인식 OTP/출입/보안카드 전문기업

▶ Tuxedo/C

링크 타임시 에러 점검

누리아이티 2010. 6. 25. 18:32

- 초기화하지 않은 변수
  C/C++ 표준에 따르면, 정적인 영역에 잡지 않은 변수는 자동 저장 영역(스택 영역에 변수를 할당한다)에 잡히게 되고 이 변수는 명시적으로 초기화하지 않는 한 초기값이 결정되지 않는 것으로 되어 있다. 즉 자동저장 영역에 잡은 변수인 자동 변수(auto variable)를 초기화하지 않고 사용하면 실행할 때마다 다른 값을 결과로 보여주게 된다. 예를 들어 다음 프로그램을 처음 수행하면 제대로 동작하는 것처럼 보인다.
  -qinitauto=FE 옵션으로 컴파일하면 문제가 발생할 수 있다는 것을 알려주는 결과를 보여준다. 예) Segmentation fault(coredump)
  자동변수를 초기화하기 이전에 사용한 곳이 어디인지 찾아내려면 -qinfo=gen 옵션을 사용하면 된다. 예) "initauto.c", line 13.10: 1506-438 (I) The value of the variable "ptr" may be used before being set.

 

- 실시간 에러체크
  -qcheck 옵션을 사용하면 프로그램 실행파일에 실시간 검사 코드를 끼워넣는다. 이때 다음과 같은 검사를 수행할 수 있다.
    NULL pointer   : 포인터 참조에 사용한 포인터가 512보다 더 큰 주소값을 사용하는지 검사한다.
    Array bounds   : 배열의 크기를 컴파일시 미리 알 수 있다면 실시간에 배열의 첨자가 배열 범위 안에 들어있는지 검사한다.
    Divide by zero : 정수값을 0으로 나누는 경우가 있는지 검사한다
  서브옵션을 지정하면 지정한 에러사항이 발생했을 때 실시간으로 SIGTRAP 예외가 발생한다. 프로그램의 시그널 핸들러에서 이 시그널을 처리하게 할 수도 있다.
  -qinitauto 옵션의 경우처럼 -qcheck옵션을 사용하면 실시간 성능이 떨어질 수 있으므로 이 옵션은 디버깅할 때만 사용하는 편이 좋다.

 

- C에서 부호 없는 상태 유지하기
  cc 컴파일러 드라

이버를 사용하거나, -qlanglvl=extended 옵션을 사용하거나 혹은 -qupconv 옵션을 사용하면 C 컴파일러는 데이터 타입을 한단계 위로 올리며 부호 없는 상태 유지(unsignedness preservation)를 사용하게 된다.
  부호 없는 상태유지는 int보다 작은 부호 없는 데이터 타입을 한단계 위로 데이터 타입을 바꾼다. 따라서 unsigned char 나 unsigned short 는 unsigned int로 바꾼다. 이와 반대로 c89나 c99 에서는 int로 바꾸는 경우라고 하더라도 값 자체는 유지하도록 한다.
  부호 없는 상태 유지는 프로그램 실행 중 예기치 않은 상태를 발생시킬 수 있다.

 

- ANSI 알리아싱
  C/C++ 컴파일러에서 지원하는 표준 프로그래밍 언어 레벨은 최적화중 타입기반 알리아싱 규칙을 지키도록 되어 있다. 타입 기반 알리아싱(type-based aliasing)은 ANSI 알리아싱(ANSI-aliasing)이라고도 하며 데이터 오브젝트를 안전하게 참조할 수 있는 lvalue28 값을 제한한다. 결국 포인터는 자신과 동일한 데이터 타입만을 가리켜야 하며, 참조한 다음 포인터 값을 타입 캐스팅하면 안 된다. 여기에 대한 예외의 경우도 있다.
  1) 부호 한정자(sign qualifier)와 타입 한정자(type qualifier)는 타입 기반 알리아싱에 해당하지 않는다.
  2) 캐릭터 포인터는 아무 타입이나 가리킬 수 있다.
  -O 옵션으로 최적화기능이 수행되면, 타입 기반 알리아싱 때문에 컴파일러는 포인터 ptr이 외부변수 rc를 가리킬 수 없다고 생각한다. 따라서 프로그램은 rc = 0 을 수행한 다음 호출한 함수에게 0을 반환해준다.
  만약 cc 컴파일러 드라이버를 사용하거나 -qalias=noansi 옵션을 사용하면 컴파일러는 알리아싱 가정을 가장 보수적으로 하게 된다. 따라서 특정 데이터 타입의 포인터라고 하더라도 외부 오브젝트를 포함하여 데이터 타입에 상관없이 주소값이 알려진 어떤 오브젝트라도 포인트할 수 있다고 가정한다. 이렇게 하면 위 예제의 오류를 수정할 수 있지만 최적화 가능성을 줄여서 성능이 떨어질 수 있다. 따라서 타입기반 알리아싱 규칙을 제대로 지키도록 프로그램 코드를 수정하는 편이 좋다.

'▶ Tuxedo > C' 카테고리의 다른 글

프로그래밍시 추천사항  (0) 2010.06.28
디버깅  (0) 2010.06.25
컴파일시 메시지 분석  (0) 2010.06.25
make 수행 시에 나타나는 에러들  (0) 2010.06.25
C 컴파일러 관련 사항(AIX)  (0) 2010.06.25