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

            Bug ID: 78183
           Summary: Silence warnings about alternate forms of custom
                    format specifiers
           Product: gcc
           Version: 5.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: drazen.kacar at tereo dot hr
  Target Milestone: ---

Glibc allows writing custom printf format conversions, so I've implemented a
conversion which takes char * and prints the string with all non-printable
characters in \xxx notation. This is very useful for printing debugging
output (I'm currently writing a lot of unit tests) and logging.

However, if I register it with unused conversion specifier (eg. %W) then gcc
produces a warning. This has already been reported in bug 47781, but doesn't
look like it will be resolved soon.

Another option is to use %s and implement my version as an alternate form,
so it would be used with the %#s specifier. Then the compiler would now how to
check arguments without any code modifications. However, if I do this gcc
warns about '#' flag being used with %s.

For example (function which implements conversion not shown):

prompt> tail -17 myprintf.c 
int
main()
{
    char *str = "burek\r\n";

    printf("Before registering: %#s\n", str);
    if(register_printf_specifier ('s', str_log, str_log_arginfo))
    {
        fputs("Cannot register %s specifier", stderr);
        exit(1);
    }

    printf("%s\n", str);
    printf("%#s\n", str);

    return 0;
}

prompt> gcc -o myprintf myprintf.c
myprintf.c: In function 'main':
myprintf.c:94:12: warning: '#' flag used with '%s' gnu_printf format
[-Wformat=]
     printf("Before registering: %#s\n", str);
            ^
myprintf.c:102:12: warning: '#' flag used with '%s' gnu_printf format
[-Wformat=]
     printf("%#s\n", str);
            ^

prompt> ./myprintf 
Before registering: burek

burek

burek\r\n

=== End example ===

While we're waiting for the full implementation of the problem from bug 47781
would it be possible to implement something that would silence warnings for
alternate forms which aren't specified by a standard?

I can see two approaches:
a) Don't produce warning about this by default and introduce a compiler flag to
turn it on.
b) Introduce another compiler flag (eg. -Wno-format-alt-flag) which would
silence this specific warning.

I tried to find command line option which would disable specific warning
identified by a number or a name, but couldn't find it.

Reply via email to