[llvm-bugs] [Bug 45948] New: Extend clang to link C code with C++ libraries, that are compiled with -fsanitize=undefined

via llvm-bugs llvm-bugs at lists.llvm.org
Fri May 15 12:42:17 PDT 2020


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

            Bug ID: 45948
           Summary: Extend clang to link C code with C++ libraries, that
                    are compiled with -fsanitize=undefined
           Product: compiler-rt
           Version: 10.0
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: ubsan
          Assignee: unassignedbugs at nondot.org
          Reporter: dilyan.palauzov at aegee.org
                CC: llvm-bugs at lists.llvm.org

I create a file d.cpp:

  struct D {
    bool d;
  };

  struct E : virtual D {
    int e;
  };

  extern "C" {
    void f();
  }

  void f() {
    D g = E();
  };

and compile it with clang 10.0
$  clang++ -fsanitize=undefined -shared -fpic -o libd.so d.cpp

Then I create a file h.c:
  void f();
  int main() {
    f();
    return 0;
  }
and compile it with:
$  clang -fsanitize=undefined -L. -ld h.c
/usr/local/bin/ld: ./libd.so: undefined reference to `__ubsan_vptr_type_cache'
/usr/local/bin/ld: ./libd.so: undefined reference to
`__ubsan_handle_dynamic_type_cache_miss'
clang-10: error: linker command failed with exit code 1 (use -v to see
invocation)

If I use instead
$ clang -fsanitize=undefined -L. -ld h.c -lubsan
then it magically works.  But libubsan is from gcc, sometimes does not contain
the symbols that clang emits and UBSAN is not supposed to work this way.

If I take instead j.cpp:
  extern "C" {
    void f();
  }

  int main() {
    f();
    return 0;
  }

then
$ clang++ -fsanitize=undefined -L. -ld j.cpp
does work.  If I put in h.c the f() declarition withing extern "C" {}, then
$ clang++ -fsanitize=undefined -L. -ld h.c
clang-10: warning: treating 'c' input as 'c++' when in C++ mode, this behavior
is deprecated [-Wdeprecated]

works somehow.

If I use:
$ clang -fsanitize=undefined -c -o h.o h.c 
$ clang++ -fsanitize=undefined h.o -L. -ld -o h
then it also works, but build tools do not know that they cannot short-circuit
to
$ clang -fsanitize=undefined -o h -L. -ld h.c 

https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#usage says for
Clang 11 (I use 10):  “Use clang++ to compile and link your program with
-fsanitize=undefined flag. … You can use clang instead of clang++ if you’re
compiling/linking C code.”

Now, I am compiling C code, but linking it with C++ code. There are real-world
use cases: ICU and WebKIT are in C++, but can be used from C code.  So to
verify the whole linking C code using clang, with C++ libraries must also work.

See also https://sourceware.org/bugzilla/show_bug.cgi?id=25940 .

⇒ Enhance `clang -fsanitize=undefined -ld` to link with the d-library, even
when that library is in C++ and was compiled with `clang++
-fsanitize=undefined`.

-- 
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/20200515/8f060a20/attachment.html>


More information about the llvm-bugs mailing list