2017-01-18 2 views
2

Gegeben zurückzukehren:GCC-Fehler: Funktion könnte Kandidat für das Attribut ‚rein‘ sein, wenn bekannt ist, dieser Code normalerweise

#include <cstdlib> 

void func(int x) 
{ 
    if (x) 
    abort(); 
}; 

g++ -Werror=suggest-attribute=pure klagt:

error: function might be candidate for attribute ‘pure’ if it is known to return normally

Dies scheint seltsam zu mich- Ist es nicht offensichtlich, dass die Funktion nicht normal zurückkehrt? Gibt es eine Möglichkeit, GCC mitzuteilen, dass es nicht immer normal zurückkehrt oder dass diese Warnung für diese bestimmte Funktion nicht angezeigt werden soll?

Demo: https://godbolt.org/g/720VOT

+1

Die Funktion hat keine Wirkung, aber die zurückgegebene Wert (das ist ein _no effect_ für sich selbst und dieser Wert hängt (nur) von Parametern ab. Es scheint ein guter Kandidat zu sein. Warum nicht? – skypjack

+0

@skypjack: Die Funktion hat einen Nebeneffekt - sie kann 'abort()' aufrufen und dadurch das Programm beenden. Ich behaupte, dies bedeutet, dass es kein Kandidat für "reine" Optimierung ist. Denkst du anders? –

+1

Oh, Sie erwarten, dass der Compiler _know_ das ist "abort". Stellen Sie sich vor, Sie verwenden einen Zeiger, dem Sie "abbrechen" zugeordnet haben, wäre Ihre Erwartung dieselbe? Ich denke nicht, dass es die Funktion inspiziert, es akzeptiert es einfach als einen 'void (void)' Funktionstyp, der aufgerufen wird, der den zurückgegebenen Wert nicht beeinflusst. Letzteres hängt also nur von den Parametern ab und die Funktion ist "rein". – skypjack

Antwort

1

Dies scheint ein Fehler in gcc (oder zumindest Diskrepanz der Dokumentation und der tatsächlichen Umsetzung). Die documentation on -Wsuggest-attribute=pure lautet:

-Wsuggest-attribute=pure
-Wsuggest-attribute=const
-Wsuggest-attribute=noreturn

Warn about functions that might be candidates for attributes pure , const or noreturn . The compiler only warns for functions visible in other compilation units or (in the case of pure and const) if it cannot prove that the function returns normally. A function returns normally if it doesn't contain an infinite loop or return abnormally by throwing, calling abort or trapping. This analysis requires option -fipa-pure-const , which is enabled by default at -O and higher. Higher optimization levels improve the accuracy of the analysis.

Allerdings scheint die eigentliche Analyse die Möglichkeit, nicht-wiederkehrende Anrufe zu ignorieren, obwohl es möglich Ausnahmen respektiert:

$ cat test-noreturn.cpp 
[[noreturn]] void foo(); 

void func(int x) 
{ 
    if (x) 
     foo(); 
} 

$ g++ -std=c++11 -c -O -Wsuggest-attribute=pure test-noreturn.cpp 
$ cat test-noreturn-nothrow.cpp 
[[noreturn]] void foo() throw(); 
//      ^^^^^^^ 

void func(int x) 
{ 
    if (x) 
     foo(); 
} 
$ g++ -std=c++11 -c -O -Wsuggest-attribute=pure test-noreturn-nothrow.cpp 
test-noreturn-nothrow.cpp: In function ‘void func(int)’: 
test-noreturn-nothrow.cpp:4:6: warning: function might be candidate for attribute ‘pure’ if it is known to return normally [-Wsuggest-attribute=pure] 
void func(int x) 
    ^
+0

Ich würde es nicht ein _bug_ nennen, eher Mangel an Genauigkeit während der Analyse. Dies wird durch "wenn es bekannt ist, normal zurückzukehren" bezeichnet, was uns sagen soll, dass der Compiler bestimmte Eigenschaften über die Funktion nicht beweisen konnte, aber immer noch die Warnung ausgibt, in der Hoffnung auf das Beste. Noreturn-Funktionen sind ziemlich häufig, daher schlage ich vor, PR in [GCC BZ] (https://gcc.gnu.org/bugzilla/) darüber einzureichen. – yugr

Verwandte Themen