Вот программа:
#include <stdio.h>
#include <libgen.h>
#include <stdlib.h>
#include <time.h>
#define DATE_SIZE 10
// Declare global variables.
char *program_name = NULL;
int main (int argc, char *argv[])
{
// Declare variables.
time_t t = time(NULL);
struct tm tm = *localtime(&t);
char date[DATE_SIZE + 1] = {0};
// Store today's date in a string for comparison.
if(sprintf(date, "%d/%d/%d", tm.tm_mon + 1, tm.tm_mday, tm.tm_year - 100) < 0)
{
fprintf(stderr, "%s: main error: sprintf failed.\n", program_name);
exit(EXIT_FAILURE);
}
// Print date to user.
printf("Date: %s\n", date);
// Exit gracefully.
exit(EXIT_SUCCESS);
}
Что компилируется со следующим:
gcc -Wall -Werror -O3 -o program program.c
У меня также есть 2 машины под управлением Arch linux :
Ноутбук Linux 4.15.7-1-ARCH # 1 ПРЕДСТАВЛЕНИЕ SMP Ср 28 февраля 19:01:57 UTC 2018
x86_64 GNU / Linux
Хранилище Linux 4.14.66-1-ARCH # 1 SMP Сб 25 августа 01:09:50 UTC 2018
armv6l GNU / Linux
Когда я компилирую на своем ноутбуке, он чистый и работает отлично. Когда я компилирую на своем сервере хранения, я получаю следующую ошибку:
program.c: In function 'main':
program.c:20:5: error: '/' directive writing 1 byte into a region of size between 0 and 10 [-Werror=format-overflow=]
if(sprintf(date, "%d/%d/%d", tm.tm_mon + 1, tm.tm_mday, tm.tm_year - 100) < 0)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
program.c:20:5: note: directive argument in the range [-2147483648, 2147483547]
program.c:20:5: note: 'sprintf' output between 6 and 36 bytes into a destination of size 11
cc1: all warnings being treated as errors
Почему есть разница?
UPDATE
Кажется, все комментарии касаются того, как исправить ошибку. Прежде всего, вы должны знать, что это свернутая программа. Дата, которую я создаю, сравнивается с другой, которую я не создал. Отсюда и формат мм / дд / гг. Кроме того, большинство функций, для которых в имени есть «n» (strncpy, snprintf ...), предназначены для случаев, когда вы не знаете данные или они создаются пользователем. Я смотрю на это как на ленивое программирование, потому что вы не знаете о данных, с которыми работаете. Кроме того, я точно знаю, что эта программа не будет использоваться в течение 82 лет.
Нет, мой вопрос касается разницы в результатах компиляции.