<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Compilation and run time failure with UBSan std::filesystem libstdc++fs"
   href="https://bugs.llvm.org/show_bug.cgi?id=43590">43590</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Compilation and run time failure with UBSan std::filesystem libstdc++fs
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>8.0
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>-New Bugs
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>vakevk@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>htmldeveloper@gmail.com, llvm-bugs@lists.llvm.org, neeilans@live.com, richard-llvm@metafoo.co.uk
          </td>
        </tr></table>
      <p>
        <div>
        <pre>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.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>