2015-12-16 20 views
21

Czy funkcja time_t time(time_t *t) może kiedykolwiek zwrócić błąd, jeśli przekazywany argument ma zawsze wartość NULL?Czy czas (NULL) może kiedykolwiek zwrócić błąd?

Jeśli połączenie ma numer time(NULL), czy nadal musimy sprawdzić, czy zwracana jest wartość?

Jedyny udokumentowany kod błędu to EFAULT, który odnosi się do wskaźnika będącego nieprawidłowym.

+0

@ user3159253 Może zwrócić EFAULT w przypadku 'time ((time_t *) junk)', dla pewnej wartości śmieci. Chociaż w momencie, w którym można wrócić do EFAULT, już uważam, że zachowanie programów zostało utracone. – user2864740

+0

Za * niektóre * śmieci. Pytanie wydaje się dyskusyjne, ale ... dajcie radę prawnikom. – user2864740

+0

@ user3159253 Nie ma nic wspólnego z byciem dobrze znanym (chociaż to czyniło go bardzo praktycznym wyborem spośród innych implikacji); mogła to być dowolna wartość (**), gdyby została skodyfikowana w umowie o funkcję. – user2864740

Odpowiedz

22

Tak. time ma udokumentowane może nie sprawy:

funkcji czasu() może wystąpić:

[EOVERFLOW] Liczba sekund od Epoki nie mieści się w obiekcie typu time_t.

Źródło: http://pubs.opengroup.org/onlinepubs/9699919799/functions/time.html

Spodziewajcie się to zdarzyć w praktyce w ciągu około 22 lat, nie wcześniej, a nie na systemach 64-bitowych i 32-bitowych te, które wykorzystują 64-bitowy time_t.

Również obecność jakiejkolwiek omieszkam lub może nie przypadków pozwala również na błędy implementacji zdefiniowane, choć ich istnienie byłoby poważnym jakość-of-realizacji wada.

EFAULT nie jest problemem/nie istnieje, ponieważ dzieje się tylko wtedy, gdy program ma niezdefiniowane zachowanie.

Mimo wszystko, w realnym świecie, time właściwie nie zawodzi.

+0

To jest dobre dla posix, ale specyfikacje udokumentowane nie są standardowe C. – Peter

+4

@Peter: Pytanie jest oznaczone posix. –

+1

I C, R. Ma on zastosowanie do jednej, ale nie drugiej. Stąd mój komentarz. – Peter

3

(nie rozważyć POSIX funkcjonalność w trybie awaryjnym)

Jeśli podstawowa zegar czasu rzeczywistego podsystem miał awarię sprzętową jak utrata integralności zegara (akumulator), gdy urządzenie było wyłączone na niezależny system, powrót wartość time() może z pewnością być (time_t) -1. W tym przypadku nie ma znaczenia, co było przekazane w time_t*.

4

Sprawdziłem na RHEL, SLES i UBTU; man 2 page daje te same (istotne) rzeczy:

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. 

W każdym razie, wracając do pierwotnego pytania

  • Q0: Czy time_t time(time_t *t) funkcja kiedykolwiek wrócimy błąd, jeśli przekazywana argumentacja ma zawsze wartość NULL?

    • A/R0: Tak, jeśli niektóre bardzo szczególne zdarzenia (pamięć pełna, i tak dalej ...)
  • Q1: Jeśli połączenie jest czas (NULL), czy nadal musimy sprawdzić wartość zwracana?

    • A/R1: rzeczywista odpowiedź brzmi "NIE", nie trzeba; fakt, że func może zwrócić coś istotnego, to inna historia. W końcu dlaczego dzwonisz do func, jeśli nie ma takiej potrzeby?
  • Q2: Jedynym udokumentowany kod błędu EFAULT, który odnosi się do wskaźnika jest nieprawidłowy.

    • Nie masz nic wspólnego z błędnymi kodami; jak powiedziałeś, mijasz NULL, więc nie ma problemu.
4

W standardzie C time() może powrócić (time_t)(-1) jeśli „czas kalendarza nie są dostępne”. Na przykład w standardzie z 1999 r., Który jest w sekcji 7.23.2.4, pkt 3.

Chociaż to sformułowanie jest mniej szczegółowe, sugerowałbym, że jest to warunek błędu. Prawdopodobnie implementacja może zwrócić (time_t)(-1), jeśli nie może uzyskać dostępu do zegara systemowego, nie może sensownie interpretować otrzymywanych danych, itp.

Odpowiedź R opisuje, jak wygląda specyfikacja posix.

+0

Dawno temu, na VMS, zegar systemowy był w czasie lokalnym. Dopóki znacznie później, gdy OS uzyskał wsparcie strefy czasowej, time() zawsze zwracał -1. – richardb

5

Czy czas (NULL) może kiedykolwiek zwrócić błąd?

nr C norma mówi że

C11: 7.27.2.4:

Funkcja zwraca czas najlepsze przybliżenie wdrożenia do aktualnego czasu kalendarzowego. Wartość (time_t)(-1) jest zwracana, jeśli czas kalendarza jest niedostępny.

+5

Przypuszczam, że '(time_t) (- 1)' jest w pewnym sensie "najlepszym przybliżeniem", jeśli nie można uzyskać informacji o czasie ... chociaż jest dyskusyjne, jak użyteczne jest to przybliżenie w praktyce, jeśli nie jest traktowane jako warunek błędu. – Thomas

+1

Dół, staraj się wyjaśnić? – haccks

Powiązane problemy