From 43e7864cf81cd55fb53f8b98b4d387da859eae0d Mon Sep 17 00:00:00 2001 From: Nattapat Chaimanowong Date: Wed, 13 Feb 2019 15:56:24 +0000 Subject: IVGCVSW-2724 Fix bug in DeserializeParser * Fixed error in which DeserializeParser::LoadGraphFromFile returns a pointer to a local variable in its scope Change-Id: Ic928b8509c0ae76570f0527b17e050b46327fe0c Signed-off-by: Nattapat Chaimanowong --- src/armnnDeserializeParser/DeserializeParser.cpp | 13 ++++++------- src/armnnDeserializeParser/DeserializeParser.hpp | 6 +++++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/armnnDeserializeParser/DeserializeParser.cpp b/src/armnnDeserializeParser/DeserializeParser.cpp index 123fc9366c..6a6a0fafe2 100644 --- a/src/armnnDeserializeParser/DeserializeParser.cpp +++ b/src/armnnDeserializeParser/DeserializeParser.cpp @@ -72,7 +72,7 @@ void CheckLayers(const DeserializeParser::GraphPtr& graph, boost::str( boost::format("%1% was called with invalid (null) graph. " "Possible reason is that the graph is not yet loaded and Unpack(ed). " - "layers:%2% at %4%") % + "layers:%2% at %3%") % location.m_Function % layersIndex % location.FileLine())); @@ -82,7 +82,7 @@ void CheckLayers(const DeserializeParser::GraphPtr& graph, throw ParseException( boost::str( boost::format("%1% was called with an invalid layers index. " - "layers:%2% at %4%") % + "layers:%2% at %3%") % location.m_Function % layersIndex % location.FileLine())); @@ -322,7 +322,7 @@ void IDeserializeParser::Destroy(IDeserializeParser* parser) INetworkPtr DeserializeParser::CreateNetworkFromBinaryFile(const char* graphFile) { ResetParser(); - m_Graph = LoadGraphFromFile(graphFile); + m_Graph = LoadGraphFromFile(graphFile, m_FileContent); return CreateNetworkFromGraph(); } @@ -333,7 +333,7 @@ INetworkPtr DeserializeParser::CreateNetworkFromBinary(const std::vector(file)), std::istreambuf_iterator()); + fileContent = std::string((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + return LoadGraphFromBinary(reinterpret_cast(fileContent.c_str()), fileContent.size()); } @@ -606,5 +607,3 @@ void DeserializeParser::ParseMultiplication(unsigned int layerIndex) } } - - diff --git a/src/armnnDeserializeParser/DeserializeParser.hpp b/src/armnnDeserializeParser/DeserializeParser.hpp index 9edd959220..ce343dc528 100644 --- a/src/armnnDeserializeParser/DeserializeParser.hpp +++ b/src/armnnDeserializeParser/DeserializeParser.hpp @@ -42,7 +42,7 @@ public: public: // testable helpers - static GraphPtr LoadGraphFromFile(const char* fileName); + static GraphPtr LoadGraphFromFile(const char* fileName, std::string& fileContent); static GraphPtr LoadGraphFromBinary(const uint8_t* binaryContent, size_t len); static TensorRawPtrVector GetInputs(const GraphPtr& graph, unsigned int layerIndex); static TensorRawPtrVector GetOutputs(const GraphPtr& graph, unsigned int layerIndex); @@ -82,6 +82,10 @@ private: GraphPtr m_Graph; std::vector m_ParserFunctions; + /// This holds the data of the file that was read in from CreateNetworkFromBinaryFile + /// Needed for m_Graph to point to + std::string m_FileContent; + /// A mapping of an output slot to each of the input slots it should be connected to /// The outputSlot is from the layer that creates this tensor as one of its outputs /// The inputSlots are from the layers that use this tensor as one of their inputs -- cgit v1.2.1