프로그램이 결코 잘못되지 않을 것이라고 보장 할 수 있습니까?


10

여기에 시스템이 있습니다. 최근에 시스템에서 생성 된 보고서의 숫자 중 하나에 잘못된 계산이 있습니다. 우리의 경험을 통해, 우리는 몇 년 동안이 시스템에서 어떤 문제 / 오류도 겪지 않았습니다.

이 시스템의 작가는 이미 사라 졌으므로 프로그램을 거의 추적 할 수 없습니다. 그러나 입력 데이터, 설정 및 올바른지 확인했습니다.

이제 제 질문은, 컴퓨터 프로그램이 논리적 이유없이 갑자기 잘못 될까요? 서버 컴퓨터에서 슬램하면 컴퓨터가 계산하는 숫자 중 하나가 다른 숫자가되어 계산이 잘못됩니까?

나는 매우 화가 났음을 내 생각에 동의하지만, 단지 문제가 프로그램과 입력에 의한 것이 아니라 다른 요인들에 의해 발생한다는 것을 어떻게 알 수 있습니까?

PS이 미친 시스템에는 로그가 없습니다.


8
내 PC의 RAM 모듈 중 하나에 정확히 하나의 결함 비트가 있었으므로 해당 비트를 사용할만큼 불행한 프로그램은 잘못된 결과를 제공 할 수 있습니다. 컴퓨터에서 memtest86을 실행하면 이런 종류의 문제를 배제 할 수 있습니다.
user281377

16
예, 그것은을 삭제하여
스티븐 A. 로우를

6
일부 하드웨어에는 실제로 버그가 있습니다. 그것은 오늘날 소수의 칩 메이커들에 대한 증거입니다. 소프트웨어가 먼저 의심됩니다.

프로그램이 잘못되는 논리적 인 이유는 항상 있습니다. 슬램은 논리적 이유입니다.
mouviciel

2
통계 폭탄, 악의적 인 컴파일러, 나쁜 램, 디스크 또는 램에 쓰거나 OS를 수정할 수있는 바이러스, OS 버그 또는 라이브러리의 버그 또는 유명한 병합 정렬 버그, 또는 ...
Job

답변:


8

나는 아니오라고 말할 것이다!

이론적으로 대답은 '아니오'입니다.

  • 일부 제한된 수의 환경.
  • 일부 제한된 시간 단위.
  • 일부 제한된 수의 테스트 사례.

이는 프로그램의 수명 동안 발생할 수있는 총 환경, 시간 및 사례 수보다 훨씬 적습니다. 또한 프로그램이 10,000 % 인플레이션에 대처해야하는지, 프로그램이 새로운 듀퍼의 새로운 31 비트 아키텍처에 대처해야하는지 미래에 대한 지식이 거의 없습니다.

이론은 내가 개인적으로 경험 한 경험에 의해 뒷받침됩니다 :-

  • 다른 로케일로 이동하면 프로그램이 중단됩니다. 월이 "MAI"일 때 "MAY"를 확인 중입니다.
  • 새 버전의 컴파일러에서 테스트에 실패한 프로그램, 이전 버전의 버그는 프로그램의 버그와 함께 올바른 결과를 생성했습니다.
  • OS의 새로운 릴리스에서 중단되는 프로그램. Solaris가 기본 디렉토리 항목 수를 늘리면 ftok ()에 의해 리턴 된 SMALLINT는 디렉토리의 첫 번째 파일에 대해 항상 0을 리턴했습니다.
  • 유효하지 않은 특정 입력 조합을 처음으로 발견했기 때문에 프로그램이 깨짐 부가가치세 등을 계산할 수 없습니다.

멀티 스레딩이있는 경우 조항과 함께 예라고 말합니다. "레이스 상태"에 대해 들어 본 적이 있습니다.
mattnz

6

이론적으로 동일한 상태로 시작하면 결과는 동일합니다. 실제로 "서버 크기"장비에서 동일한 초기 상태를 보장하는 것은 거의 불가능합니다.

초기화되지 않은 변수를 사용하십시오. 이 코드를보십시오 :

  short i;

  if(i==-1)
  {
        //do something special
  }
  else
  {
        i=0;
        //do something else
  }

65536 실행에서 한 번 예기치 않은 결과가 발생합니다. 그리고 각 실행 전에 메모리가 동일한 상태에 있다고 확신하지 않으면 i완전히 무작위입니다.

누군가가 무시하지 않은 초기 상태의 예기치 않은 요소 또는 거의 발생하지 않는 경계 사례 (멀티 스레드 환경의 경합 조건, 범위 밖의 어레이 액세스, 손상된 파일 시스템의 디스크 IO) 및 곧.

프로그램에 버그가 없음을 증명할 수 있다면, 그것을 깨뜨릴 수있는 우주 광선 만 있습니다. 그러나 두 개의 중첩 루프보다 복잡한 것의 정확성에 대한 수학적 증거는 가장 큰 시스템의 범위를 넘어서고 (소액의 비용이 듭니다) 나머지는 모두 희망 할 수 있습니다.


6

이제 제 질문은, 컴퓨터 프로그램이 논리적 이유없이 갑자기 잘못 될까요?

동일한 컴퓨팅 환경을 가진 경우 프로그램에 입력 X를 제공하면 항상 동일한 결과 R이 생성됩니다. 실제로 단일 프로그램을 단독으로 실행하는 것은 거의 없습니다. 오늘날 가장 간단한 응용 프로그램은 운영 체제에서 실행되며 동시에 메모리에 '로드'될 수있는 다른 프로그램과 메모리를 공유합니다. 이러한 프로그램은 특정 프로그램이 오작동하는 방식으로 메모리를 변경할 수 있습니다. 이것은 예를 들어 '포인터'유형의 변수에 대한 유명한 문제입니다. 일반적으로 이러한 오류는 비정상적인 시스템 동작을 유발하며 잘못된 계산 결과는 아닙니다.

귀하의 경우, 문제는 위에서 설명한 것과 다를 수 있다고 가정합니다. 문제는 다음과 같습니다.

  • 프로그램은 잘못된 데이터 유형을 사용하여 결과를 계산했으며, 특수 값을 사용할 때만 오류가 나타납니다.
  • 프로그램에서 계산 오류 (논리적 조건으로 인해)가 발생했지만 오류를 처리하지 않았으며 여전히 결과를 생성했습니다. (예 : float와 integer 산술 혼합)
  • 비즈니스 규칙 또는 논리 조건이 올바르게 코딩되지 않은 경우 입력 된 데이터가이 조건을 나타내지 만 잘못된 계산이 사용되었습니다. (예 : 계정에서 금액을 먼저 확인하기 전에 계정 금액에서 금액을 뺍니다).
  • 특정 범위의 숫자에만 적용되지만 데이터에 다른 범위가 포함 된 수식 사용 (예 : 값의 범위에 따라 이자율 계산)

소프트웨어 사람들이 올바른 소프트웨어를 만들려고 많은 리소스를 소비하는 위와 다른 많은 이유들로 인해 소프트웨어 오류는 여전히 발생하지만 오류는 '논리적'이며 그 이유는 분명하지 않습니다. 좋은 연구 없이도 따라서 일반적으로 테스트 된 소프트웨어는 예측 가능하며 임의의 결과를 생성하지 않습니다. 일부 프로그램의 복잡성 및 기타 요인으로 인해 테스트 된 프로그램조차 잘못 될 수 있지만 이러한 상황이 발생하면 오류는 논리적 이유입니다.

서버 컴퓨터에서 슬램하면 컴퓨터가 계산하는 숫자 중 하나가 다른 숫자가되어 계산이 잘못됩니까?

대답은 일반적으로 아니요, 소프트웨어는 그런 의미에서 취약하지 않습니다.

수행 할 수있는 작업은 오류가 발생하는 경우를 격리하고, 오류를 발생시키는 이러한 데이터 세트 간의 유사성을 찾고, 이러한 세트와 올바른 결과를 생성하는 다른 세트 간의 차이를 찾는 것입니다. 문제를 일으키는 특정 값 집합을 식별 할 수 있습니다. 예를 들어 변수가 음수 값을 가질 때마다 결과가 잘못 될 수 있습니다.

메모리 손상 오류에 대한 업데이트 된 정보 : 메모리 손상 참조


복합 반올림 오류를 그러한 문제의 원인으로 생각했습니다. 입력의 정확한 (또는 잘못된) 조합이 모두 조합되어 결과가 끝나는 결과로 끝날 때까지 오랫동안 표시되지 않을 수 있습니다.
jwenting

3
최신 운영 체제에서는 프로그램이 다른 프로그램에 속하는 메모리를 수정 (또는 읽기) 할 수 없습니다.
Péter Török

그렇습니다. 현대 OS는 그러한 특성을 허용하지 않습니다.
DeadMG

"같은 컴퓨팅 환경을 가지고 있다면, 입력 X가 프로그램에 주어진다면 항상 같은 결과 R을 얻을 것이다"나는 이것이 사실인지 확신 할 수 없다. 메모리 구성 요소의 SR 래치 중 하나가 초기 손상으로 인해 두 개의 1을 얻는 경우 어떻게됩니까? en.wikipedia.org/wiki/…
Yam Marcovic

의견을 보내 주셔서 감사합니다. @DeadMG와 Péter Török은 메시지를 편집하고 문제가 여전히 발생할 수 있음을 설명하는 페이지에 대한 참조를 추가했습니다 (본문에서 언급 한 바와 같이 매우 불가능합니다).
NoChance

5

프로그램에 버그가 없으며 절대 잘못되지 않을 것이라고 보장 할 수 있습니까? 안타깝게도 아닙니다.

프로그램에 버그를 발견하고 수정하는 데 드는 비용이 해당 조치의 이점을 훨씬 능가하는 버그가 충분히 있음을 증명할 수 있습니까? 당신이 이미 가지고있는 것처럼 들립니다.

오래된 통계를 최대로 바꾸려면 모든 프로그램이 잘못되었지만 일부 프로그램이 유용합니다.


1
+1 "모든 프로그램이 잘못되었지만 일부 프로그램이 유용합니다"
CVn

이 답변이 실제로 관련이 있다고 생각하지 않습니다. 환경 문제로 인해 올바른 프로그램이 때때로 예기치 않게 작동 하는지 묻는 것 같습니다 .
얌 마르코비치

내 요점은 어떤 프로그램도 "정확한"것이 없다는 것이다. 모든 것은 항상 진행중인 작업이며 잘못 될 때까지 항상 옳습니다. 컴퓨터 과학은입니다 과학 결국. 나는 당신이 무슨 말을하는지 알고 있으며, 그의 질문의 초점이 더 중요 할 수 있습니다. 그러나 나는 그것이 내 대답을 덜 관련성이 아니라 오히려 더 관련성이 있다고 생각합니다.
John N

@Hallainzil : 올바른 "Hello, World!"를 성공적으로 작성했다고 생각합니다. 프로그램 등. 나는 올바른 유용한 프로그램을 작성했습니다 (큰 프로그램은 아니지만).
David Thornley

2

내가 말할 의향이없는거야 아니 , 당신은 프로그램이 것을 증명할 수 결코 당신이 완벽한 입력을 가정 할 경우에도 잘못하거나 잘못된 결과를 제공합니다.

라쿠는 공식적인 정확성 증명을 언급했다. 그것은 한 가지 고려해야 할 사항이지만, 완전히 착각하지 않는 한 여전히 완벽한 실행 환경을 가정해야합니다. 따라서 약간의 시간과 노력을 기울이면 프로그램이 정확 하다는 것을 증명할 수는 있지만 완벽한 입력이 주어 졌더라도 항상 올바른 결과를 얻을 수 있음을 반드시 증명할 수는 없습니다 . 실행 환경이 중요합니다. 그리고 입력이 항상 완벽하다고 가정합니다.

따라서 고 가용성이 높은 특정 상황에서는 완전히 독립적 인 여러 구현 및 실행 환경이 사용되며 결과가 서로 허용 가능한 오차 범위 내에 있는지 확인하기 위해 결과가 비교됩니다. 어떤 상황에서는 그 마진이 0이 될 수도 있습니다. 1960 년대에도 우주선에 별도의 컴퓨팅 하드웨어 세트를 포함시킬만큼 중요한 것으로 간주되었습니다. 잘못된 정전기 방전, 우주 광선 또는 두 컴퓨터에 동시에 영향을 줄 수있는 것이라도 두 컴퓨터가 같은 방식으로 영향을받을 가능성은 매우 낮습니다 (특히 여전히 작동하고 유효한 결과를 낳는 경우). 동일한 버그가 완전히 별개의 구현으로 들어올 확률은 매우 작습니다. 등등.


1

대부분의 (표준) 컴퓨팅은 결정 론적이라고 생각합니다.

가능하면 1000 또는 10000 등의 배치를 동일한 입력 데이터로 반복하여 설정하고 결과가 동일한 지 확인하십시오.

계산에 들어가는 현재 값이 어디에서나 오버플로 또는 언더 플로를 유발하는지 확인하십시오 (오래된 시스템 인 경우 오래 사용되지 않았을 수 있음).

Y2K11 누군가?


N 반복을 수행하고 결과를 검증한다고해서 정확성이 입증되지는 않습니다. 기껏해야 샘플 세트 내에 오류가 없음을 입증하며 테스트 사례 (및 구현 및 실행)가 절대적으로 정확하다고 가정합니다. 테스트는 매우 유용하지만 OP의 우려를 해결하지는 못합니다.
CVn

@Michael 아마도 분명히해야 할 것입니다.이 접근법으로 아무것도 "증명"하려고 시도하지는 않지만 오류가 다시 표시되지 않고 빈번한 반복이 계속되면 태양 흑점을 생각하고 정수 오버플로가 아니라고 생각합니다. IMHO는 여전히 당신에게 더 많은 통찰력을 제공합니다.
jonsca

1

기계의 모든 단일 비트와 회로를 통해 흐르는 모든 전기 임펄스를 제어 할 수 없다면 프로그램에 문제가 없는지 확실하게 보장 할 수 없습니다. 메모리 모듈이 고장 나고 CPU가 과열되어 오류가 발생할 수 있으며 하드 드라이브가 데이터를 스크램블 할 수 있으며 전원 공급 장치가 시스템에 소음을 유발할 수 있습니다. 하드웨어가 비싸고 하드웨어가 중복 될수록 이러한 일이 발생할 가능성은 적지 만 어느 시점에서 하드웨어에 장애가 발생할 수 있습니다.

그런 다음 가장 신비한 방법으로 상상할 수있는 버그가있는 운영 체제가 있습니다. 컴파일러는 원래 코드를 추적하기 어려운 버그로 바꾼다. 그것은 정글이며, 가난한 소프트웨어는이 모든 것에 취약합니다. 밖을 봐!

그리고 내 경험에 따르면 계산에 버그가있을 때마다 범인을 찾기 위해 거의 멀리 파지 않아도됩니다. 일반적으로 회사 세계에서 본 거의 모든 버그는 올바른 디버깅 도구와 팔꿈치 그리스로 쉽게 찾을 수 있습니다.

다시 말해, 하드웨어와 OS가 완벽하지는 않지만 그 정도의 세부 사항에 대해 걱정할 필요는 없습니다. 언어를 아는 사람을 찾고 디버거를 사용하는 것이 편리합니다.

"간단한 설명은 다른 것들은 동일하지만 일반적으로 더 복잡한 것보다 낫습니다." -Occam 's Razor의 요약.


0

예. 시스템에 부딪히면 부품이 구부러 지거나 부품이 움직여 일시적인 개방 회로 (또는 아마도 단락 가능성이 낮지 만)가 발생할 수 있습니다.


0

내가 소유 한 첫 번째 컴퓨터는 256 바이트의 메모리를 가진 Altair 8080이었습니다. 입력은 콘솔 스위치에서오고 출력은 몇 개의 깜박이는 표시 등에서 왔습니다. 우주 광선과 하드웨어 오류를 허용하지 않으면 내가 실행 한 일부 프로그램이 항상 동일한 결과를 생성 한다는 것을 증명할 수 있다고 생각 합니다.

그 이후로


0

테스트 결과 버그가없는 것이 아닌 것으로 나타났습니다 (Edsger W. Dijkstra)

테스트를 통해 프로그램이 올바르게 작동한다는 것을 증명하려고하면 작동하지 않습니다.

그러나 이론적 인 컴퓨터 과학에는 사용자가 작성한 소프트웨어의 공식적인 증거를 개발하는 몇 가지 접근법이 있습니다. 시스템의 복잡성에 따라 지루한 프로세스가 될 수 있습니다. 그러나 시스템이 제한된 명령 세트에서 작동하는 경우이 방법으로 성공할 수 있습니다.


질문을 읽었습니까?
Winston Ewert

나는 그랬고 나는 그가 프로그램이 결코 잘못되지 않을 것이라고 보장하기 위해 테스트를 사용할 수 없다고 말하고 있습니다. 그것이 그의 질문의 제목이 말하는 것입니다.
Raku

예, 제목이 그렇게 말하는 것 같습니다. 몸은 분명히하지 않습니다.
Winston Ewert

0

하드웨어 및 소프트웨어 환경은 일정한 흐름 상태에 있습니다. 움직이는 부품, 전기, 온도, 먼지 및 OS 코드 변경이 그 예입니다.

따라서 환경이 항상 변하기 때문에 컴퓨터 소프트웨어 프로그램이 항상 동일하게 작동 할 것이라고 생각하지도 않습니다.

소프트웨어는 예상대로 오랫동안 실행될 수 있지만 결국 호스트 OS 소프트웨어를 약간 변경하면 문제의 프로그램에 영향을 미치거나 하드웨어의 가치에 영향을 미칩니다.

나는 현재 컴퓨터에 대해 이야기하고 있습니다.


0

이제 제 질문은, 컴퓨터 프로그램이 논리적 이유없이 갑자기 잘못 될까요? 서버 컴퓨터에서 슬램하면 컴퓨터가 계산하는 숫자 중 하나가 다른 숫자가되어 계산이 잘못됩니까?

그 질문에 대한 답은 알 수 없습니다. 우리가 살고있는 우주에서 항상 어떤 것이라도 사실이라는 것을 증명하는 것은 불가능합니다. 대신 우리는 가정을하고 가정이 유지되면 복잡한 재산도 보유한다는 것을 증명합니다. 이것이 공식적으로 검증 된 프로그램이 보장하는 것입니다. 대부분의 프로그램은 공식적으로 검증되지는 않지만 테스트를 제공하여 신뢰를 구축하려고합니다. 이러한 테스트는 테스트가 의도 한대로 수행되고 가정 한 가정에 따라 사용중인 프로그램이 최소한 일정 시간 동안 작동한다는 것을 보증합니다.


-1

RAM 고장으로 인해 문제가 발생할 가능성은 거의 없지만, 이는 비교적 (아주) 가능성이 낮습니다. 메모리 테스트를 실행하되 코드를 살펴볼 준비를하십시오.


downvoter에게-나는 이것이 일어나는 것을 보았습니다. 한번.
James McLeod
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.