dnn(onnx): handle unaligned access in ONNX importer
authorAlexander Alekhin <alexander.alekhin@intel.com>
Fri, 17 Jan 2020 13:38:58 +0000 (16:38 +0300)
committerAlexander Alekhin <alexander.alekhin@intel.com>
Fri, 17 Jan 2020 16:03:34 +0000 (19:03 +0300)
modules/dnn/src/onnx/onnx_importer.cpp

index 36945f5..3da494b 100644 (file)
@@ -147,8 +147,18 @@ Mat getMatFromTensor(opencv_onnx::TensorProto& tensor_proto)
         }
         else
         {
-            char* val = const_cast<char*>(tensor_proto.raw_data().c_str());
-            int64_t* src = reinterpret_cast<int64_t*>(val);
+            const char* val = tensor_proto.raw_data().c_str();
+            // Aligned pointer is required: https://github.com/opencv/opencv/issues/16373
+            // this doesn't work: typedef int64_t CV_DECL_ALIGNED(1) unaligned_int64_t;
+            AutoBuffer<int64_t, 16> aligned_val;
+            if (!isAligned<sizeof(int64_t)>(val))
+            {
+                size_t sz = tensor_proto.raw_data().size();
+                aligned_val.allocate(divUp(sz, sizeof(int64_t)));
+                memcpy(aligned_val.data(), val, sz);
+                val = (const char*)aligned_val.data();
+            }
+            const int64_t* src = reinterpret_cast<const int64_t*>(val);
             convertInt64ToInt32(src, dst, blob.total());
         }
     }