public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer
@ 2020-08-24 12:25 kndevl at outlook dot com
2020-08-24 12:33 ` [Bug libstdc++/96766] " kndevl at outlook dot com
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: kndevl at outlook dot com @ 2020-08-24 12:25 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96766
Bug ID: 96766
Summary: std::swap(std::variant, std::variant) triggers
undefined behavior sanitizer
Product: gcc
Version: 10.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: kndevl at outlook dot com
Target Milestone: ---
Created attachment 49113
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=49113&action=edit
preprocessed source
This snippet
```
#include <variant>
class Foo {
};
class Bar {
};
using T = std::variant<Foo, Bar>;
int main()
{
T t1 { Foo {} };
T t2 { Bar {} };
std::swap(t1, t2);
return 0;
}
```
triggers the following warning
```
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/variant:444:20:
runtime error: implicit conversion from type 'std::size_t' (aka 'unsigned
long') of value 18446744073709551615 (64-bit, unsigned) to type
'std::__detail::__variant::_Variant_storage<true, Foo, Bar>::__index_type' (aka
'unsigned char') changed the value to 255 (8-bit, unsigned)
#0 0x55c00ff464ea in std::__detail::__variant::_Variant_storage<true, Foo,
Bar>::_M_reset()
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/variant:444
#1 0x55c00ff476a4 in void std::__detail::__variant::_Move_ctor_base<true,
Foo, Bar>::_M_destructive_move<Bar>(unsigned short, Bar&&)
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/variant:564
#2 0x55c00ff472fb in auto std::variant<Foo, Bar>::swap(std::variant<Foo,
Bar>&)::{lambda(auto:1&&, auto:2)#1}::operator()<Bar&,
std::integral_constant<unsigned long, 1ul> >(Bar&,
std::integral_constant<unsigned long, 1ul>)
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/variant:1588
#3 0x55c00ff4701e in void std::__invoke_impl<void, std::variant<Foo,
Bar>::swap(std::variant<Foo, Bar>&)::{lambda(auto:1&&, auto:2)#1}, Bar&,
std::integral_constant<unsigned long, 1ul> >(std::__invoke_other,
std::variant<Foo, Bar>::swap(std::variant<Foo, Bar>&)::{lambda(auto:1&&,
auto:2)#1}&&, Bar&, std::integral_constant<unsigned long, 1ul>&&)
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/bits/invoke.h:60
#4 0x55c00ff46e3f in std::__invoke_result<std::variant<Foo,
Bar>::swap(std::variant<Foo, Bar>&)::{lambda(auto:1&&, auto:2)#1}, Bar&,
std::integral_constant<unsigned long, 1ul> >::type
std::__invoke<std::variant<Foo, Bar>::swap(std::variant<Foo,
Bar>&)::{lambda(auto:1&&, auto:2)#1}, Bar&, std::integral_constant<unsigned
long, 1ul> >(std::variant<Foo, Bar>::swap(std::variant<Foo,
Bar>&)::{lambda(auto:1&&, auto:2)#1}&&, (std::__invoke_result&&)...)
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/bits/invoke.h:95
#5 0x55c00ff458e3 in
std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<std::__detail::__variant::__variant_idx_cookie
(*)(std::variant<Foo, Bar>::swap(std::variant<Foo, Bar>&)::{lambda(auto:1&&,
auto:2)#1}&&, std::variant<Foo, Bar>&)>, std::integer_sequence<unsigned long,
1ul> >::__visit_invoke(std::variant<Foo, Bar>::swap(std::variant<Foo,
Bar>&)::{lambda(auto:1&&, auto:2)#1}, std::variant<Foo, Bar>&)
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/variant:1001
#6 0x55c00ff4537c in decltype(auto)
std::__do_visit<std::__detail::__variant::__variant_idx_cookie,
std::variant<Foo, Bar>::swap(std::variant<Foo, Bar>&)::{lambda(auto:1&&,
auto:2)#1}, std::variant<Foo, Bar>&>(std::variant<Foo,
Bar>::swap(std::variant<Foo, Bar>&)::{lambda(auto:1&&, auto:2)#1}&&,
std::variant<Foo, Bar>&)
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/variant:1694
#7 0x55c00ff45188 in void
std::__detail::__variant::__raw_idx_visit<std::variant<Foo,
Bar>::swap(std::variant<Foo, Bar>&)::{lambda(auto:1&&, auto:2)#1},
std::variant<Foo, Bar>&>(std::variant<Foo, Bar>::swap(std::variant<Foo,
Bar>&)::{lambda(auto:1&&, auto:2)#1}&&, std::variant<Foo, Bar>&)
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/variant:201
#8 0x55c00ff4505a in std::variant<Foo, Bar>::swap(std::variant<Foo, Bar>&)
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/variant:1570
#9 0x55c00ff44451 in std::enable_if<(((is_move_constructible_v<Foo,
Bar>)&&...))&&(((is_swappable_v<Foo, Bar>)&&...)), void>::type std::swap<Foo,
Bar>(std::variant<Foo, Bar>&, std::variant<Foo, Bar>&)
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/variant:1240
#10 0x55c00ff44278 in main ../ubsan.cpp:14
#11 0x7f7f64b19151 in __libc_start_main (/usr/lib/libc.so.6+0x28151)
#12 0x55c00ff4414d in _start
(/home/user/main/cmake-build-debug-clang/ubsan-test+0x514d)
```
Is this a bug in libstdc++ or clang's sanitizer?
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug libstdc++/96766] std::swap(std::variant, std::variant) triggers undefined behavior sanitizer
2020-08-24 12:25 [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer kndevl at outlook dot com
@ 2020-08-24 12:33 ` kndevl at outlook dot com
2020-08-24 12:43 ` redi at gcc dot gnu.org
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: kndevl at outlook dot com @ 2020-08-24 12:33 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96766
--- Comment #1 from Karthik Nishanth <kndevl at outlook dot com> ---
Reproducer
https://www.godbolt.org/z/Whz6ab
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug libstdc++/96766] std::swap(std::variant, std::variant) triggers undefined behavior sanitizer
2020-08-24 12:25 [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer kndevl at outlook dot com
2020-08-24 12:33 ` [Bug libstdc++/96766] " kndevl at outlook dot com
@ 2020-08-24 12:43 ` redi at gcc dot gnu.org
2020-08-24 12:49 ` redi at gcc dot gnu.org
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: redi at gcc dot gnu.org @ 2020-08-24 12:43 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96766
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
This is clang's stupid "unsigned overflow" sanitizer, which complains about
correct code. The conversion here is intended, and does exactly the right
thing, converting numeric_limits<size_t>::max() to numeric_limits<unsigned
char>::max().
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug libstdc++/96766] std::swap(std::variant, std::variant) triggers undefined behavior sanitizer
2020-08-24 12:25 [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer kndevl at outlook dot com
2020-08-24 12:33 ` [Bug libstdc++/96766] " kndevl at outlook dot com
2020-08-24 12:43 ` redi at gcc dot gnu.org
@ 2020-08-24 12:49 ` redi at gcc dot gnu.org
2020-08-24 15:15 ` cvs-commit at gcc dot gnu.org
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: redi at gcc dot gnu.org @ 2020-08-24 12:49 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96766
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |redi at gcc dot gnu.org
Ever confirmed|0 |1
Last reconfirmed| |2020-08-24
Status|UNCONFIRMED |ASSIGNED
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
I'll use static_cast to suppress the bogus errors.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug libstdc++/96766] std::swap(std::variant, std::variant) triggers undefined behavior sanitizer
2020-08-24 12:25 [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer kndevl at outlook dot com
` (2 preceding siblings ...)
2020-08-24 12:49 ` redi at gcc dot gnu.org
@ 2020-08-24 15:15 ` cvs-commit at gcc dot gnu.org
2020-08-26 12:54 ` cvs-commit at gcc dot gnu.org
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2020-08-24 15:15 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96766
--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>:
https://gcc.gnu.org/g:074436cf8cdd2a9ce75cadd36deb8301f00e55b9
commit r11-2822-g074436cf8cdd2a9ce75cadd36deb8301f00e55b9
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Mon Aug 24 16:10:07 2020 +0100
libstdc++: Make variant_npos conversions explicit [PR 96766]
libstdc++-v3/ChangeLog:
PR libstdc++/96766
* include/std/variant (_Variant_storage): Replace implicit
conversions from size_t to __index_type with explicit casts.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug libstdc++/96766] std::swap(std::variant, std::variant) triggers undefined behavior sanitizer
2020-08-24 12:25 [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer kndevl at outlook dot com
` (3 preceding siblings ...)
2020-08-24 15:15 ` cvs-commit at gcc dot gnu.org
@ 2020-08-26 12:54 ` cvs-commit at gcc dot gnu.org
2020-08-26 12:58 ` cvs-commit at gcc dot gnu.org
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2020-08-26 12:54 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96766
--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-10 branch has been updated by Jonathan Wakely
<redi@gcc.gnu.org>:
https://gcc.gnu.org/g:4b6366f24890e25a07f9a045d15633c5b1fb80cb
commit r10-8675-g4b6366f24890e25a07f9a045d15633c5b1fb80cb
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Mon Aug 24 16:10:07 2020 +0100
libstdc++: Make variant_npos conversions explicit [PR 96766]
libstdc++-v3/ChangeLog:
PR libstdc++/96766
* include/std/variant (_Variant_storage): Replace implicit
conversions from size_t to __index_type with explicit casts.
(cherry picked from commit 074436cf8cdd2a9ce75cadd36deb8301f00e55b9)
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug libstdc++/96766] std::swap(std::variant, std::variant) triggers undefined behavior sanitizer
2020-08-24 12:25 [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer kndevl at outlook dot com
` (4 preceding siblings ...)
2020-08-26 12:54 ` cvs-commit at gcc dot gnu.org
@ 2020-08-26 12:58 ` cvs-commit at gcc dot gnu.org
2020-08-26 13:00 ` redi at gcc dot gnu.org
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2020-08-26 12:58 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96766
--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-9 branch has been updated by Jonathan Wakely
<redi@gcc.gnu.org>:
https://gcc.gnu.org/g:9def04578cca8a0850e835eb095d9ff60097f691
commit r9-8832-g9def04578cca8a0850e835eb095d9ff60097f691
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Mon Aug 24 16:10:07 2020 +0100
libstdc++: Make variant_npos conversions explicit [PR 96766]
libstdc++-v3/ChangeLog:
PR libstdc++/96766
* include/std/variant (_Variant_storage): Replace implicit
conversions from size_t to __index_type with explicit casts.
(cherry picked from commit 074436cf8cdd2a9ce75cadd36deb8301f00e55b9)
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug libstdc++/96766] std::swap(std::variant, std::variant) triggers undefined behavior sanitizer
2020-08-24 12:25 [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer kndevl at outlook dot com
` (5 preceding siblings ...)
2020-08-26 12:58 ` cvs-commit at gcc dot gnu.org
@ 2020-08-26 13:00 ` redi at gcc dot gnu.org
2022-07-19 13:56 ` cvs-commit at gcc dot gnu.org
2022-07-21 11:16 ` cvs-commit at gcc dot gnu.org
8 siblings, 0 replies; 10+ messages in thread
From: redi at gcc dot gnu.org @ 2020-08-26 13:00 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96766
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target Milestone|--- |9.4
Resolution|--- |FIXED
Status|ASSIGNED |RESOLVED
--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Fixed for 9.4 and 10.3, but I'm not going to bother changing it on the gcc-8
branch.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug libstdc++/96766] std::swap(std::variant, std::variant) triggers undefined behavior sanitizer
2020-08-24 12:25 [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer kndevl at outlook dot com
` (6 preceding siblings ...)
2020-08-26 13:00 ` redi at gcc dot gnu.org
@ 2022-07-19 13:56 ` cvs-commit at gcc dot gnu.org
2022-07-21 11:16 ` cvs-commit at gcc dot gnu.org
8 siblings, 0 replies; 10+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2022-07-19 13:56 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96766
--- Comment #8 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>:
https://gcc.gnu.org/g:20ab3972240aff596a3fa98e9fb09ddc0658fbb3
commit r13-1749-g20ab3972240aff596a3fa98e9fb09ddc0658fbb3
Author: Marco Falke <falke.marco@gmail.com>
Date: Tue Jul 19 10:10:39 2022 +0100
libstdc++: Make __from_chars_alnum_to_val conversion explicit
The optimizations from commit r12-8175-ga54137c88061c7 introduced a
clang integer sanitizer error.
Fix this with an explicit static_cast, similar to the fix for PR 96766.
libstdc++-v3/ChangeLog:
* include/std/charconv (__from_chars_alnum_to_val): Replace
implicit conversion from int to unsigned char with explicit
cast.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug libstdc++/96766] std::swap(std::variant, std::variant) triggers undefined behavior sanitizer
2020-08-24 12:25 [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer kndevl at outlook dot com
` (7 preceding siblings ...)
2022-07-19 13:56 ` cvs-commit at gcc dot gnu.org
@ 2022-07-21 11:16 ` cvs-commit at gcc dot gnu.org
8 siblings, 0 replies; 10+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2022-07-21 11:16 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96766
--- Comment #9 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-12 branch has been updated by Jonathan Wakely
<redi@gcc.gnu.org>:
https://gcc.gnu.org/g:0bb30f94ace6be68bd315d03f36b24bbaec2bee7
commit r12-8591-g0bb30f94ace6be68bd315d03f36b24bbaec2bee7
Author: Marco Falke <falke.marco@gmail.com>
Date: Tue Jul 19 10:10:39 2022 +0100
libstdc++: Make __from_chars_alnum_to_val conversion explicit
The optimizations from commit r12-8175-ga54137c88061c7 introduced a
clang integer sanitizer error.
Fix this with an explicit static_cast, similar to the fix for PR 96766.
libstdc++-v3/ChangeLog:
* include/std/charconv (__from_chars_alnum_to_val): Replace
implicit conversion from int to unsigned char with explicit
cast.
(cherry picked from commit 20ab3972240aff596a3fa98e9fb09ddc0658fbb3)
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2022-07-21 11:16 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-24 12:25 [Bug libstdc++/96766] New: std::swap(std::variant, std::variant) triggers undefined behavior sanitizer kndevl at outlook dot com
2020-08-24 12:33 ` [Bug libstdc++/96766] " kndevl at outlook dot com
2020-08-24 12:43 ` redi at gcc dot gnu.org
2020-08-24 12:49 ` redi at gcc dot gnu.org
2020-08-24 15:15 ` cvs-commit at gcc dot gnu.org
2020-08-26 12:54 ` cvs-commit at gcc dot gnu.org
2020-08-26 12:58 ` cvs-commit at gcc dot gnu.org
2020-08-26 13:00 ` redi at gcc dot gnu.org
2022-07-19 13:56 ` cvs-commit at gcc dot gnu.org
2022-07-21 11:16 ` cvs-commit 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).