重複の可能性:
Noreturn 属性のポイントは何ですか?
C11 では、関数が返されないことを示す_Noreturn属性が導入されました。
ソース コードのドキュメントの価値を除いて、この属性には他にどのような利点がありますか? また、なぜそれを使用するのでしょうか?
重複の可能性:
Noreturn 属性のポイントは何ですか?
C11 では、関数が返されないことを示す_Noreturn属性が導入されました。
ソース コードのドキュメントの価値を除いて、この属性には他にどのような利点がありますか? また、なぜそれを使用するのでしょうか?
関数が無条件に関数を呼び出す場合_Noreturn
、コンパイラは次のことを理解できます。
次のコードはデッドコードであり、最適化(生成されたバイナリから削除できます)と診断を可能にします。コンパイラは「到達不能コード」警告を発することができます。
最も重要なことは、関数からの通常のフローが中断されていることを知っていると、戻り値の欠落や初期化されていない変数などに関する誤った警告を回避できることです。
die
これは静的コードアナライザーでは特に重要です-関数(致命的なエラーをログに記録してアプリケーションを終了する)をとしてマークすると、CLang静的アナライザーによって提供される大きなアプリケーションでの誤検知の数が大幅に減少しましnoreturn
た。
他の最適化も利用できる可能性があります-関数は決して返さないので、スタックにリターンアドレスをプッシュしたり、レジスタの状態を保存したりする必要はありません。必要なのは、引数を渡してjmp
最初に実行することだけです。リターンとリターン後のクリーンアップを気にせずに、関数の。ただし、もちろん、呼び出しは1回限りであるため、ここでスクイーズするパフォーマンスはほとんど無視できます。
__attribute__((noreturn))
または次_Noreturn
のような関数に役立ちますdie()
:
static __attribute__((noreturn)) void die(const char *fmt, ...) {
/* print a formatted error message and exit */
exit(EXIT_FAILURE);
}
/* And let's say in main() you would want to exit because of an error but unforunately GCC complains about return value. */
int main()
{
if (!whatever)
die("a nasty error message goes here\n");
}
また、前述のように最適化にも使用されます。
これにより、コンパイラーが追加の最適化を行うことができます。ここnoreturn
で、しばらくの間サポートされているGCCの属性を見てください(セマンティクスはおそらく同じです)