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

--- Comment #3 from Dmitry G. Dyachenko <dimhen at gmail dot com> ---
I see smth may be similar starts at r265648 / PR87041

265647 NO warnings
265648 warnings
270581 warnings

$ cat x.cpp
#include <cstdio>
#include <vector>

extern void extf(char*);

extern unsigned U1;
extern unsigned U2;

void foo()
{
    if(U1 == 0)
        return;
    if(U2 == 0)
        return;

    std::vector<char> N1(U1);
    extf(&N1[0]);

    std::vector<char> N2(U2);
    extf(&N2[0]);

    printf("%s = %s\n", &N1[0], &N2[0]); // warning
}

void foo_i(unsigned i)
{
    if(i == 0)
        return;
    if(U2 == 0)
        return;

    std::vector<char> N1(i);
    extf(&N1[0]);

    std::vector<char> N2(U2);
    extf(&N2[0]);

    printf("%s = %s\n", &N1[0], &N2[0]); // warning
}

void foo_j(unsigned j)
{
    if(U1 == 0)
        return;
    if(j == 0)
        return;

    std::vector<char> N1(U1);
    extf(&N1[0]);

    std::vector<char> N2(j);
    extf(&N2[0]);

    printf("%s = %s\n", &N1[0], &N2[0]); // NO warning
}

void foo_2(unsigned i, unsigned j)
{
    if(i == 0)
        return;
    if(j == 0)
        return;

    std::vector<char> N1(i);
    extf(&N1[0]);

    std::vector<char> N2(j);
    extf(&N2[0]);

    printf("%s = %s\n", &N1[0], &N2[0]);  // NO warning
}

$ g++ -O2 -Wall -Werror -c x.cpp
x.cpp: In function ‘void foo()’:
x.cpp:22:11: error: ‘%s’ directive argument is null [-Werror=format-overflow=]
   22 |     printf("%s = %s\n", &N1[0], &N2[0]); // warning
      |     ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
x.cpp: In function ‘void foo_i(unsigned int)’:
x.cpp:38:11: error: ‘%s’ directive argument is null [-Werror=format-overflow=]
   38 |     printf("%s = %s\n", &N1[0], &N2[0]); // warning
      |     ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Reply via email to