From 6abdc3a87b290278cfb843fa375c10071bd6c98e Mon Sep 17 00:00:00 2001 From: Jian Chen Date: Sun, 28 May 2023 17:58:07 +0000 Subject: [PATCH] Fix static analysis bug (#16114) ### Description ### Motivation and Context --- .../identical_children_consolidation.cc | 43 ++++++++++--------- .../identical_children_consolidation.h | 8 ++-- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/onnxruntime/core/optimizer/identical_children_consolidation.cc b/onnxruntime/core/optimizer/identical_children_consolidation.cc index 07dc25dabd..350da9605a 100644 --- a/onnxruntime/core/optimizer/identical_children_consolidation.cc +++ b/onnxruntime/core/optimizer/identical_children_consolidation.cc @@ -44,7 +44,7 @@ bool IdenticalChildrenConsolidation::IsSupportedParentNode(const Node* node) con std::vector> IdenticalChildrenConsolidation::DivideIdenticalChildrenIntoGroups( const Graph& graph, Node* node, - const string_view& op) const { + const string_view& op) { unordered_map> identical_children_map; for (auto i = node->OutputEdgesBegin(); i != node->OutputEdgesEnd(); ++i) { if (i->GetNode().OpType() == op) { @@ -60,68 +60,69 @@ std::vector> IdenticalChildrenConsolidation::DivideIdenti return groups; } -string_view IdenticalChildrenConsolidation::IdentityBuilder(const Graph& graph, const Node& node) const { - std::string identity; +std::string IdenticalChildrenConsolidation::IdentityBuilder(const Graph& graph, const Node& node) { + std::ostringstream identity; for (const auto* input_def : node.InputDefs()) { if (input_def->Exists() && !input_def->Name().empty()) { auto name = input_def->Name(); if (graph_utils::NodeArgIsConstant(graph, *input_def)) { if (optimizer_utils::IsScalar(*input_def)) { const auto* data = graph_utils::GetConstantInitializer(graph, name); - identity.append(constant_prefix); + identity << constant_prefix; Initializer value{*data, graph.ModelPath()}; switch (static_cast(data->data_type())) { case TensorProto::DataType::TensorProto_DataType_INT8: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_INT16: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_INT32: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_UINT8: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_UINT16: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_BOOL: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_INT64: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_UINT32: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_UINT64: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_FLOAT: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_DOUBLE: - identity.append(std::to_string(value.data()[0])); + identity << *value.data(); break; case TensorProto::DataType::TensorProto_DataType_STRING: - identity.append(value.data()[0]); + identity << *value.data(); break; default: break; } } else { // TODO: handle non-scalar constant inputs, using checksum or something else - return ignore_identity; + return std::string{ignore_identity}; } } else { - identity.append(name); + identity << name; } } else { - return ignore_identity; + return std::string{ignore_identity}; } - identity.append("####"); + identity << "####"; } - return {identity}; + + return identity.str(); } } // namespace onnxruntime \ No newline at end of file diff --git a/onnxruntime/core/optimizer/identical_children_consolidation.h b/onnxruntime/core/optimizer/identical_children_consolidation.h index 2be32b3e01..0289ec245b 100644 --- a/onnxruntime/core/optimizer/identical_children_consolidation.h +++ b/onnxruntime/core/optimizer/identical_children_consolidation.h @@ -43,13 +43,13 @@ class IdenticalChildrenConsolidation : public GraphTransformer { private: Status ApplyImpl(Graph& graph, bool& modified, int graph_level, const logging::Logger& logger) const override; bool IsSupportedParentNode(const Node* node) const; - std::vector > DivideIdenticalChildrenIntoGroups(const Graph& graph, Node* node, const string_view& op) const; - string_view IdentityBuilder(const Graph& graph, const Node& node) const; + static std::vector > DivideIdenticalChildrenIntoGroups(const Graph& graph, Node* node, const string_view& op); + static std::string IdentityBuilder(const Graph& graph, const Node& node); unordered_map > supported_ops = { {"DequantizeLinear", {"QuantizeLinear"}}, {"QuantizeLinear", {"DequantizeLinear"}}}; - string_view constant_prefix = "ItIsSpecialConstantPrefix_"; - string_view ignore_identity = "IgNoReD_IdEnTiTy"; + static constexpr string_view constant_prefix = "ItIsSpecialConstantPrefix_"; + static constexpr string_view ignore_identity = "IgNoReD_IdEnTiTy"; }; } // namespace onnxruntime