https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86260

            Bug ID: 86260
           Summary: [8/9 Regression] incorrect -Wformat-truncation warning
           Product: gcc
           Version: 8.1.0
            Status: UNCONFIRMED
          Keywords: diagnostic
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
                CC: dimhen at gmail dot com, msebor at gcc dot gnu.org
  Target Milestone: ---
                CC: dimhen at gmail dot com

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct octet_string {
    char *data;
    size_t length;
};

static int time2generalizedtime(time_t t, struct octet_string *s, int gtimep)
{
     struct tm *tm = NULL;
     const size_t len = gtimep ? 15 : 13;

     s->data = malloc(len + 1);
     if (s->data == NULL)
         return ENOMEM;
     s->length = len;

     tm = gmtime(&t);

     if (gtimep)
         snprintf (s->data, len + 1, "%04d%02d%02d%02d%02d%02dZ",
                 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
                 tm->tm_hour, tm->tm_min, tm->tm_sec);
     else
         snprintf (s->data, len + 1, "%02d%02d%02d%02d%02d%02dZ",
                 tm->tm_year % 100, tm->tm_mon + 1, tm->tm_mday,
                 tm->tm_hour, tm->tm_min, tm->tm_sec);

     return 0;
}

int main(void)
{
    struct octet_string data;
    time_t now = time(0);
    int rc;

    rc = time2generalizedtime(now, &data, 0);
    if (rc != 0) {
        return 1;
    }

    return 0;
}


prints (also with -O2 or -O3):

gcc -O -Wall -Werror=format-truncation gcc_snprintf.c
gcc_snprintf.c: In function ‘main’:
gcc_snprintf.c:28:47: error: ‘%02d’ directive output may be truncated writing
between 2 and 11 bytes into a region of size between 0 and 10
[-Werror=format-truncation=] 
          snprintf (s->data, len + 1, "%02d%02d%02d%02d%02d%02dZ",
                                               ^~~~
gcc_snprintf.c:28:10: note: ‘snprintf’ output between 14 and 60 bytes into a
destination of size 14                                                          
          snprintf (s->data, len + 1, "%02d%02d%02d%02d%02d%02dZ",
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                  tm->tm_year % 100, tm->tm_mon + 1, tm->tm_mday,
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                  tm->tm_hour, tm->tm_min, tm->tm_sec);
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors

I don't really see how this can print 60 bytes as the integers are limited.

Reply via email to