From 6f24b1aac9cbf5dfb3918cb59a7e903ddcec420e Mon Sep 17 00:00:00 2001 From: Matthew Bentham Date: Tue, 29 Jun 2021 15:18:32 +0100 Subject: Fix segfault in IsLayerSupportedTests DummyLayer<> was not implemented for QLstmLayer, so the default implementation was getting called. This caused null weights to be dereferenced in WorkloadFactory during IsLayerSupportedTests. While this would often not cause a crash, it could be reliably detected by running the UnitTests with Undefined Behavior Sanitizer. Change-Id: I7a49b18b8292632436b0aae52d6607e28fdd1839 Signed-off-by: Matthew Bentham --- src/backends/backendsCommon/WorkloadFactory.cpp | 3 +++ .../backendsCommon/test/IsLayerSupportedTestImpl.hpp | 14 +++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp index 61ad20995b..dc70e6a9c2 100644 --- a/src/backends/backendsCommon/WorkloadFactory.cpp +++ b/src/backends/backendsCommon/WorkloadFactory.cpp @@ -834,6 +834,9 @@ bool IWorkloadFactory::IsLayerConfigurationSupported(const BackendId& backendId, LstmInputParamsInfo paramsInfo; // Basic parameters + ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToForgetWeights.get() != nullptr); + ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToCellWeights.get() != nullptr); + ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToOutputWeights.get() != nullptr); paramsInfo.m_InputToForgetWeights = &cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(); paramsInfo.m_InputToCellWeights = &cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo(); paramsInfo.m_InputToOutputWeights = &cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(); diff --git a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp index adc7bc4c3c..ddd6eacb6d 100644 --- a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp +++ b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp @@ -300,7 +300,7 @@ struct DummyLstmLayer typename LstmLayerType::DescriptorType desc; desc.m_CifgEnabled = false; - m_Layer = dummyGraph.AddLayer(armnn::LstmDescriptor(), ""); + m_Layer = dummyGraph.AddLayer(desc, ""); m_Layer->m_BasicParameters.m_InputToForgetWeights = std::make_unique( armnn::TensorInfo(armnn::TensorShape({1,1,1,1}), armnn::DataType::Float32)); m_Layer->m_BasicParameters.m_InputToCellWeights = std::make_unique( @@ -342,18 +342,18 @@ struct DummyLayer { }; -template -struct DummyQLstmLayer +template<> +struct DummyLayer { - DummyQLstmLayer() + DummyLayer() { - typename QLstmLayerType::DescriptorType desc; + armnn::QLstmLayer::DescriptorType desc; desc.m_CifgEnabled = false; desc.m_PeepholeEnabled = true; desc.m_ProjectionEnabled = true; desc.m_LayerNormEnabled = true; - m_Layer = dummyGraph.AddLayer(armnn::QLstmDescriptor(), "qLstm"); + m_Layer = dummyGraph.AddLayer(desc, "qLstm"); // Basic params m_Layer->m_BasicParameters.m_InputToForgetWeights = std::make_unique( @@ -410,7 +410,7 @@ struct DummyQLstmLayer armnn::TensorInfo(armnn::TensorShape({1,1,1,1}), armnn::DataType::QSymmS16)); } - ~DummyQLstmLayer() + ~DummyLayer() { dummyGraph.EraseLayer(m_Layer); } -- cgit v1.2.1