summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Language/ObjC
diff options
context:
space:
mode:
authorEnrico Granata <egranata@apple.com>2016-05-25 23:19:01 +0000
committerEnrico Granata <egranata@apple.com>2016-05-25 23:19:01 +0000
commitfee0aba00626744bd099cb4872f02379808fae2b (patch)
tree48631d0e9eed8b36b45e20c0bd64f87d05d5d8c5 /lldb/source/Plugins/Language/ObjC
parent5d122f872d5bb9164ae58eb5f79bbed2ede3f605 (diff)
downloadbcm5719-llvm-fee0aba00626744bd099cb4872f02379808fae2b.tar.gz
bcm5719-llvm-fee0aba00626744bd099cb4872f02379808fae2b.zip
It has been brought to my attention that, given two variables
T x; U y; doing x = *((T*)y) is undefined behavior, even if sizeof(T) == sizeof(U), due to pointer aliasing rules Fix up a couple of places in LLDB that were doing this, and transform them into a defined and safe memcpy() operation Also, add a test case to ensure we didn't regress by doing this w.r.t. tagged pointer NSDate instances llvm-svn: 270793
Diffstat (limited to 'lldb/source/Plugins/Language/ObjC')
-rw-r--r--lldb/source/Plugins/Language/ObjC/Cocoa.cpp14
1 files changed, 8 insertions, 6 deletions
diff --git a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp
index 10ac4c6ce52..017c46ee3bb 100644
--- a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp
+++ b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp
@@ -536,7 +536,8 @@ lldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream&
uint32_t flt_as_int = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error);
if (error.Fail())
return false;
- float flt_value = *((float*)&flt_as_int);
+ float flt_value = 0.0f;
+ memcpy(&flt_value, &flt_as_int, sizeof(flt_as_int));
NSNumber_FormatFloat(valobj, stream, flt_value, options.GetLanguage());
break;
}
@@ -545,7 +546,8 @@ lldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream&
uint64_t dbl_as_lng = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error);
if (error.Fail())
return false;
- double dbl_value = *((double*)&dbl_as_lng);
+ double dbl_value = 0.0;
+ memcpy(&dbl_value, &dbl_as_lng, sizeof(dbl_as_lng));
NSNumber_FormatDouble(valobj, stream, dbl_value, options.GetLanguage());
break;
}
@@ -666,7 +668,7 @@ lldb_private::formatters::NSDateSummaryProvider (ValueObject& valobj, Stream& st
if (descriptor->GetTaggedPointerInfo(&info_bits,&value_bits))
{
date_value_bits = ((value_bits << 8) | (info_bits << 4));
- date_value = *((double*)&date_value_bits);
+ memcpy(&date_value, &date_value_bits, sizeof(date_value_bits));
}
else
{
@@ -674,7 +676,7 @@ lldb_private::formatters::NSDateSummaryProvider (ValueObject& valobj, Stream& st
uint32_t delta = (triple.isWatchOS() && triple.isWatchABI()) ? 8 : ptr_size;
Error error;
date_value_bits = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+delta, 8, 0, error);
- date_value = *((double*)&date_value_bits);
+ memcpy(&date_value, &date_value_bits, sizeof(date_value_bits));
if (error.Fail())
return false;
}
@@ -683,7 +685,7 @@ lldb_private::formatters::NSDateSummaryProvider (ValueObject& valobj, Stream& st
{
Error error;
date_value_bits = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+2*ptr_size, 8, 0, error);
- date_value = *((double*)&date_value_bits);
+ memcpy(&date_value, &date_value_bits, sizeof(date_value_bits));
if (error.Fail())
return false;
}
@@ -940,7 +942,7 @@ lldb_private::formatters::GetOSXEpoch ()
tm_epoch.tm_min = 0;
tm_epoch.tm_mon = 0;
tm_epoch.tm_mday = 1;
- tm_epoch.tm_year = 2001-1900; // for some reason, we need to subtract 1900 from this field. not sure why.
+ tm_epoch.tm_year = 2001-1900;
tm_epoch.tm_isdst = -1;
tm_epoch.tm_gmtoff = 0;
tm_epoch.tm_zone = nullptr;
OpenPOWER on IntegriCloud