Addressed a number of memory leaks identified in unit tests by asan
authorJared Mulconry <jaredmulconry@gmail.com>
Sun, 1 Oct 2017 12:16:21 +0000 (23:16 +1100)
committerTuro Lamminen <turotl@gmail.com>
Mon, 2 Oct 2017 08:03:24 +0000 (11:03 +0300)
code/B3DImporter.cpp
code/B3DImporter.h
code/PretransformVertices.cpp
test/unit/TestModelFactory.h
test/unit/utIssues.cpp
test/unit/utObjImportExport.cpp
test/unit/utRemoveVCProcess.cpp
test/unit/utSceneCombiner.cpp

index 5de7bd6..d156761 100644 (file)
@@ -82,6 +82,20 @@ static const aiImporterDesc desc = {
 
 //#define DEBUG_B3D
 
+template<typename T>
+void DeleteAllBarePointers(std::vector<T>& x)
+{
+    for(auto p : x)
+    {
+        delete p;
+    }
+}
+
+B3DImporter::~B3DImporter()
+{
+    DeleteAllBarePointers(_animations);
+}
+
 // ------------------------------------------------------------------------------------------------
 bool B3DImporter::CanRead( const std::string& pFile, IOSystem* /*pIOHandler*/, bool /*checkSig*/) const{
 
@@ -558,13 +572,19 @@ aiNode *B3DImporter::ReadNODE( aiNode *parent ){
 void B3DImporter::ReadBB3D( aiScene *scene ){
 
     _textures.clear();
+
     _materials.clear();
 
     _vertices.clear();
+
     _meshes.clear();
 
+    DeleteAllBarePointers(_nodes);
     _nodes.clear();
+
     _nodeAnims.clear();
+
+    DeleteAllBarePointers(_animations);
     _animations.clear();
 
     string t=ReadChunk();
index 4d3576d..94644ed 100644 (file)
@@ -59,6 +59,8 @@ namespace Assimp{
 
 class B3DImporter : public BaseImporter{
 public:
+    B3DImporter() = default;
+    virtual ~B3DImporter();
 
     virtual bool CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const;
 
index 7bfed42..5fc2946 100644 (file)
@@ -634,7 +634,7 @@ void PretransformVertices::Execute( aiScene* pScene)
         aiNode* newRoot = new aiNode();
         newRoot->mName = pScene->mRootNode->mName;
         delete pScene->mRootNode;
-        pScene->mRootNode = new aiNode();
+        pScene->mRootNode = newRoot;
 
         if (1 == pScene->mNumMeshes && !pScene->mNumLights && !pScene->mNumCameras)
         {
index 6c47dcf..f848f55 100644 (file)
@@ -60,7 +60,7 @@ public:
     static aiScene *createDefaultTestModel( float &opacity  ) {
         aiScene *scene( new aiScene );
         scene->mNumMaterials = 1;
-        scene->mMaterials = new aiMaterial*;
+        scene->mMaterials = new aiMaterial*[scene->mNumMaterials];
         scene->mMaterials[ 0 ] = new aiMaterial;
         aiColor3D color( 1, 0, 0 );
         EXPECT_EQ( AI_SUCCESS, scene->mMaterials[ 0 ]->AddProperty( &color, 1, AI_MATKEY_COLOR_DIFFUSE ) );
@@ -70,7 +70,7 @@ public:
         EXPECT_EQ( AI_SUCCESS, scene->mMaterials[ 0 ]->AddProperty( &opacity, 1, AI_MATKEY_OPACITY ) );
 
         scene->mNumMeshes = 1;
-        scene->mMeshes = new aiMesh*;
+        scene->mMeshes = new aiMesh*[scene->mNumMeshes];
         scene->mMeshes[ 0 ] = new aiMesh;
         scene->mMeshes[ 0 ]->mMaterialIndex = 0;
         scene->mMeshes[ 0 ]->mPrimitiveTypes = aiPrimitiveType_TRIANGLE;
@@ -80,7 +80,7 @@ public:
         scene->mMeshes[ 0 ]->mVertices[ 1 ] = aiVector3D( 0, 1, 0 );
         scene->mMeshes[ 0 ]->mVertices[ 2 ] = aiVector3D( 0, 0, 1 );
         scene->mMeshes[ 0 ]->mNumFaces = 1;
-        scene->mMeshes[ 0 ]->mFaces = new aiFace;
+        scene->mMeshes[ 0 ]->mFaces = new aiFace[scene->mMeshes[ 0 ]->mNumFaces];
         scene->mMeshes[ 0 ]->mFaces[ 0 ].mNumIndices = 3;
         scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices = new unsigned int[ 3 ];
         scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 0 ] = 0;
@@ -89,7 +89,7 @@ public:
 
         scene->mRootNode = new aiNode;
         scene->mRootNode->mNumMeshes = 1;
-        scene->mRootNode->mMeshes = new unsigned int( 0 );
+        scene->mRootNode->mMeshes = new unsigned int[scene->mRootNode->mNumMeshes]{ 0 };
 
         return scene;
     }
index a3e68fe..2feef92 100644 (file)
@@ -74,6 +74,7 @@ TEST_F( utIssues, OpacityBugWhenExporting_727 ) {
         EXPECT_EQ( AI_SUCCESS, newScene->mMaterials[ 0 ]->Get( AI_MATKEY_OPACITY, newOpacity ) );
         EXPECT_EQ( opacity, newOpacity );
     }
+    delete scene;
 }
 
 #endif // ASSIMP_BUILD_NO_EXPORT
index d4d4fbf..7099252 100644 (file)
@@ -237,6 +237,15 @@ TEST_F( utObjImportExport, obj_import_test ) {
     differ.showReport();
 
     m_im->FreeScene();
+    for(unsigned int i = 0; i < expected->mNumMeshes; ++i)
+    {
+        delete expected->mMeshes[i];
+    }
+    delete[] expected->mMeshes;
+    expected->mMeshes = nullptr;
+    delete[] expected->mMaterials;
+    expected->mMaterials = nullptr;
+    delete expected;
 }
 
 TEST_F( utObjImportExport, issue1111_no_mat_name_Test ) {
index a42c3e8..c78e80d 100644 (file)
@@ -72,4 +72,5 @@ TEST_F( utRevmoveVCProcess, issue1266_ProcessMeshTest_NoCrash ) {
     scene->mMeshes[ 0 ] = mesh;
     RemoveVCProcess *process = new RemoveVCProcess;
     process->Execute( scene );
-}
\ No newline at end of file
+    delete scene;
+}
index f0e4d5d..3a28351 100644 (file)
@@ -42,6 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "UnitTestPCH.h"
 #include <assimp/SceneCombiner.h>
 #include <assimp/mesh.h>
+#include <memory>
 
 using namespace ::Assimp;
 
@@ -63,8 +64,10 @@ TEST_F( utSceneCombiner, MergeMeshes_ValidNames_Test ) {
     mesh3->mName.Set( "mesh_3" );
     merge_list.push_back( mesh3 );
 
-    aiMesh *out( nullptr );
-    SceneCombiner::MergeMeshes( &out, 0, merge_list.begin(), merge_list.end() );
+    std::unique_ptr<aiMesh> out;
+    aiMesh* ptr = nullptr;
+    SceneCombiner::MergeMeshes( &ptr, 0, merge_list.begin(), merge_list.end() );
+    out.reset(ptr);
     std::string outName = out->mName.C_Str();
     EXPECT_EQ( "mesh_1.mesh_2.mesh_3", outName );
 }