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