public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/114178] New: incorrect -Wstringop-overflow with freestanding + placement new w/ initialization + no sse
@ 2024-02-29 22:04 evan.teran at gmail dot com
  2024-02-29 22:18 ` [Bug tree-optimization/114178] incorrect -Wstringop-overflow with freestanding + " pinskia at gcc dot gnu.org
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: evan.teran at gmail dot com @ 2024-02-29 22:04 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 114178
           Summary: incorrect -Wstringop-overflow with freestanding +
                    placement new w/ initialization + no sse
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: evan.teran at gmail dot com
  Target Milestone: ---

Created attachment 57580
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=57580&action=edit
dockerized example of the issue for both gcc 12 and gcc 13

This seems to be circumstantial, so I'll try to explain with as much detail as
I can. I have a personal OS project which I use c++ to develop for. Starting
with gcc-12 and gcc-13 I started getting an warnings triggered by
`-Wstringop-overflow`, which is a bit frustrating since I prefer to compile
with `-Werror`.

After spending some time narrowing it down, it boils down to this code
triggering the warning:

```
template <class T>
void dont_optimize_away(T &&value) {
        asm volatile("" : "+r"(value));
}

int foo() {
        auto contents = new char[128]();

        dont_optimize_away(contents);

        delete[] contents;
        return 0;
}

```

As you can see, there really isn't much code here get wrong!

Compiling this file with the following flags results in the warning:

```
-std=c++17           # benign
-O3                  # required for issue
-march=x86-64        # benign
-ffreestanding       # required for issue
-Wstringop-overflow  # the warning in question
-mno-red-zone        # benign (somewhat required for osdev)

-mno-avx             # OS dev typically disables things like SSE and similar
-mno-avx2 
-mno-mmx 
-mno-sse 
-mno-sse2 
-mno-sse3 
-mno-sse4 
-mno-sse4.1 
-mno-sse4.2 
-mno-sse4a 
-mno-ssse3 
```

Here's where it gets confusing/interesting:

1. if I change `auto contents = new char[128]();` to `auto contents = new
char[128];` then i don't get the warning. Presumably, the issue is triggered by
the initialization of the array being created.

2. if I remove `-ffreestanding`, the warning goes away

3. if I remove `-mno-mmx`, the warning goes away

4. if I remove BOTH `-mno-sse` and `-mno-sse2`, the warning goes away

5. different combinations of the `-mno-xxxx` flags result in slight differences
to the warnings.

It seems to me, that with this setup, the compiler is emitting something
comparable to a memset to initialize the array and is highly unrolling it.
Something about this code with these flags is triggering the warning.

I don't know if the emitted code is legitimately reaching outside the bounds of
the buffer, or if warning is just getting confused.

I will be attaching a dockerized example of the issue which can be run by
simply  untarring and running `./build.sh`

Thanks

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-02-29 23:15 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-29 22:04 [Bug c++/114178] New: incorrect -Wstringop-overflow with freestanding + placement new w/ initialization + no sse evan.teran at gmail dot com
2024-02-29 22:18 ` [Bug tree-optimization/114178] incorrect -Wstringop-overflow with freestanding + " pinskia at gcc dot gnu.org
2024-02-29 22:18 ` pinskia at gcc dot gnu.org
2024-02-29 22:20 ` pinskia at gcc dot gnu.org
2024-02-29 23:03 ` evan.teran at gmail dot com
2024-02-29 23:15 ` pinskia at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).