2015-12-16 17 views
21

渡された引数が常にNULLの場合、time_t time(time_t *t)関数はエラーを返すことはできますか?time(NULL)が失敗を返すことはありますか?

コールがtime(NULL)の場合、戻り値を確認する必要がありますか?

文書化されている唯一のエラーコードは、ポインタが無効であることに関連するEFAULTです。

+0

@ user3159253いくつかのジャンク値に対して、 'time((time_t *)junk)'の場合はEFAULTを返すことができます。 EFAULTを返すことができる時点で、私はすでにプログラムの動作が失われたと考えています。 – user2864740

+0

* some *ジャンク品です。問題は疑問に思えますが、私は弁護士に餌をあげましょう。 – user2864740

+0

@ user3159253よく知られていることとは何の関係もありませんが(他の意味の中でも非常に現実的な選択でした)それは機能契約に成文化されていればどんな価値(**)であってもかまいませんでした。 – user2864740

答えて

22

はい。エポックは、time_t型のオブジェクトに収まらないので

[EOVERFLOW]秒数:

時間()関数は次の場合に失敗することがありますtimeは文書場合失敗する可能性があります。

出典:http://pubs.opengroup.org/onlinepubs/9699919799/functions/time.html

が、これは約22年で、やいなや、およびない64ビットシステムまたは64ビットtime_tを利用、32ビットのもので、実際に起こらないことを期待しています。

また、任意のの存在は例を失敗する可能性が不合格ならない彼らの存在は、深刻な品質の-実装欠陥だろうけれどもまた、実装定義のエラーが可能になります。

EFAULTは、プログラムに未定義の動作がある場合にのみ発生するため、問題のない/存在しません。

これにもかかわらず、現実世界ではtimeは実際には失敗しません。

+0

これはposixにとっては問題ありませんが、文書化された内容は標準Cではありません。 – Peter

+4

@Peter:質問はposixタグが付けられています。 –

+1

およびC、R.これは一方には適用可能ですが、他方には適用されません。したがって、私のコメント。 – Peter

3

(POSIX劣化モードの機能を考慮していない)

ユニットは、独立したシステム上でオフにしたとき、基本となるリアルタイムクロックサブシステムは、クロック・インテグリティ(バッテリー)の損失のようなハードウェア障害を持っていた場合、リターン確かにtime()の値は(time_t) -1になります。その場合、それはtime_t*で渡されたものは何の違いもありません。

4

私はRHEL、SLES、UBTUをチェックしました。 time_t time(time_t *t)機能がこれまでに返すことができます元の質問に

  • Q0を行く、とにかく

    time() returns the time since the Epoch (00:00:00 UTC, January 1, 1970), measured in seconds. 
    
    If t is non-NULL, the return value is also stored in the memory pointed to by t. 
    

    man 2 pageは同じ(関連する)ものを生み出します渡された引数が常にNULLの場合は失敗しますか?

    • A/R0はい、いくつかの非常に特別なイベントがそうで(フルメモリー、および発生した場合には、...)
  • Q1呼び出しは時間(NULL)の場合、我々はまだ、戻り値をチェックする必要がありますか?

    • A/R1:実際の答えは "NO" である、あなたがする必要はありません。関数が関連するものを返すことができるという事実は、別の話です。結局のところ、なぜそれをする必要がない場合、funcを呼び出すのですか?
  • Q2のみ文書エラー・コードは、ポインタが無効であることに関係する、EFAULTあります。

    • 無効なコードとは何も関係ありません。 NULLを渡していると言ったように、問題はありません。 C規格で
4

"カレンダー時間が使用できない" 場合は、time()(time_t)(-1)を返すことができます。たとえば、1999年の標準では、7.23.2.4節、パラ3に記載されています。

この文言は具体的ではありませんが、エラー状態を示すことをお勧めします。恐らく実装はシステムクロックにアクセスできない場合、(time_t)(-1)を返す可能性があります。

Rの答えはposix仕様の場合について説明しています。

+0

昔、VMSでは、システムクロックは現地時間であった。遅くまで、OSがタイムゾーンをサポートしたときまで、time()は常に-1を返しました。 – richardb

5

時間(NULL)が失敗を返すことはありますか?

番号Cの標準

C11と言う:7.27.2.4:

時間関数は、現在のカレンダー時間に実装の最良の近似値を返します。カレンダー時間が使用できない場合、値(time_t)(-1)が戻されます。

+5

'(time_t)( - 1)'は、時間情報が取り出せない場合、ある意味で「最良の近似」であると推測します...エラー条件として扱われない場合、この近似がどれほど有用であるかは議論の余地があります。 – Thomas

+1

Downvoter、説明してくれませんか? – haccks

関連する問題