2014-11-05 2 views
4

이미 제대로 작동하는 컴파일러를 작성했습니다. 모든 void가 아닌 메소드에는 적어도 하나의 return 문이 있는지 확인하지만 비 void 메소드 내의 모든 코드 경로가 값을 리턴하는지 점검하지 않습니다. 따라서, 예를 들어, 나는 다음과 같은 코드가있는 경우 :메서드가 항상 값을 반환하는지 확인하는 방법

int function(bool a) 
{ 
    if(a){ 
     return 5; 
    } 
} 

그것은 "좋은"컴파일하고이 false 인 경우, 제어 기능을 삭제하고 기능에 따라 정의 된대로 실행 유지됩니다.

이 검사를 수행하는 데 사용할 수있는 알고리즘이 있습니까? 그래서 항상 메소드가 항상 값을 반환하는지 알 수 있습니까? 또는 바퀴를 재발 명할 필요가있을 것인가?

+0

꽤 많은 컴파일러 트릭에는 권장 내부 표현 등을 포함한 이미 사용 가능한 알고리즘이 있습니다. http://en.wikipedia.org/wiki/Data-flow_analysis 동일한 언어에 대한 기존 컴파일러의 주석 처리 된 소스 코드 읽기 (사례에서 'C'와 유사하므로 http://stackoverflow.com/questions/를 선택하십시오. 584714/is-there-an-interpreter-for-c) 아마도 당신이 불분명하고 광범위한 질문을 – xmojmr

답변

1

함수는 값이 반환되는지 여부에 관계없이 함수가 "끝에서 벗어나"범위 밖에서 코드 실행을 시작할 수 없습니다. 결과를 반환하지 않는 함수 (또는 결과를 반환하는 함수의 경우조차도 규칙없는 언어)에서는 최종 return 문을 생략 할 수 있지만 모든 경우에 함수를 반환해야하는 경우가 일반적입니다. 말의 가을 void 이외의 기능에 대한 오류 메시지를 생성하는 가장 간단한 방법은, 점을 감안

:

  • 파서는 함수 본문의 끝에 return 문을 삽입합니다.

  • 불필요한 경우를 대비하여 삽입 된 return 문을 제거하려면 데드 코드 제거를 사용합니다.

  • Typechecking은 모든 return 문 (삭제되지 않은 경우 삽입 된 문 포함)이 함수의 반환 형식과 일치하는지 확인하는 데 사용됩니다.

    이 시나리오에서는

, 당신은 유형 검사하기 전에 불필요한 return 문을 삭제해야합니다 (즉. 생성 된 return 문에 값이 없기 때문에, 그것은 단지 void 기능과 일치 될 수있다), 또는 당신이 겁니다 많은 잘못된 오류 메시지가 표시됩니다. 이를 위해서는 약간의 제어 흐름 분석이 필요합니다.

너무 많은 작업이있는 경우 함수가 값을 반환하는 경우 값이없는 return 문을 오류 연산으로 컴파일하여 런타임에 오류 메시지를 실행할 수 있습니다.

+0

[self-answer] (http://stackoverflow.com/help/self-answer)하는 가장 좋은 방법 일 것입니다. 참으로 "끝에서 떨어지다"문제를 해결, 나는 그것이 문제라고 생각하지 않습니다. 모든 경로가 값을 반환하지 않으면 컴파일 타임 오류를 생성하는 방법에 대한 질문이었습니다. – sepp2k

+0

값을 반환하지 않는 함수에 대한 제안을합니다. 그러나 단순히 반환 값이 무엇인지 추측 할 수 없기 때문에 동일한 작업을 수행 할 수 없습니다. 끝에서 떨어지는 기능이 생겨서는 안됩니다. 내가 묻는 것은 컴파일러가 오류를보고 컴파일을 중단하도록이 상황을 감지하는 방법이다. –

+0

@ sepp2k 바로 그 뜻입니다. –

관련 문제