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