Переполнение буфера строки, вызванное asctime () в C - PullRequest
0 голосов
/ 22 декабря 2019

Я хочу распечатать время в C, используя asctime(), но когда распечатывается текст, случайные символы добавляются после timeString. Кроме того, текст syslog(), распечатанный в файле журнала, отличается от текста, напечатанного в оболочке, на printf(). Под кодом я предоставил точный вывод с обоих выходов. Как мне избавиться от этого поведения? Код работает на RaspberryPi, и я вошел в систему через терминал MacOS по умолчанию.

  time_t rawTime;
  time(&rawTime);
  struct tm timeInfo = *gmtime(&rawTime);

  // ...

  char *log;
  char *timeString = strdup(asctime(&timeInfo));

  asprintf(&log, "UTC: %s %.*s Last status: %s. New status: %s.", 
           timeString, 5, "     ", "Hello", "World");

  openlog("httpd-status-notifier", LOG_PID, LOG_USER);
  syslog(logLevel, "%s", log);

  printf("%s\n", log);

  // ...

Syslog:

Dec 22 17:18:17 rasp httpd-status-notifier[25458]: UTC: Sun Dec 22 17:18:17 2019#012 Last status: Hello. New status: World.

(Здесь syslog производит #012)


Оболочка (printf) :

UTC: Sun Dec 22 17:18:17 2019 Last status: Hello. New status: World.

(Здесь printf производит новый символ строки)


Кстати, да, я заметил, что syslog уже регистрирует дату.

...