私は、使用されているライブラリ関数のほとんどがエラー時に-1を返し、errnoをに設定したプログラムを書いています。プログラムの動作は、エラーが発生した場合に終了するようなものです。正確な出口点とプログラム(gdb
を使用する例)外部からの誤差を決定するために、私は次のメソッドを使用します:errnoを常に正と仮定するのは安全ですか?
err = func_1(..arglist_1..);
if(err != 0)
{
perror("func(..arglist..)");
return ((1u << 8) | errno);
}
//..
//.. some more funcs
//..
err = func_n(..arglist_n..);
if(err != 0)
{
perror("func(..arglist_n..)");
return (((unsigned)n << 8) | errno);
}
をここでの問題は安全な仮定です。
現実:のerrnoが常に正である:のerrnoの値は常に未満255
仮定2:errnoにはextern int errno;
errno.h
内部仮定1として宣言されます。
errno.h
で定義されているすべてのエラー定数(EAGAINなど)に基づいて、これらの仮定は現在真です。これらは将来も真実であると仮定できますか?
P .:私はperror()
に依存して終了点を決定したくありません。
私はいずれかの仮定が安全であると疑う。第2のものについては、あなたは '0'が肯定的であると考えますか? – jxh
IEEE Std 1003.1-2001のこの機能では、機能は設定されません(このリンクはここでは「0」を除いていません)(http://pubs.opengroup.org/onlinepubs/009695399/functions/errno.html) errnoを0に設定してください。 –
標準ライブラリの関数が '0'に設定していないということは、他の誰かが' 0'に設定していないということではありません。いくつかの標準ライブラリ関数では、呼び出しが失敗したかどうかを判断する唯一の方法は、最初に 'errno'を' 0'にセットし、次に関数が何をするかを調べることです。 – jxh