public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/114379] New: stringop-overflow warning on C++ code with -O2 (or -O1 -fexpensive-optimizations)
@ 2024-03-18 13:37 denilsonsa at gmail dot com
  2024-03-18 14:35 ` [Bug c++/114379] " rguenth at gcc dot gnu.org
  2024-03-18 15:01 ` redi at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: denilsonsa at gmail dot com @ 2024-03-18 13:37 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 114379
           Summary: stringop-overflow warning on C++ code with -O2 (or -O1
                    -fexpensive-optimizations)
           Product: gcc
           Version: 13.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: denilsonsa at gmail dot com
  Target Milestone: ---

Created attachment 57724
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=57724&action=edit
The preprocessed C++ file (foo.ii), generated from the c++ source-code in the
description.

There are almost 100 open bug reports related to stringop-overflow. It's very
likely this bug report over here is a duplicate to one of those. In fact, many
of those are likely duplicates as well. Someone needs to trial them and close
the duplicates.
https://gcc.gnu.org/bugzilla/buglist.cgi?quicksearch=stringop-overflow

Meanwhile, over here… Let me describe the bug.

This bug was originally found when trying to compile
obs-advanced-scene-switcher version 1.25.3 on Manjaro Linux. It fails
compilation.

* https://github.com/WarmUpTill/SceneSwitcher
* https://aur.archlinux.org/packages/obs-advanced-scene-switcher#comment-961879

I also found other projects that also faced this bug and decided to just
disable that warning.

* https://github.com/ClickHouse/ClickHouse/issues/10508
* https://github.com/oneapi-src/oneTBB/issues/843
*
https://github.com/falcosecurity/libs/pull/952/commits/0b689250555e27dd71554a27dfa0346ddb6a26e1

Then I did some investigation and wrote down a minimal testcase. It's a very
trimmed-down version of the source-code of obs-advanced-scene-switcher. It's
enough to trigger the compiler warning/error depending on the compiler flags.

```
#include <atomic>
#include <deque>
#include <memory>
#include <string>

class ActionQueue {
        public:
                void Stop() {
                        _stop = true;
                }
        protected:
                std::string _name = "";
        private:
                std::atomic_bool _stop = {false};
};

static std::deque<std::shared_ptr<ActionQueue>> queues;

int main(int argc, char *argv[])
{
        for (auto &queue : queues) {
                auto actionQueue =
                        std::dynamic_pointer_cast<ActionQueue>(queue);
                actionQueue->Stop();
        }
        return 0;
}
```

It compiles fine with:

    g++ -v foo.cpp -o foo -O1 -Wall -Werror=stringop-overflow

But it fails to compile with:

    g++ -v foo.cpp -o foo -O1 -Wall -Werror=stringop-overflow
-fexpensive-optimizations
    g++ -v foo.cpp -o foo -O2 -Wall -Werror=stringop-overflow

With this error:

```
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure
--enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++
--enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib
--mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://bugs.archlinux.org/ --with-build-config=bootstrap-lto
--with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit
--enable-cet=auto --enable-checking=release --enable-clocale=gnu
--enable-default-pie --enable-default-ssp --enable-gnu-indirect-function
--enable-gnu-unique-object --enable-libstdcxx-backtrace
--enable-link-serialization=1 --enable-linker-build-id --enable-lto
--enable-multilib --enable-plugin --enable-shared --enable-threads=posix
--disable-libssp --disable-libstdcxx-pch --disable-werror
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.2.1 20230801 (GCC) 
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'foo' '-O1' '-Wall'
'-Werror=stringop-overflow' '-fexpensive-optimizations' '-shared-libgcc'
'-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/cc1plus -E -quiet -v -D_GNU_SOURCE
foo.cpp -mtune=generic -march=x86-64 -Wall -Werror=stringop-overflow
-fexpensive-optimizations -O1 -fpch-preprocess -o foo.ii
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../x86_64-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../include/c++/13.2.1

/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../include/c++/13.2.1/x86_64-pc-linux-gnu

/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../include/c++/13.2.1/backward
 /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/include
 /usr/local/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/include-fixed
 /usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'foo' '-O1' '-Wall'
'-Werror=stringop-overflow' '-fexpensive-optimizations' '-shared-libgcc'
'-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/cc1plus -fpreprocessed foo.ii -quiet
-dumpbase foo.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -O1 -Wall
-Werror=stringop-overflow -version -fexpensive-optimizations -o foo.s
GNU C++17 (GCC) version 13.2.1 20230801 (x86_64-pc-linux-gnu)
        compiled by GNU C version 13.2.1 20230801, GMP version 6.3.0, MPFR
version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: f089b864c6bcbc2427e9850aa6414a11
In file included from /usr/include/c++/13.2.1/atomic:41,
                 from foo.cpp:1:
In member function ‘void std::__atomic_base<_IntTp>::store(__int_type,
std::memory_order) [with _ITp = bool]’,
    inlined from ‘std::__atomic_base<_IntTp>::__int_type
std::__atomic_base<_IntTp>::operator=(__int_type) [with _ITp = bool]’ at
/usr/include/c++/13.2.1/bits/atomic_base.h:373:7,
    inlined from ‘bool std::atomic<bool>::operator=(bool)’ at
/usr/include/c++/13.2.1/atomic:80:31,
    inlined from ‘void ActionQueue::Stop()’ at foo.cpp:9:10,
    inlined from ‘int main(int, char**)’ at foo.cpp:24:20:
/usr/include/c++/13.2.1/bits/atomic_base.h:481:25: error: ‘void
__atomic_store_1(volatile void*, unsigned char, int)’ writing 1 byte into a
region of size 0 overflows the destination [-Werror=stringop-overflow=]
  481 |         __atomic_store_n(&_M_i, __i, int(__m));
      |         ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
In function ‘int main(int, char**)’:
cc1plus: note: destination object is likely at address zero
cc1plus: some warnings being treated as errors
```

The system is x86_64 Manjaro Linux. I have not tested other versions of GCC.
Given the amount of related bug reports, I'm gonna assume this bug has been
around for a while.

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

* [Bug c++/114379] stringop-overflow warning on C++ code with -O2 (or -O1 -fexpensive-optimizations)
  2024-03-18 13:37 [Bug c++/114379] New: stringop-overflow warning on C++ code with -O2 (or -O1 -fexpensive-optimizations) denilsonsa at gmail dot com
@ 2024-03-18 14:35 ` rguenth at gcc dot gnu.org
  2024-03-18 15:01 ` redi at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: rguenth at gcc dot gnu.org @ 2024-03-18 14:35 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic
             Blocks|                            |88443

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
The diagnostic hints at jump threading producing an access to nullptr.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88443
[Bug 88443] [meta-bug] bogus/missing -Wstringop-overflow warnings

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

* [Bug c++/114379] stringop-overflow warning on C++ code with -O2 (or -O1 -fexpensive-optimizations)
  2024-03-18 13:37 [Bug c++/114379] New: stringop-overflow warning on C++ code with -O2 (or -O1 -fexpensive-optimizations) denilsonsa at gmail dot com
  2024-03-18 14:35 ` [Bug c++/114379] " rguenth at gcc dot gnu.org
@ 2024-03-18 15:01 ` redi at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: redi at gcc dot gnu.org @ 2024-03-18 15:01 UTC (permalink / raw)
  To: gcc-bugs

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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2024-03-18
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #1)
> The diagnostic hints at jump threading producing an access to nullptr.

Yes, I saw this happening with std::atomic recently too - I can't remember if I
still have the code to reproduce it.

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

end of thread, other threads:[~2024-03-18 15:01 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-18 13:37 [Bug c++/114379] New: stringop-overflow warning on C++ code with -O2 (or -O1 -fexpensive-optimizations) denilsonsa at gmail dot com
2024-03-18 14:35 ` [Bug c++/114379] " rguenth at gcc dot gnu.org
2024-03-18 15:01 ` redi 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).