2013-04-12 19 views
7

Quando compilo il programma C di seguito, ricevo questo avviso: ‘noreturn’ function does return. Questa è la funzione:La funzione 'noreturn' restituisce

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

Perché potrebbe succedere? Tutta la chiamata a questa funzione è hello();

EDIT: L'uscita di errore completo:

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

puoi pubblicare l'avviso esatto del compilatore? –

+9

Potresti creare un [SSCCE] (http://sscce.org/) e mostrarci un esempio completo? Si prega inoltre di includere _all_ e _complete_ messaggi di errore/avviso. –

+2

Che compilatore stai usando? Quali opzioni del compilatore hai usato? – Bechir

risposta

24

E 'possibile dire gcc che una particolare funzione non ritorna più. Ciò consente alcune ottimizzazioni e aiuta ad evitare avvisi spuri di variabili non inizializzate.

Questo viene fatto usando il noreturn attribute:

void func() __attribute__ ((noreturn)); 

Se la funzione non tornare, nonostante l'attributo noreturn, il compilatore emette l'avviso che stai vedendo (che nel tuo caso viene convertito in un errore).

Dal momento che è improbabile di utilizzare noreturn nel codice, la spiegazione probabile è che si dispone di una funzione il cui nome si scontra con una funzione standard noreturn, come nell'esempio qui sotto:

#include <stdlib.h> 

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

Qui, i miei scontri exit con exit(3).

Un altro ovvio candidato per un tale scontro è abort(3).

Naturalmente, se la tua funzione è in realtà chiamata hello(), il colpevole è quasi certamente all'interno della tua base di codice.

4

Molto probabilmente, la funzione è contrassegnata con __attribute__((noreturn)). Tuttavia, di fatto restituisce (quando il controllo raggiunge la fine del corpo di irs, poiché non entra in un ciclo infinito, non chiama altre funzioni "noreturn", ecc.)

Non vedo qual è il tuo punto in 1. marcando la funzione come non-return, 2. scrivendo una funzione che non fa nulla - probabilmente potresti eliminarli entrambi?

+3

Chiarire questa risposta: per una funzione con __attribute __ ((noreturn)), se il corpo della funzione non termina con un ciclo infinito o una chiamata a un'altra funzione noreturn, si ottiene questo avviso. In altre parole, il compilatore esegue "analisi del flusso" e può determinare se la funzione potrebbe effettivamente tornare. Ricorda che c'è un ritorno implicito alla coppia di chiusura. – bootchk

+3

@bootchk, +1 per "loop infinito". 'f() {}' genera warning/error. 'f() {while (1); } 'va bene. Grazie – user3124812

Problemi correlati