[Bug libstdc++/66017] New: Undefined behaviour in std::set<long long>
public at hansmi dot ch
gcc-bugzilla@gcc.gnu.org
Tue May 5 12:04:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66017
Bug ID: 66017
Summary: Undefined behaviour in std::set<long long>
Product: gcc
Version: 5.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: public at hansmi dot ch
Target Milestone: ---
Created attachment 35463
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=35463&action=edit
Test program and output after building with Clang 3.6 (using GCC toolchain
5.1.0)
When building for Linux x86 (Debian 8 (Jessie), 32 bit) using `long long' as
std::set's value type causes UBSan as included in Clang 3.5 and 3.6 to report
an downcast/upcast of a misaligned address at runtime and ASan to report
undefined behaviour, all of them in _Rb_tree.
The simplest example I could find:
---
#include <set>
int main(int, char **)
{
std::set<long long> foo {1LL};
}
---
std::set::begin, std::set::end, set::set::empty cause reports too.
This is not reproducible when compiling with GCC 5.1.0 (with the same options
sans those specific to Clang) and neither when building for x86-64 with either
compiler.
Reproduced using:
- Clang 3.5 w/ GCC toolchain 4.9
- Clang 3.6 w/ GCC toolchain 4.9
- Clang 3.6 w/ GCC toolchain 5.1.0
Shorter value types for std::set, e.g. `long' or `char', work. Packaging the
`long long' in another type, e.g. a struct, works too. The issue does not occur
with libc++.
Bug 60734 reported something similar, though there seem to be more issues. I'm
uncertain as to whether it's an issue in _Rb_tree, __aligned_buffer or another
place altogether.
Original report at LLVM/Clang: https://llvm.org/bugs/show_bug.cgi?id=23413
More information about the Gcc-bugs
mailing list