[llvm] r287479 - ExceptionDemo: remove some undefined behaviour

Saleem Abdulrasool via llvm-commits llvm-commits at lists.llvm.org
Sat Nov 19 18:36:38 PST 2016


Author: compnerd
Date: Sat Nov 19 20:36:38 2016
New Revision: 287479

URL: http://llvm.org/viewvc/llvm-project?rev=287479&view=rev
Log:
ExceptionDemo: remove some undefined behaviour

The casting based reading of the LSDA could attempt to read unsuitably aligned
data.  Avoid that case by explicitly using a memcpy.  A similar approach is used
in libc++abi to address the same UB.

Modified:
    llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp

Modified: llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp?rev=287479&r1=287478&r2=287479&view=diff
==============================================================================
--- llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp (original)
+++ llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp Sat Nov 19 20:36:38 2016
@@ -219,6 +219,16 @@ static llvm::AllocaInst *createEntryBloc
 // Runtime C Library functions
 //
 
+namespace {
+template <typename Type_>
+uintptr_t ReadType(const uint8_t *&p) {
+  Type_ value;
+  memcpy(&value, p, sizeof(Type_));
+  p += sizeof(Type_);
+  return static_cast<uintptr_t>(value);
+}
+}
+
 // Note: using an extern "C" block so that static functions can be used
 extern "C" {
 
@@ -409,8 +419,7 @@ static uintptr_t readEncodedPointer(cons
   // first get value
   switch (encoding & 0x0F) {
     case llvm::dwarf::DW_EH_PE_absptr:
-      result = *((uintptr_t*)p);
-      p += sizeof(uintptr_t);
+      result = ReadType<uintptr_t>(p);
       break;
     case llvm::dwarf::DW_EH_PE_uleb128:
       result = readULEB128(&p);
@@ -420,28 +429,22 @@ static uintptr_t readEncodedPointer(cons
       result = readSLEB128(&p);
       break;
     case llvm::dwarf::DW_EH_PE_udata2:
-      result = *((uint16_t*)p);
-      p += sizeof(uint16_t);
+      result = ReadType<uint16_t>(p);
       break;
     case llvm::dwarf::DW_EH_PE_udata4:
-      result = *((uint32_t*)p);
-      p += sizeof(uint32_t);
+      result = ReadType<uint32_t>(p);
       break;
     case llvm::dwarf::DW_EH_PE_udata8:
-      result = *((uint64_t*)p);
-      p += sizeof(uint64_t);
+      result = ReadType<uint64_t>(p);
       break;
     case llvm::dwarf::DW_EH_PE_sdata2:
-      result = *((int16_t*)p);
-      p += sizeof(int16_t);
+      result = ReadType<int16_t>(p);
       break;
     case llvm::dwarf::DW_EH_PE_sdata4:
-      result = *((int32_t*)p);
-      p += sizeof(int32_t);
+      result = ReadType<int32_t>(p);
       break;
     case llvm::dwarf::DW_EH_PE_sdata8:
-      result = *((int64_t*)p);
-      p += sizeof(int64_t);
+      result = ReadType<int64_t>(p);
       break;
     default:
       // not supported




More information about the llvm-commits mailing list