[llvm-bugs] [Bug 43590] New: Compilation and run time failure with UBSan std::filesystem libstdc++fs

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Oct 7 07:21:56 PDT 2019


https://bugs.llvm.org/show_bug.cgi?id=43590

            Bug ID: 43590
           Summary: Compilation and run time failure with UBSan
                    std::filesystem libstdc++fs
           Product: clang
           Version: 8.0
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: -New Bugs
          Assignee: unassignedclangbugs at nondot.org
          Reporter: vakevk at gmail.com
                CC: htmldeveloper at gmail.com, llvm-bugs at lists.llvm.org,
                    neeilans at live.com, richard-llvm at metafoo.co.uk

Arch Linux

$ clang++ --version
clang version 8.0.1 (tags/RELEASE_801/final)
Target: x86_64-pc-linux-gnu

$ g++ --version
g++ (GCC) 9.2.0

---

#include <filesystem>

int main()
{
  std::filesystem::recursive_directory_iterator iterator{"."};
  // Without this line the error is not triggered.
  for (const auto& _: iterator) {}
}

---

This program compiles correctly with

$ clang++ -std=c++17 -lstdc++fs -fsanitize=undefined main.cpp

but it reports an error when running:

$ ./a.out
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/bits/shared_ptr_base.h:737:11:
runtime error: member call on address 0x563f879b8f20 which does not point to an
object of type 'std::_Sp_counted_base<__gnu_cxx::_S_atomic>'
0x563f879b8f20: note: object is of type
'std::_Sp_counted_ptr_inplace<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack,
std::allocator<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack>,
(__gnu_cxx::_Lock_policy)2>'
 00 00 00 00  38 ca 25 4b 3c 7f 00 00  01 00 00 00 01 00 00 00  90 8f 9b 87 3f
56 00 00  08 00 00 00
              ^~~~~~~~~~~~~~~~~~~~~~~
              vptr for
'std::_Sp_counted_ptr_inplace<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack,
std::allocator<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack>,
(__gnu_cxx::_Lock_policy)2>'
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/bits/shared_ptr_base.h:139:43:
runtime error: member access within address 0x563f879b8f20 which does not point
to an object of type 'std::_Sp_counted_base<__gnu_cxx::_S_atomic>'
0x563f879b8f20: note: object is of type
'std::_Sp_counted_ptr_inplace<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack,
std::allocator<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack>,
(__gnu_cxx::_Lock_policy)2>'
 00 00 00 00  38 ca 25 4b 3c 7f 00 00  01 00 00 00 01 00 00 00  90 8f 9b 87 3f
56 00 00  08 00 00 00
              ^~~~~~~~~~~~~~~~~~~~~~~
              vptr for
'std::_Sp_counted_ptr_inplace<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack,
std::allocator<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack>,
(__gnu_cxx::_Lock_policy)2>'

--

If -O1 or higher is specified then it does not compile:

$ clang++ -std=c++17 -lstdc++fs -fsanitize=undefined -O1 main.cpp
/usr/bin/ld: /tmp/main-72a5a0.o: in function
`std::filesystem::__cxx11::recursive_directory_iterator::recursive_directory_iterator(std::filesystem::__cxx11::recursive_directory_iterator&&)':
main.cpp:(.text._ZNSt10filesystem7__cxx1128recursive_directory_iteratorC2EOS1_[_ZNSt10filesystem7__cxx1128recursive_directory_iteratorC2EOS1_]+0x2d):
undefined reference to
`std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack,
(__gnu_cxx::_Lock_policy)2>::__shared_ptr(std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack,
(__gnu_cxx::_Lock_policy)2>&&)'

With verbose:
$ clang++ -std=c++17 -lstdc++fs -fsanitize=undefined -O1 -v main.cpp
clang version 8.0.1 (tags/RELEASE_801/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/9.2.0
Found candidate GCC installation:
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/9.2.0
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
 "/usr/bin/clang-8" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -disable-free
-disable-llvm-verifier -discard-value-names -main-file-name main.cpp
-mrelocation-model pic -pic-level 2 -pic-is-pie -mthread-model posix
-fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables
-fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb
-momit-leaf-frame-pointer -v -resource-dir /usr/lib/clang/8.0.1
-internal-isystem
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0
-internal-isystem
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/x86_64-pc-linux-gnu
-internal-isystem
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/backward
-internal-isystem /usr/local/include -internal-isystem
/usr/lib/clang/8.0.1/include -internal-externc-isystem /include
-internal-externc-isystem /usr/include -O1 -std=c++17 -fdeprecated-macro
-fdebug-compilation-dir /home/lvk/temp2 -ferror-limit 19 -fmessage-length 133
-fsanitize=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,float-divide-by-zero,function,integer-divide-by-zero,nonnull-attribute,null,object-size,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,signed-integer-overflow,unreachable,vla-bound,vptr
-fsanitize-recover=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,float-divide-by-zero,function,integer-divide-by-zero,nonnull-attribute,null,object-size,pointer-overflow,returns-nonnull-attribute,shift-base,shift-exponent,signed-integer-overflow,vla-bound,vptr
-stack-protector 2 -fobjc-runtime=gcc -fcxx-exceptions -fexceptions
-fdiagnostics-show-option -fcolor-diagnostics -o /tmp/main-98288d.o -x c++
main.cpp -faddrsig
clang -cc1 version 8.0.1 based upon LLVM 8.0.1 default target
x86_64-pc-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0

/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/x86_64-pc-linux-gnu

/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/backward
 /usr/local/include
 /usr/lib/clang/8.0.1/include
 /usr/include
End of search list.
 "/usr/bin/ld" -pie --eh-frame-hdr -m elf_x86_64 -dynamic-linker
/lib64/ld-linux-x86-64.so.2 -o a.out
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib64/Scrt1.o
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib64/crti.o
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/crtbeginS.o
-L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0
-L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib64
-L/usr/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64
-L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../.. -L/usr/bin/../lib
-L/lib -L/usr/lib --whole-archive
/usr/lib/clang/8.0.1/lib/linux/libclang_rt.ubsan_standalone-x86_64.a
--no-whole-archive
--dynamic-list=/usr/lib/clang/8.0.1/lib/linux/libclang_rt.ubsan_standalone-x86_64.a.syms
--whole-archive
/usr/lib/clang/8.0.1/lib/linux/libclang_rt.ubsan_standalone_cxx-x86_64.a
--no-whole-archive
--dynamic-list=/usr/lib/clang/8.0.1/lib/linux/libclang_rt.ubsan_standalone_cxx-x86_64.a.syms
-lstdc++fs /tmp/main-98288d.o -lstdc++ -lm --no-as-needed -lpthread -lrt -lm
-ldl -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/crtendS.o
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib64/crtn.o
/usr/bin/ld: /tmp/main-98288d.o: in function
`std::filesystem::__cxx11::recursive_directory_iterator::recursive_directory_iterator(std::filesystem::__cxx11::recursive_directory_iterator&&)':
main.cpp:(.text._ZNSt10filesystem7__cxx1128recursive_directory_iteratorC2EOS1_[_ZNSt10filesystem7__cxx1128recursive_directory_iteratorC2EOS1_]+0x2d):
undefined reference to
`std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack,
(__gnu_cxx::_Lock_policy)2>::__shared_ptr(std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack,
(__gnu_cxx::_Lock_policy)2>&&)'

--

It is unclear to me whether this is a libstdc++ problem or a clang problem.
With g++ all examples compile and run without error. Successful compilation
without -O1 but failure with certainly seems like a bug.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20191007/cfdd3a77/attachment-0001.html>


More information about the llvm-bugs mailing list