2013-04-12 1 views
7

아래 C 프로그램을 컴파일하면 다음 경고가 표시됩니다. ‘noreturn’ function does return. 이 함수는 다음과 같습니다.'noreturn'함수가 다음을 반환합니다.

void hello(void){ 
    int i; 
    i=1; 
} 

왜 그럴 수 있습니까? 전체 오류 출력 :

home.c: In function ‘hello’: 
hhme.c:838:7: error: variable ‘i’ set but not used [-Werror=unused-but-set-variable] 
home.c:840:1: error: ‘noreturn’ function does return [-Werror] 
cc1: all warnings being treated as errors 
make: *** [home.o] Error 1 
+0

정확한 컴파일러 경고를 게시 할 수 있습니까? –

+9

[SSCCE] (http://sscce.org/)를 작성하고 전체 예제를 보여 주시겠습니까? 또한 _all_ 및 _complete_ 오류/경고 메시지를 포함하십시오. –

+2

어떤 컴파일러를 사용하고 있습니까? 어떤 컴파일러 옵션을 사용 했습니까? – Bechir

답변

24

특정 함수가 반환하지 gcc을 알 수 있습니다이 함수 모든 호출은 hello();

EDIT입니다. 이렇게하면 특정 최적화가 가능하며 초기화되지 않은 변수에 대한 허위 경고를 피할 수 있습니다.

noreturn attribute 사용하여 수행됩니다 : 함수가 noreturn 속성에도 불구하고 반환하지

void func() __attribute__ ((noreturn)); 

경우, 컴파일러는 (귀하의 경우 오류로 변환됩니다) 당신이보고있는 경고를 방출한다. 당신은 당신의 코드에서 noreturn를 사용하지 않을 것 때문에

, 가능성이 설명은 당신이 이름이 충돌 표준 noreturn 기능, 아래의 예에서와 같이 기능을 가지고 : 여기

#include <stdlib.h> 

void exit(int) { 
}    // warning: 'noreturn' function does return [enabled by default] 

을, 내 exitexit(3)과 충돌합니다.

이러한 충돌에 대한 또 다른 명백한 후보는 abort(3)입니다.

물론 실제로 함수가 hello()이라면 범인은 코드베이스의 어딘가에있을 것입니다.

4

아마도이 기능은 __attribute__((noreturn))으로 표시됩니다. 그러나 실제로 반환됩니다 (제어가 irs 본문의 끝 부분에 도달하면 무한 루프에 들어 가지 않고 다른 "noreturn"함수 등을 호출하지 않습니다)

보이지 않습니다. 귀하의 요점은 1. 비 반환으로 함수를 표시, 2. 아무것도하지 않는 함수를 작성 - 아마 당신은 둘 다 제거 할 수 있을까요?

+3

이 해답을 명확히하기 : __attribute __ ((noreturn)) 함수의 경우 함수 본문이 무한 루프 또는 다른 noreturn 함수 호출로 끝나지 않으면이 경고 메시지가 나타납니다. 즉, 컴파일러는 "흐름 분석"을 수행하고 실제로 함수가 반환 될지 여부를 결정할 수 있습니다. 닫는 중괄호에서 암시 적으로 반환된다는 것을 기억하십시오. – bootchk

+3

@bootchk, +1은 "무한 루프"입니다. 'f() {}'는 경고/오류를 생성합니다. 'f() {while (1); }'괜찮습니다. 감사 – user3124812