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

            Bug ID: 26739
           Summary: clang does not remove FDEs for zero-sized functions
                    which breaks exceptions
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: normal
          Priority: P
         Component: Common Code Generator Code
          Assignee: unassignedb...@nondot.org
          Reporter: egor.koche...@intel.com
                CC: llvm-bugs@lists.llvm.org
    Classification: Unclassified

Currently clang produces no assembly code for non-void functions without any
code inside (if using at least -O1). Definitely, calling such functions is UB
in C++, but this also has some side effects. In particular, these functions'
address range is zero that sometimes breaks exception handling.

Supposed solution is: remove FDE for the functions that are shrunk to zero
length. The details and rationale are below.

Consider the following source:

int f() {}
int main () {
  try {
    throw 1;
    return 1;
  } catch (int) {
    return 0;
  }
  return 2;
}

When the exception is thrown, then the runtime unwinder looks for the correct
stack frame information (FDE), and actually finds two of these: for the
function f and for main, both starting at the same address. Since normally no
two functions share the same starting address, only one of these FDEs is used,
and if we are unlucky, the unwinder chooses the FDE for the function f and the
exception misses the 'catch'.

The real test case which is broken because of this is here:
https://android.googlesource.com/platform/ndk/+/master/tests/device/test-stlport_static-exception/jni/dyncast2_1.cpp.
It is broken if using clang++ with gold linker, stlport c++ library statically
linked, and the unwinder from libgcc.a

Supposed solution is: remove FDE for the functions that are shrunk to zero
length since such functions can actually never throw an exception and need no
stack unwinding information.

To see the issue reproduced, you can compile the source above using 'clang++
-c' and examine the result with 'readelf -wf'. There will be a potentially
faulty entry with 'pc=00000000..00000000' followed by the entry for 'main' with
the same starting address.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to