반응형

제목: 예외적인 소프트웨어 버그(Unusual software bug)

저자: Wikipedia

문서유형: Wikipedia 사이트 자료

 

 

예외적인 소프트웨어 버그란 유난히 이해하기 어렵고 바로잡기도 쉽지 않은 소프트웨어 버그로, 여러 종류가 있는데 주로 반직관적인(counterintuitive) 것을 발견한 과학자의 이름을 딴 경우가 많음


 

이젠버그(Heisenbug)

  • 양자 물리학 개념인 하이젠버그 불확실성 원리(the Heisenberg Uncertainty Principle)”를 이름 딴 하이젠버그는 자세히 조사하려 하면 사라지거나 성질이 변하는 컴퓨터 버그이다.
  • 대표적인 예로 최적화된 컴파일러로 컴파일 시에는 프로그램에 버그가 발생하지만 같은 프로그램을 최적화 없이 컴파일 하면 버그가 나타나지 않는 경우가 있음(, 프로그램의 릴리즈 모드 컴파일에서 등장했다가 디버그 모드에서 조사를 하고자 하면 사라짐)
  • 또 다른 예로 경합상황(race condition)에 의해 발생되는 버그가 있음. 코맨드-쿼리 분리 설계 원칙을 준수하지 않는 시스템에서 하이젠버그가 나타날 수 있다(한번 이상 호출되는 루틴이 매번 다른 값을 리턴할 수 있어서 경합상황의 시나리오에서 재현이 어려운 버그가 생성됨)

 

하이젠버그와 같은 동작이 생기는 대표적인 이유로 아래를 들 수 있다.

  • 디버그 모드에서 프로그램을 실행하면 종종 프로그램 시작 전에 메모리를 지우고 변수들을 레지스터에 두는 대신에 스택 위치로 가져다 놓음. 실행 시 이런 차이가 버그의 영향을 변경시킬 수 있다(, out-of-bound 멤버 액세스, 메모리의 초기 콘텐츠에 대한 잘못된 가정, 32비트 스택 위치에 있는 플로팅 포인트 변수를 80비트 레지스터의 플로팅 포인트 변수와 비교).
  • 디버거가 추가 코드(, property accessor)가 실행되도록 하는 watch나 다른 사용자 인터페이스를 종종 제공하는데 이것이 프로그램의 상태를 바꿀 수 있다.
  • 경계 밖으로 벗어나(out of bounds) 실행되는 포인터나 초기화되지 않은 값(uninitialized values)에 의해 하이젠버그가 발생될 수 있다.
  • 시간 또한 하이젠버그의 한 요인이 될 수 있음. 디버거의 통제하에 프로그램이 실행되면 프로그램의 실행 타이밍(execution timing)이 정상적인 실행에서와 달라질 수 있음. 경합상황 같은 시간에 민감한 버그는 디버거의 single-stepping source lines 방식으로 인해 프로그램이 느려지면 다시 재현되지 않을 수도 있다. 특히 디버거의 통제하에 있지 않은 엔터티와 상호작용하는 동작에서 이런 일이 생김(, 두 머신 간의 네트워크 패킷 프로세싱을 디버깅 하는데 이 중 하나만 디버거 통제하에 있는 경우)

 

보흐버그(Bohrbug)

  • 보흐 원자 모델(the Bohr atom model)을 이름 딴 보흐버그는 잘 정의된 조건하에서 일관성 있게 나타나는 버그(하이젠버그와 달리 조사 시 사라지거나 자신의 성질을 바꾸거나 하지 않음)
  • 보흐버그는 문제의 성격이 명확해 수정이 쉬운 버그도 있지만, 발견 및 수정이 어려워 운영 단계에도 여전히 소프트웨어에 남아있는 버그도 있다. 특정 데이터 집합이 입력되거나 또는 특정 상황이 닥친 경우에만 에러가 가끔 나타나기도 함. 버그가 수정되지 않았어도 오퍼레이션이 재시작되거나 시스템이 리부트되면 버그가 그 모습을 드러내지 않을 수도 있음(, failure가 발생하지 않음)
  • 버그가 드러나는 것은 소프트웨어가 매우 드문 특정 상태에 도달하느냐 여부에 달려있다. 이런 유형의 버그는 대개 자주 호출되지 않는 소스코드 부분에 존재하고, 따라서 오랜 기간 동안 발견되지 않고 남아있을 수도 있다. 그래서 때때로 코드에 사는 귀신(a ghost in the code)’으로 불리기도 함
  • 예를 들면, by-the-book 바이너리 검색 알고리즘에 있는 오버플로우 버그는 검색 대상 데이터 어레이가 매우 크거나 또는 검색될 아이템이 어레이 끝 부분에 위치할 경우에만 모습을 드러낼 수 있다. 프로그래머가 자신의 작업을 테스트 할 때 작은 데이터 어레이를 사용하는 경향이 있고, 최근 들어서야 충분히 큰 어레이를 수용할 수 있는 메모리 여유를 가진 머신이 존재하게 되었으므로 이런 버그가 수년간 발견되지 않고 숨어있을 수도 있는 것이다.

 

만델버그(Mandelbug)

  • 차원분열도형의 도입자(fractal innovator)인 베누아뜨 만델브로의 이름을 딴 만델버그는 그 원인이 너무 복잡해서 버그 동작이 무질서해 보이거나(chaotic) 심지어 비결정적(non-deterministic)으로 보이는 컴퓨터 버그이다(이 정의는 만델버그를 하이젠버그 보다는 보흐버그로 간주).
  • 때때로 버그 동작이 무질서하지는 않지만 그 원인이 너무 복잡해서 실질적인 해법이 없는 버그를 지칭하기도 함. 전체 시스템의 근본적인 설계 오류로 인해 야기되는 버그가 이러한 예이다.
  • 문헌에서 보흐버그, 하이젠버그, 만델버그 간의 관계에 대한 설명이 일관적이지 않은 경우가 많음. 위 정의에 따르면 만델버그는 보흐버그이고, 하이젠버그와 보흐버그는 반대말로 여겨짐. 하지만 모든 하이젠버그는 만델버그라는 주장도 있음. IEEE Computer의 컬럼에서는 만델버그를 보흐버그의 상호보완적 반대말로 여김(, 소프트웨어 버그는 보흐버그이거나 만델버그 둘 중 하나다)
  • 튜어링 테스트 원리처럼 동작이 혼돈스러운 것처럼 보이는 버그와 동작이 실제로 혼돈스러운 버그를 구분할 방법이 없다면 만델버그와 하이젠버그 간의 구별을 하는 것이 적절하지 않다는 의견도 있다.
  • 만델버그의 특징인 복잡한 동작은 fault activationfailure occurrence 사이의 긴 지연에 의해 초래되거나 또는 타 소프트웨어 시스템 요소(하드웨어, 운영체제, 애플리케이션)가 버그의 동작에 영향을 주어 야기되는 것으로 가정

 

슈뢰딩버그(Schrödinbug)

  • 슈뢰딩거의 고양이 사고 실험(the Schrödinger's cat thought experiment)에서 따 온 슈뢰딩버그는 누군가가 일상적이지 않은 방식으로 소스 코드를 읽거나 프로그램을 사용한 후에야 해당 프로그램이 애초부터 돌아가지 않았어야 함을 알아차리게 되는 버그(이 순간 프로그램은 작동을 멈춰버리고 고치기 전까지는 사용할 수 없게 됨). 이런 일이 불가능하게 느껴질지 몰라도 실제로 발생함. 일부 프로그램은 슈뢰딩버그를 수년 동안 감춰두고 있는 경우도 있다.
  • 신뢰할만한 컴퓨팅 환경에서 실행되는 잘 작성된 프로그램은 결정론 원칙(the principle of determinism)을 따르는 것으로 여겨지므로 슈뢰딩거(박스를 열어 고양이를 죽게 만드는)에 의해 가정된 관측성 양자 문제(the quantum questions of observability: 소스 코드를 읽음으로써 프로그램을 못쓰게 만들어버리는)가 프로그램의 오퍼레이션에 영향을 주는 것은 예상하지 못한 일
  • 명백히 결함이 있는 코드를 빨리 수정하는 것이 어떤 불가사의한 상황으로 인해 처음에는 작동하다가(작동하는 것처럼 보이다가) 이후 멈추게 되는지 원인을 파악하는 것보다 종종 더 중요하며, 이런 이유로 많은 슈뢰딩버그들이 제대로 이해되지(조사되지) 못하고 있음. 이런 타입의 버그가 충분히 상세하게 조사되면 대개 보흐버그, 하이젠버그, 또는 만델버그로 재분류 될 수 있다.

 

달 주기 버그(Phase of the Moon bug)

  • 버그 패러미터로서 달의 주기는 때때로 어리석은 이야기(버그의 진짜 원인을 찾다가 지친 사람들의 농담 정도)로 치부되기도 하지만, 전문용어파일(The Jargon File)에 데이터 프로세싱 문제가 실제 달 주기 타이밍에 의해 야기된 두 건의 흔하지 않은 사례가 기록되어 있음
  • 대개 시간 종속적인 행동을 가지는 프로그램은 시간 종속적 실패(time-dependent failures)에 취약하다. 스케쥴링 된 프로세스의 특정 부분에서 발생하거나 또는 특정 시간(윤일이나 프로세스가 썸머타임////세기의 경계를 넘는 경우)에 이러한 버그가 발생할 수 있다(, Year 2000 버그).

 

 

NOTE. 하이젠버그로 인해 야기되는 실패(failure)를 재생하는 것이 이론적으로 가능하므로 하이젠버그와 보흐버그가 다르지 않다는 주장도 있음(, 모든 하이젠버그가 결국은 보흐버그가 될 수 있다).

 

반응형

+ Recent posts