. 버그의 유형
. 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가 남아서 재시작이 불가능할 수도 있다.
댓글 없음:
댓글 쓰기