IVGCVSW-7901 Fix unsafe Usages of Memcpy in Armnn

* Updated usages of Memcpy to use proper checks for null instead of asserts
* Added error checking in places where none existed

Signed-off-by: David Monahan <david.monahan@arm.com>
Change-Id: I9529acd966466ba281f88918be2ec372a756e183
diff --git a/src/armnnUtils/Permute.cpp b/src/armnnUtils/Permute.cpp
index 7d15f3c..19b465b 100644
--- a/src/armnnUtils/Permute.cpp
+++ b/src/armnnUtils/Permute.cpp
@@ -9,7 +9,6 @@
 
 #include "Half.hpp"
 
-#include <cassert>
 #include <cstring>
 
 namespace
@@ -23,7 +22,13 @@
     PermuteLoop(const armnn::TensorShape& dstShape, const armnn::PermutationVector& mappings)
         : m_DstShape(dstShape)
     {
-        assert(dstShape.GetNumDimensions() == mappings.GetSize());
+        if (dstShape.GetNumDimensions() != mappings.GetSize())
+        {
+            std::stringstream msg;
+            msg << "Permute: Number of shape dimensions (" << dstShape.GetNumDimensions() <<
+                ") does not match the size of the mappings (" << mappings.GetSize() << ")";
+            throw armnn::InvalidArgumentException(msg.str());
+        }
 
         const size_type numDims = dstShape.GetNumDimensions();
 
@@ -42,9 +47,18 @@
 
     void Unroll(const void* srcData, void* dstData, size_t dataTypeSize)
     {
-        assert(srcData);
-        assert(dstData);
-        assert(dataTypeSize > 0);
+        if (srcData == nullptr)
+        {
+            throw armnn::InvalidArgumentException("Permute: Source Data pointer is null");
+        }
+        if (dstData == nullptr)
+        {
+            throw armnn::InvalidArgumentException("Permute: Destination Data pointer is null");
+        }
+        if (dataTypeSize == 0)
+        {
+            throw armnn::InvalidArgumentException("Permute: dataTypeSize is zero");
+        }
 
         const unsigned char* srcDataPtr = reinterpret_cast<const unsigned char*>(srcData);
         unsigned char* dstDataPtr       = reinterpret_cast<unsigned char*>(dstData);
@@ -61,13 +75,26 @@
                 const unsigned char* srcEnd, unsigned char* dstEnd,
                 size_t dataTypeSize)
     {
-        assert(srcData);
-        assert(dstData);
-        assert(srcEnd);
-        assert(dstEnd);
-        assert(srcData < srcEnd);
-        assert(dstData < dstEnd);
-        assert(dataTypeSize > 0);
+        if (srcData == nullptr)
+        {
+            throw armnn::InvalidArgumentException("Permute: Source Data pointer is null");
+        }
+        if (dstData == nullptr)
+        {
+            throw armnn::InvalidArgumentException("Permute: Destination Data pointer is null");
+        }
+        if (srcEnd == nullptr)
+        {
+            throw armnn::InvalidArgumentException("Permute: Source End pointer is null");
+        }
+        if (dstEnd == nullptr)
+        {
+            throw armnn::InvalidArgumentException("Permute: Destination End pointer is null");
+        }
+        if (dataTypeSize == 0)
+        {
+            throw armnn::Exception("Permute: dataTypeSize is zero");
+        }
 
         if (dimension >= m_DstShape.GetNumDimensions())
         {
@@ -98,7 +125,13 @@
 armnn::TensorShape Permuted(const armnn::TensorShape& srcShape,
                             const armnn::PermutationVector& mappings)
 {
-    assert(srcShape.GetNumDimensions() == mappings.GetSize());
+    if (srcShape.GetNumDimensions() != mappings.GetSize())
+    {
+        std::stringstream msg;
+        msg << "Permute: Number of shape dimensions (" << srcShape.GetNumDimensions() <<
+               ") does not match the size of the mappings (" << mappings.GetSize() << ")";
+        throw armnn::InvalidArgumentException(msg.str());
+    }
 
     const unsigned int numDims = mappings.GetSize();
     unsigned int outDims[armnn::MaxNumOfTensorDimensions];