컴파일러와 인터프리터에 버그가있을 수 있으며 사용자로서 버그를 처리하기 위해 무엇을 할 수 있습니까? [닫은]


28

컴파일러의 작업이 소스 코드를 기계 수준 코드로 본질적으로 변환하는 경우 컴파일러에 결함이있을 수 있습니다 (예 : 잘못된 "번역")?

통역사도 마찬가지입니다. 때로는 필요한 컨텐츠를 출력하지 못할 수 있습니까?

컴파일러 / 통역사의 버그에 대해 들어 본 적이 없지만 존재합니까?


6
개발 과정에서 가장 확실한 것은 오픈 소스 컴파일러에서 버그 추적기를 살펴 보는 것입니다.
ratchet freak

7
컴파일러 / 통역사의 버그에 대해 들어 본 적이 없지만 존재합니까? gcc 컴파일러에서 버그의 메일 링리스트를 찾았습니다. gcc.gnu.org/ml/gcc-bugs
FrustratedWithFormsDesigner

47
이것은 정말 좋은 질문이 아니며 상식적인 것을 묻습니다.

12
지금까지 의견이나 답변 은 컴파일러 버그가 발생할 가능성 을 다루지 않습니다. 먼저 자신의 코드에서 오류를 배제하십시오.
Dan Pichelman

6
짧은 대답 : 물론입니다. IDE와 컴파일러는 일반적으로 외부 세계를보기 전에 1 인치 내에서 실습을 수행하는 반면, 개발자가 조금 영리한 개발자가 찾을 수있는 모퉁이가 항상 있습니다.
KeithS

답변:


51

상대적으로 성숙한 언어 보다 적극적으로 개발되는 언어에서 더 자주 찾는 경향이 있습니다 (따라서 자주 많은 변화가 보이지 않음). 아마도 대부분의 언어가 다양한 '단계'안정성으로 출시되는 이유 일 것입니다. 야간 빌드는 릴리스 후보 보다 안정적 일 가능성이 훨씬 낮습니다. 릴리스 후보 는 완전히 출시되고 적극적으로 사용되는 버전보다 안정적 일 가능성이 적습니다.

운 좋게도 대부분의 언어 (특히 오픈 소스 언어)에는 보고서를 제출할 수 있는 공개 버그 추적 시스템 이 있습니다.

내 경험상 Windows의 Scala에서 상당히 모호하지만 심각한 버그가 발생했습니다 . 결과를 버그 추적기에 제출했는데 문제가 상당히 빨리 해결되었습니다. 이 경우 언어 개발자는 오류 로그 출력에 유용한 메모를 포함 할 정도로 똑똑하여 내가 겪었던 것은 실제로 컴파일러 오류였으며 보고서를 제출할 위치를 알려주었습니다.


당신이 상관하지 않기를 바랍니다. 관련성이 있다고 생각되는 새 단락 (승인 대기 중)을 추가했습니다. 컴파일러는 버그를 포함 할뿐만 아니라 악성 코드를 포함 할 수 있습니다.
Andy

@Andy는 중재자 중 하나가 댓글이나 별도의 답변이어야하는 것으로 거부했습니다.
KChaloux

"예"뿐만 아니라 "지옥 예!" :-)
Hellion

C는 성숙하고 적극적으로 개발되었습니다. C ++도 마찬가지입니다. 자바도 마찬가지입니다. 등
djechlin

100

평신도의 말로 :

모든 프로그램에는 버그가있을 수 있습니다.

컴파일러는 프로그램입니다.

Ergo, 컴파일러는 버그를 가질 수 있습니다.


55
더 걱정 : 디버거는 프로그램입니다. 따라서 디버거에는 버그가 있습니다.
Daniel Gratzer

19
@ jozefg : 그렇다면 디버거를 어떻게 디버깅합니까? 누가 감시자를 시청합니까?
FrustratedWithFormsDesigner

16
@FrustratedWithFormsDesigner 감시자 감시자.
지미 호파

9
@JoelFan "can have"를 썼기 때문에 그 예외는 다루어집니다. "있다"라고 말하면 사소하지 않은 프로그램 만 참조하도록 지정해야합니다. "할 수있다"라고 말하면 안됩니다.
Tulains Córdova

8
"Hello world"프로그램은 버그가있는 컴파일러와 호환되는 경우 버그가있을 수 있습니다.
wtsang02



4

물론 컴파일러는 소프트웨어이기 때문입니다.

2005 년에 대기업을 위해 작성한 매우 중요한 소프트웨어에서 코드 조각이 실패했습니다. 회사가 수정하는데 수백만 달러가 들었 기 때문에 물론 큰 수사를 시작했습니다.

고맙게도 (내 관점에서)이 문제는 Delphi의 컴파일러 문제로 판명되었습니다. try finally 블록에서 함수의 반환 값이 삭제되어 호출자에게 절대적으로 임의의 결과가 반환되었습니다. 이것은 Borland에 의해 문서화되고 인정되었습니다.

.NET은 문자 그대로 수백 가지의 메모리 누수, 특히 초기 구현에서 잘 알려져 있습니다.

버그가없는 소프트웨어는 없다고 주장합니다. 컴파일러도 예외는 아닙니다. 그러나 그들은 대부분의 비즈니스 소프트웨어보다 철저하게 테스트되었으며 똑똑하고 비판적이며 논쟁적인 사람들이 소비하므로 그들의 실적은 실제로 전체적으로 꽤 좋았습니다.


"공식적으로 검증 된"소프트웨어가 있습니다. 수학적으로 작동하는 것으로 입증되었습니다. 때로는 공식적으로 검증 된 코드에도 버그가 있습니다. IIRC Java의 빠른 정렬 구현은 공식적으로 검증되었지만 오버플로를 설명하지는 않았습니다.
David Plumpton

1
소프트웨어 란 무엇입니까? C'mon :)
Rocklan

2

버그뿐만 아니라 의도적 인 멀웨어도 있습니다.

Brian Kernighan이 원래 Unix C 컴파일러에 구현 한 "로그인"트로이 목마는 가장 잘 알려져 있습니다. http://cm.bell-labs.com/who/ken/trust.html 기사 에 이에 대한 배경 지식이 있습니다.


1
실제로 구현 된 것이 분명합니까?
키이스 톰슨

이것은 매우 흥미로운 주제이지만이 질문과 전혀 관련이 없습니다.

@delnan 동의하지 않습니다. 질문의 핵심은 "내 컴파일러를 얼마나 신뢰할 수 있는가?"
Andy


0

예.

또한 컴파일러뿐만 아니라 인터프리터 / 디버거 및 타사 소프트웨어 도구를 사용합니다.

현재 일부 타사 소프트웨어를 사용하고 있으며 일부 문제가 있습니다. 때로는 버그를 찾아서보고 해 주셔서 감사합니다. :)

그들 중 일부는 메모리 누수가 발생하여 충돌이 발생합니다. 여기서 중요한 질문은 타사 도구 또는 컴파일러에 응용 프로그램이 올바르게 작동하는지 버그가 있는지 확인하는 방법입니다.


그러면 중요한 질문이 Halting 문제로
wtsang02

0

컴파일러는 한 언어로 작성된 프로그램 (원본 언어)을 읽고 다른 언어 (대상 언어), 주로 기계 언어의 다른 동등한 프로그램으로 변환하는 프로그램입니다.

소스 언어 코드를 한 줄씩 스캔하는 여러 단계의 컴파일러가 있습니다. 소스 언어 코드에서 스캔 된 모든 키워드를 추적하는 기호 테이블이 있습니다.

1 단계 : Lexical Analyzer-소스 프로그램의 모든 문자를 읽고 토큰의 논리적 분리 (int, char, float, if-else, for, while 등)를 형성합니다.

2 단계 : 구문 분석기-토큰 스트림의 구조를 분석합니다. 접두사 / 접두사 등을 포함하는 표현식의 계층 적 구문 분석 (a = b + c * d)

3 단계 : 시맨틱 분석기-토큰 유형 (실수, 부동 소수점 등의 정수) 및 연산자 우선 순위 등과 같은 많은 것들.

4 단계 : 중간 코드 생성기-a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)

5 단계 : 코드 최적화-
중복되는 다양한 분석 (제어 흐름, 데이터 흐름, 변환) : 중복 코드, 상수 전파, 부분 데드 코드, 공통 하위 표현, 루프 불변 코드

6 단계 : 코드 생성-레지스터에 값을 입력하는 대상 코드 (대부분 어셈블리 언어) 생성

이 모든 단계는 잘 작성된 프로그램 일 뿐이며 N 개의 결함이있을 수 있습니다.


-1

물론 컴파일러는 단지 프로그램 일 뿐이며 저자도 바보입니다. :). 언어 사양조차도 버그가있을 수 있습니다. 예 : 의 C #의 foreach + + 람다 .

또는 파이썬에서 인터프리터의 버그 : evil ast를 컴파일하면 인터프리터가 충돌합니다 .

컴파일러 / 인터 피터에서 버그를보고 싶다면 PHP를보십시오. 정수 오버플로로 유명한 버그가 있습니다. 첫 번째 수정은에서 시작되었습니다 if (size > INT_MAX) return NULL;. 이야기의 계속 .


컴파일러 작성자는 바보가 아닙니다. 컴파일러가 상당히 복잡하기 때문에 필드에 들어가는 장벽도 상당히 높습니다. 따라서 우리는 글을 쓰는 사람들이 평범한 사람들처럼 실수를 저 지르지 않을 것을 기대할 수 있습니다.
jszpilewski

foreach / lambda는 버그가 아니며 람다가 추가되기 전에 이루어진 구체적이고 양심적 인 디자인 결정으로 귀결됩니다.
Andy

@ 앤디, 아시다시피,이 결정으로 인해 어떤 문제가 발생할지 아무도 모릅니다. 왜 버그가 아닌가?
빅토르 로바

@jszpilewski 그 텍스트 뒤에 미소가 보입니까?
빅토르 로바

1
그의 질문은 사양에 버그가있을 수 있는지 여부와 COMPILERS에 버그가있을 수 있는지 여부에 대한 것이 아니기 때문에 OP를 다시 읽으십시오. C # 컴파일러가 사양과 일치하므로 컴파일러에 버그가 없었습니다. 또한 여러분은 자신의 Wikipedia 인용문 "소프트웨어 버그는 컴퓨터 프로그램의 오류, 결함, 오류 또는 결함입니다"를 다시 읽어 보시기 바랍니다.
Andy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.