In case GitHub goes away, minimal repro is:
#include <boost/multiprecision/cpp_int.hpp>
using BigInt = boost::multiprecision::cpp_int;
BigInt calcm(unsigned ls) {
return BigInt(1) << ls;
}
docker run -it --rm -v $(pwd):/data ubuntu:24.04
apt update
apt -y install libboost-dev g++
cd /data
g++ -O0 -fdiagnostics-color=always -Wall -Wextra -Wno-overloaded-virtual \
-Wno-deprecated -Wno-deprecated-declarations -pedantic -O3 -DNDEBUG \
-Wall -Wextra -Wno-overloaded-virtual -Wno-deprecated \
-Wno-deprecated-declarations -pedantic -Werror -Wall -Wextra -Wswitch-enum \
-std=gnu++20 \
-c -o repro repro.cpp
Failure mode:
inlined from 'BigInt calcm(size_t, size_t)' at repro.cpp:46:24,
inlined from 'void f(S*, S*)' at repro.cpp:51:36:
/usr/include/boost/multiprecision/cpp_int/bitwise.hpp:441:26: error:
iteration 2305843009213693951 invokes undefined behavior
[-Werror=aggressive-loop-optimizations]
441 | pr[rs - 1 - i] = pr[rs - 1 - i - offset] << shift;
| ~~^
/usr/include/boost/multiprecision/cpp_int/bitwise.hpp:439:18: note: within
this loop
439 | for (; rs - i >= 2 + offset; ++i)
| ~~~~~~~^~~~~~~~~~~~~
Fix:
include/boost/multiprecision/cpp_int/bitwise.hpp
@@ -436,7 +436,7 @@ inline BOOST_MP_CXX14_CONSTEXPR void
left_shift_generic(Int& result, double_limb
++i;
}
}
- for (; rs - i >= static_cast<std::size_t>(static_cast<std::size_t>(2u) +
offset); ++i)
+ for (; static_cast<std::ptrdiff_t>(static_cast<std::ptrdiff_t>(rs) -
static_cast<std::ptrdiff_t>(i)) >= static_cast<std::ptrdiff_t>(2 +
static_cast<std::ptrdiff_t>(offset)); ++i)
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2122352
Title:
Noble/1.83: compile error re: undefined behavior (fix available)
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/boost-defaults/+bug/2122352/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs