localtime () отключен примерно на 460000 лет на RTL8710 - PullRequest
0 голосов
/ 24 ноября 2018

Я использую RTL8710 (работает rustl8710 , но это не имеет отношения к этому вопросу, так как весь код, о котором я говорю, - это C-код).RTL8710 имеет проприетарные библиотеки для некоторых частей системы, включая localtime.

Однако localtime кажется отключенным примерно на 460 000 лет при его использовании таким образом (взято из включенного NTPреализация ):

long current_sec = 1543067026;
struct tm current_tm = *(localtime(&current_sec));

Возвращает следующую структуру:

{tm_sec = 51, 
 tm_min = 36, 
 tm_hour = 15, 
 tm_mday = 25, 
 tm_mon = 8, 
 tm_year = -458682, 
 tm_wday = 2, 
 tm_yday = 267, 
 tm_isdst = -1515870811}

Очевидно, что это неправильно, должно быть что-то близкое к 24 ноября 2018 13:52:04 по Гринвичу.Это не случайно, потому что время, кажется, всегда различается примерно на 2 часа и несколько минут.

Единственное, что заслуживает внимания, это то, что код использует системные заголовки по умолчанию time.h и string.h (чтобудет из Ubuntu 18.10, 64bit в моем случае).

Я понятия не имею, что на самом деле использует библиотека stdlib RealTek, но, судя по информации отладки (newlib/libc/time/lcltime.c), я бы предположил, что это (измененный?) версия newlib.

1 Ответ

0 голосов
/ 24 ноября 2018

Код использует неправильный тип, что приводит к неопределенному поведению. 1

// long current_sec = 1543067026;
time_t current_sec = 1543067026;
struct tm current_tm = *(localtime(&current_sec));

Лучший код будет проверять возвращаемое значение localtime() перед тем, как отменить его обращение.

struct tm *p = localtime(&current_sec);
if (p) {
  struct tm current_tm = *p;
  ...

1 Неправильная ширина шрифта подтверждается следующим.

int main() {
  long current_sec = 1543067026;
  struct tm current_tm = { .tm_sec = 51, .tm_min = 36, .tm_hour = 15, //
      .tm_mday = 25, .tm_mon = 8, .tm_year = -458682, //
      .tm_wday = 2, .tm_yday = 267, .tm_isdst = -1515870811 };

  time_t t = mktime(&current_tm);
  printf("%16lx\n%16llx\n", current_sec, (unsigned long long) t);
}

Выход

        5bf95592
fffff2d55bf9a9f3
        ^^^^

Много битов выстраиваются в линию.Я подозреваю, что старшая разность битов была связана с тем, что на local_time() ссылаются ненужные биты, а меньшая разность битов из-за экстремальных вычислений, несинхронизированной записи кода OP и предполагаемого вывода или разницы между стандартной библиотекой my и OP.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * time_t, но без зоны, разница часовых поясов my и OP вносит вклад в locatime()/mktime() разницу.

...