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 <matthew.bentham@arm.com>
diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp
index 61ad209..dc70e6a 100644
--- a/src/backends/backendsCommon/WorkloadFactory.cpp
+++ b/src/backends/backendsCommon/WorkloadFactory.cpp
@@ -834,6 +834,9 @@
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 adc7bc4..ddd6eac 100644
--- a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp
+++ b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp
@@ -300,7 +300,7 @@
typename LstmLayerType::DescriptorType desc;
desc.m_CifgEnabled = false;
- m_Layer = dummyGraph.AddLayer<LstmLayerType>(armnn::LstmDescriptor(), "");
+ m_Layer = dummyGraph.AddLayer<LstmLayerType>(desc, "");
m_Layer->m_BasicParameters.m_InputToForgetWeights = std::make_unique<armnn::ScopedTensorHandle>(
armnn::TensorInfo(armnn::TensorShape({1,1,1,1}), armnn::DataType::Float32));
m_Layer->m_BasicParameters.m_InputToCellWeights = std::make_unique<armnn::ScopedTensorHandle>(
@@ -342,18 +342,18 @@
{
};
-template <typename QLstmLayerType>
-struct DummyQLstmLayer
+template<>
+struct DummyLayer<armnn::QLstmLayer>
{
- 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<QLstmLayerType>(armnn::QLstmDescriptor(), "qLstm");
+ m_Layer = dummyGraph.AddLayer<armnn::QLstmLayer>(desc, "qLstm");
// Basic params
m_Layer->m_BasicParameters.m_InputToForgetWeights = std::make_unique<armnn::ScopedTensorHandle>(
@@ -410,7 +410,7 @@
armnn::TensorInfo(armnn::TensorShape({1,1,1,1}), armnn::DataType::QSymmS16));
}
- ~DummyQLstmLayer()
+ ~DummyLayer()
{
dummyGraph.EraseLayer(m_Layer);
}