diff --git a/dnn/include/megdnn/oprs/base.h b/dnn/include/megdnn/oprs/base.h index d870edfe..27bfc1b9 100644 --- a/dnn/include/megdnn/oprs/base.h +++ b/dnn/include/megdnn/oprs/base.h @@ -155,7 +155,15 @@ public: template static T deserialize_read_pod(const std::string& data, size_t offset = 0) { - T ret = *reinterpret_cast(&data[offset]); + T ret; + //! A pointer to an object or incomplete type may be converted to a + //! pointer to a different object or incomplete type. If the resulting + //! pointer is not correctly aligned for the pointed-to type, the + //! behavior is undefined. + //! + //! so here we should use memcpy instead of + //! *reinterpret_cast(&data[offset]); + memcpy(&ret, data.data() + offset, sizeof(T)); return ret; } diff --git a/dnn/src/common/algo_chooser.h b/dnn/src/common/algo_chooser.h index e597ca3f..1215a647 100644 --- a/dnn/src/common/algo_chooser.h +++ b/dnn/src/common/algo_chooser.h @@ -48,10 +48,10 @@ typename Opr::AlgoBase* get_algorithm_or_construct(Opr* opr, Args&&... args) { if (set.valid()) { return opr->algo_pack().construct_and_get_algo(set.desc); } else { - ret = opr->get_algorithm_info_heuristic( - std::forward(args)..., std::numeric_limits::max(), - false); - return opr->get_algo_from_desc(ret.desc); + return static_cast( + opr->get_algorithm_heuristic(std::forward(args)..., + std::numeric_limits::max(), + false)); } }