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

            Bug ID: 125187
           Summary: -Wstringop-overflow warning while linking {fmt} with
                    LTO
           Product: gcc
           Version: 16.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: oschonrock at gmail dot com
  Target Milestone: ---

$ uname -a
Linux athena 7.0.3-arch1-2 #1 SMP PREEMPT_DYNAMIC Fri, 01 May 2026 15:49:22
+0000 x86_64 GNU/Linux

$ gcc --version # from arch repos
gcc (GCC) 16.1.1 20260430

Because this is a linktime issue, triggered by {fmt}, I am providing a minimal
cmake project:

CMakeLists.txt
```
cmake_minimum_required(VERSION 3.16)
project(ub)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)

include(FetchContent)

FetchContent_Declare(
  fmt
  GIT_REPOSITORY https://github.com/fmtlib/fmt.git
  GIT_TAG 12.1.0
)
FetchContent_MakeAvailable(fmt)

add_executable(ub ub.cpp)
target_compile_features(ub PRIVATE cxx_std_26)
target_link_libraries(ub PRIVATE fmt)
```

ub.cpp
```
#include "fmt/core.h"

int main(int argc, [[maybe_unused]] char* argv[]) {
  fmt::println("{}", argc);
}  
```

For convenience, there is a minimal github project here:
https://github.com/oschonrock/gcc_ub_warning

To reproduce the warning:
cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build

which results in:

...
[100%] Linking CXX executable ub
/usr/bin/cmake -E cmake_link_script CMakeFiles/ub.dir/link.txt --verbose=1
/usr/bin/c++ -O3 -DNDEBUG -flto=auto -fno-fat-lto-objects
-Wl,--dependency-file=CMakeFiles/ub.dir/link.d CMakeFiles/ub.dir/ub.cpp.o -o ub
 _deps/fmt-build/libfmt.a
In function ‘write2digits’,
    inlined from ‘write_significand’ at
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h:2415:17,
    inlined from ‘write_significand’ at
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h:2407:13,
    inlined from ‘write_significand’ at
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h:2434:31,
    inlined from ‘write_significand’ at
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h:2461:20,
    inlined from ‘operator()’ at
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h:2539:33,
    inlined from ‘write_padded’ at
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h:1701:9,
    inlined from ‘write_padded’ at
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h:1710:43,
    inlined from ‘write_fixed’ at
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h:2536:44:
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h:1209:11:
warning: writing 2 bytes into a region of size 0 -Wstringop-overflow=]
 1209 |     memcpy(out, digits2(value), 2);
      |           ^
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h: In function
‘write_fixed’:
/home/oliver/Projects/ub/build/_deps/fmt-src/include/fmt/format.h:2433:8: note:
at offset [-11, -1] into destination object buffer’ of size 11
 2433 |   Char buffer[digits10<UInt>() + 2];
      |        ^

...

The resulting binary works fine - suspect false positive. 
The following gcc options are required to reproduce:
-O3 
-flto=auto

Reply via email to