From eeda59a190704b955fae4530f0899b794ff9d6b6 Mon Sep 17 00:00:00 2001
From: Jochem Snuverink <jochem.snuverink@psi.ch>
Date: Wed, 22 Jul 2020 11:19:45 +0200
Subject: [PATCH] fix memory errors in unit tests as reported by valgrind:
 initialise array, check for container end, array deletion

---
 ippl/src/Field/LField.hpp                      |  2 +-
 ippl/src/SubField/SubFieldIter.h               | 18 ++++++++++++++----
 .../Fields/Interpolation/NDGridTest.cpp        |  2 +-
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/ippl/src/Field/LField.hpp b/ippl/src/Field/LField.hpp
index ba8d22ca3..bf8b8a4db 100644
--- a/ippl/src/Field/LField.hpp
+++ b/ippl/src/Field/LField.hpp
@@ -714,7 +714,7 @@ LField<T,Dim>::allocateStorage(int newsize)
 
   // Allocate the storage, creating some extra to account for offset, and
   // then add in the offset.
-  P = new T[newsize + extra];
+  P = new T[newsize + extra]();
   P += extra;
 
   ADDIPPLSTAT(incLFieldBytes, (newsize+extra)*sizeof(T));
diff --git a/ippl/src/SubField/SubFieldIter.h b/ippl/src/SubField/SubFieldIter.h
index 2e6457fde..34e3a74e1 100644
--- a/ippl/src/SubField/SubFieldIter.h
+++ b/ippl/src/SubField/SubFieldIter.h
@@ -127,7 +127,11 @@ public:
       MyDomain(&(const_cast<S&>(s))),
       CurrentLField(ldf),
       MyBrackets(B) {
-	LFPtr = (*CurrentLField).second.get();
+      if (CurrentLField != getBareField().end_if()) {
+          LFPtr = (*CurrentLField).second.get();
+      } else {
+          LFPtr = nullptr;
+      }
   }
 
   // Default constructor
@@ -156,9 +160,15 @@ public:
 
   // Go to the next LField.
   typename BareField<T,Dim>::iterator_if nextLField() {
-    ++CurrentLField;
-    LFPtr = (*CurrentLField).second.get();
-    return CurrentLField;
+      if (CurrentLField != getBareField().end_if()) {
+          ++CurrentLField;
+      }
+      if (CurrentLField != getBareField().end_if()) {
+          LFPtr = (*CurrentLField).second.get();
+      } else {
+          LFPtr = nullptr;
+      }
+      return CurrentLField;
   }
 
   // Return the LField pointed to by LFPtr
diff --git a/tests/classic_src/Fields/Interpolation/NDGridTest.cpp b/tests/classic_src/Fields/Interpolation/NDGridTest.cpp
index f7791fa79..6753c036f 100644
--- a/tests/classic_src/Fields/Interpolation/NDGridTest.cpp
+++ b/tests/classic_src/Fields/Interpolation/NDGridTest.cpp
@@ -148,7 +148,7 @@ TEST_F(NDGridTest, CoordVectorTest) {  // and newCoordArray
             EXPECT_NEAR(coords_v[j], gridCoordinates[i][j], 1e-12);
             EXPECT_NEAR(coords_a[j], gridCoordinates[i][j], 1e-12);
         }
-        delete coords_a;
+        delete[] coords_a;
     }
 }
 
-- 
GitLab