2016-12-08 5 views
0
$ cd glibc-2.23 
$ grep -ErI --include='*.c' '= *f?put([cs]|char)\>' |wc -l 
1 
$ grep -ErI --include='*.c' '[^= ] *f?put([cs]|char)\>' |wc -l 
1764 

$ man putc 
... 
RETURN VALUE 
    fputc(), putc() and putchar() return the character written 
    as an unsigned char cast to an int or EOF on error. 

は、おそらくそれはのputcharの先行と後続のものは成功しない間1または2がunnoticeably失敗のシーケンスに例えばその「十分に可能性は低い」とは?
少なくとも99.9999%の実装では、単に「return suchandsuch」というステートメントがないかもしれません。
または、すべてのバイト(putchar、putc、fputcの場合)の後にエラーチェックを続行すると、パフォーマンスが低下する可能性がありますか?putc、fputc、puts、fputs、putchar(そして多分printf)関数の戻り値を決してチェックする人はいません。どうして?

+0

関連する:http://softwareengineering.stackexchange.com/questions/302730/should-one-check-for-every-little-error-in-c – Downvoter

+0

私は、それが組み合わされていると言っています。それは迷惑ですが、エラーは非常に起こりにくく、「処理できないエラーはチェックしないでください」。しかし、私はそれがパフォーマンスだとは思わない。書き込みエラーをチェックしたい場合や、個々の 'putc'呼び出しがたくさんある場合は、それらのいくつかの戻りエラーをチェックすれば十分ですが、すべてをチェックする必要はありません。 –

+0

Cについての良い質問ですが、私はスタックオーバーフローに関する良い答えに基づいてあまりにも意見としてそれを参照してください。他のSEサイトがどんなものになるかは不明です。 – chux

答えて

1

関数からの戻り値を無視することは、ソフトウェアの多くの見つけにくいバグの原因です。 「誰も」が戻り値をチェックしているという記述は正しくありません。信頼性の高いソフトウェアシステムが戻り値をチェックします。

0

これは、いくつかの理由から無視されることがよくあります。第一に、ほとんどのシステムでは、ほとんどの人が気にしないほど十分に遠隔地にいる可能性があります。

第2に、それらが失敗すると、とにかくあなたがそれをやり遂げることはほとんどできないからです。OSがファイルへの書き込みに失敗した場合、メッセージをユーザに表示するなどの通常の反応および/またはエラーのロギングも簡単に失敗する可能性があります。

最後に、ほとんどの場合、問題をかなり単純化することができます。I/Oを実行し、fcloseが成功したかどうかのエラーチェックのみを行います。ファイルが失敗した状態になった場合は、fcloseが失敗することが予想されるため、以前に(I/Oを行ったときに)エラーをキャッチするのは通常は最適化のみです - 同じ問題を検出できるのはfcloseです問題が検出された後にファイルを書き込む無駄な試みに時間を浪費することがあります。

fcloseからの返信を確認しても、公平にですが、上記と同じ問題があります。システムが失敗した場合、失敗に反応するほとんどの試みも失敗する可能性はかなり高いです。

それでも意味がある場合があります。たとえば、ある場所から別の場所にファイルを移動することを検討してください(ネットワーク経由など)。ソースファイルを削除する前に、宛先にデータを正常に書き込んだことを確認する必要があります。この場合、fcloseからの戻り値を確認することは、コピーが失敗した場合にユーザーのファイルを破壊する可能性を減らすための非常に簡単な方法です。

関連する問題