diff --git a/dnn/include/megdnn/oprs/base.h b/dnn/include/megdnn/oprs/base.h index d870edfef09094b007a773f1c5e564eb4f5cc45f..27bfc1b93cfd32ee7f0949778476494b52e4b1f8 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 e597ca3f1decc987274dd7dc046e3723e57adb8f..1215a647b8c393c77a8c3d7c67c8db131b648699 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)); } }