OSDN Git Service

simpleperf: fix unaligned data access on arm.
authorYabin Cui <yabinc@google.com>
Thu, 10 Nov 2016 23:25:15 +0000 (15:25 -0800)
committerYabin Cui <yabinc@google.com>
Thu, 10 Nov 2016 23:26:26 +0000 (15:26 -0800)
Bug: http://b/32340274
Test: run `simpleperf record --dump-symbols` manually.
Test: run simpleperf_unit_test.
Change-Id: I771a516bb644f18fafa987061ecfc76ae3521ca9

simpleperf/record_file_reader.cpp
simpleperf/utils.h

index 786f1f4..bff8ba1 100644 (file)
@@ -408,22 +408,17 @@ bool RecordFileReader::ReadFileFeature(size_t& read_pos,
   const char* p = buf.data();
   *file_path = p;
   p += file_path->size() + 1;
-  memcpy(file_type, p, sizeof(uint32_t));
-  p += sizeof(uint32_t);
-  memcpy(min_vaddr, p, sizeof(uint64_t));
-  p += sizeof(uint64_t);
+  MoveFromBinaryFormat(*file_type, p);
+  MoveFromBinaryFormat(*min_vaddr, p);
   uint32_t symbol_count;
-  memcpy(&symbol_count, p, sizeof(uint32_t));
-  p += sizeof(uint32_t);
+  MoveFromBinaryFormat(symbol_count, p);
   symbols->clear();
   symbols->reserve(symbol_count);
   for (uint32_t i = 0; i < symbol_count; ++i) {
     uint64_t start_vaddr;
     uint32_t len;
-    memcpy(&start_vaddr, p, sizeof(uint64_t));
-    p += sizeof(uint64_t);
-    memcpy(&len, p, sizeof(uint32_t));
-    p += sizeof(uint32_t);
+    MoveFromBinaryFormat(start_vaddr, p);
+    MoveFromBinaryFormat(len, p);
     std::string name = p;
     p += name.size() + 1;
     symbols->emplace_back(name, start_vaddr, len);
index 89962a6..fc21a99 100644 (file)
@@ -108,7 +108,7 @@ class ArchiveHelper {
 template <class T>
 void MoveFromBinaryFormat(T& data, const char*& p) {
   static_assert(std::is_standard_layout<T>::value, "not standard layout");
-  data = *reinterpret_cast<const T*>(p);
+  memcpy(&data, p, sizeof(T));
   p += sizeof(T);
 }
 
@@ -123,7 +123,7 @@ void MoveFromBinaryFormat(T* data_p, size_t n, const char*& p) {
 template <class T>
 void MoveToBinaryFormat(const T& data, char*& p) {
   static_assert(std::is_standard_layout<T>::value, "not standard layout");
-  *reinterpret_cast<T*>(p) = data;
+  memcpy(p, &data, sizeof(T));
   p += sizeof(T);
 }