2005년 5월 10일 화요일

버그의 유형

. 버그의 유형
  . exception handling
    . return value를 확인하지 않는 경우
      . 데이터를 잃어버리거나 잘못 고치는 일이 발생할 수도 있다.
    . 에러 상황에서 단순히 함수를 return, exit 해버릴 때
      . caller가 handling해주지 않으면 다시 에러가 발생하게 된다.
    . 에러가 났을 때 단지 눈가리기식으로 값을 버리기만 하면
      더 큰 에러가 계속 날 수 있다.

  . 초기화하지 않은 변수
    . 그 변수가 index로 쓰인다면 임의의 장소의 값이 고쳐질 수 있다.

  . Buffer size를 넘는 데이터를 잘못 처리하거나 적당히 cut하고 "\0"만 붙었을 때
    예1) keyword와 weight를 나타내는 "abcd 100"이라는 데이터가
        "abc 10"으로 바뀌어 저장될 수 있다.
        keyword "abc"의 weight가 잘못 계산되어 버린다.

    예2) fgets로 line by line으로 5bytes만 읽었을 때
      입력 : 12345678
             23456789

      출력 : 12345
             67
             23456
             789

      입력 데이터는 sort되어 있었지만 출력 데이터는 sort되지 않은 데이터이다.

  . 부적절한 delimiter
    . delimiter가 data안에 출현하여 data structure를 깨먹을 수 있다.

  . 불완전한 알고리즘 사용
    . Pseudo-sort, pseudo-compare :
      Sort의 성능을 올리기 위해 90~95%의 데이터만 소트되는 편법을 쓰면 위험하다.
      (Prefix만 보고 sort, Hash값을 얻어서 sort)
      그 데이터를 이용하여 Merge sort같은 것을 했을 때 실패하게 된다.
    . hash를 쓸 때 collusion을 처리하지 않았을 때
      . 잘못된 값이 overwrite된다.

    . stable sort를 써야 할 곳에 unstable sort를 쓰는 경우
      . 성능 향상은 있을 수 있지만 값을 믿을 수 없다.

  . escaping문제
    shell argument, evaluation이 다시 일어나는 데이터에 따옴표("), "/"등이
    들어있으면 위험하다.
    system에 이상한 명령이 수행되거나 Buffer overflow 공격에 의한
    해킹도 가능하다.

  . 오차의 확산
    . 처음에는 오차가 적겠지만 값이 누적되고 계산이 반복됨에 따라서
      오차는 발산, 확산될 것이다.
      단순한 덧셈, 뺄셈에서는 말할 것도 없고 vector 연산, cos, sin, log, 1/n
      정렬, hashing같은 매우 고난이도의 연산에서는 오차가 얼마나 확산될 것인지
      추정조차 불가능하다.
    . 한 칸씩 밀려쓰는 에러같은 것이 났을 경우
      에러가 난 곳 이후의 모든 데이터는 쓰레기 값이 될 수 있다.
    . 어떤 연산, 함수 func에 대하여 인수 중 하나라도 garbage값이면
      결과는 garbage값이다.
      func(garbage, garbage) = Garbage값
      func(garbage, 정상값) = Garbage값
      func(정상값, garbage) = Garbage값
      func(정상값, 정상값) = 정상값

  . Encoding 문제
    . ASCII, EUC_KR, 서유럽 인코딩 등을 섞어서 쓰게 되면
      00~7F이외의 범위에서 결과값을 보장할 수 없다.
    . encoding에 따라 compare했을 때 대소가 다를 수도 있으므로
      compare와 sort의 결과도 보장할 수 없다.

  . Incremental한 데이터의 문제
    . 약간씩 포멧이 변하는 모듈에 의해 누적된 데이터는
      어제 만든 데이터와 오늘 만든 데이터가 일관성을 유지할 수 없다.
      두 데이터를 merge했을 때는 두 값 모두 이상한 결과를 보일 수 있다.

  . Hard Coding(하드코딩)
    . Magic Number 하드코딩
      . OS, Compiler, Architecture, Kernel Paramater에 따라 값이 바뀔 수 있음.
      . 나중에 값을 수정해야 할 때 많은 곳을 고쳐야 함.
    . URL, Server 주소, port 하드코딩
      . 서비스 장애, Migration, 추가시마다 Compile과 Dist를 다시 해야 한다.

  . Graceful Shutdown
    . Daemon, process를 정상 종료할 방법을 만들어 둬야 한다.
      긴급 종료, 서비스 이전(migration)시 비정상 종료(abort, kill)를 하게 되면 데이터 구조가 깨진다.
      Garbage가 남아서 재시작이 불가능할 수도 있다.

댓글 없음:

댓글 쓰기