Fix leaks and invalid memory accesses
authorBenjamin Poirier <benjamin.poirier@polymtl.ca>
Fri, 27 Nov 2009 18:43:05 +0000 (13:43 -0500)
committerBenjamin Poirier <benjamin.poirier@polymtl.ca>
Fri, 18 Dec 2009 19:04:17 +0000 (14:04 -0500)
Signed-off-by: Benjamin Poirier <benjamin.poirier@polymtl.ca>
lttv/lttv/sync/event_analysis_chull.c
lttv/lttv/sync/event_analysis_eval.c
lttv/lttv/sync/event_processing_text.c
lttv/lttv/sync/sync_chain_unittest.c

index e77eabd221048738aafb84f3dc0ee71a5c7bfb87..0e583791cedd7d8a3a67ec4c5099afd48213adcf 100644 (file)
@@ -342,6 +342,7 @@ static void destroyAnalysisCHull(SyncState* const syncState)
                for (j= 0; j < syncState->traceNb; j++)
                {
                        g_queue_foreach(analysisData->hullArray[i][j], gfPointDestroy, NULL);
+                       g_queue_free(analysisData->hullArray[i][j]);
                }
                free(analysisData->hullArray[i]);
        }
index 3c3f8636398ec5ddb657a80665aa758d1a57bbfe..0c8e0497abafdd42f8de9aa23d97f8cd3e649fe6 100644 (file)
@@ -584,7 +584,7 @@ static void destroyAnalysisEval(SyncState* const syncState)
                        for (j= 0; j < i; j++)
                        {
                                // There seems to be a memory leak in glpk, valgrind reports a
-                               // loss even if the problem is deleted
+                               // loss (reachable) even if the problem is deleted
                                glp_delete_prob(graphs->lps[i][j]);
                        }
                        free(graphs->lps[i]);
@@ -1741,20 +1741,23 @@ static void finalizeAnalysisEvalLP(SyncState* const syncState)
        unsigned int i, j;
        AnalysisDataEval* analysisData= syncState->analysisData;
        AnalysisDataCHull* chAnalysisData= analysisData->chullSS->analysisData;
-       FactorsCHull** lpFactorsArray= createAllFactors(syncState->traceNb);
-       FactorsCHull* lpFactors;
+       FactorsCHull** lpFactorsArray;
 
        if (!syncState->stats && !syncState->graphsStream)
        {
                return;
        }
 
+       /* Because of matching_distributor, this analysis may be called twice.
+        * Only run it once */
        if ((syncState->graphsStream && analysisData->graphs->lps != NULL) ||
                (syncState->stats && analysisData->stats->chFactorsArray != NULL))
        {
                return;
        }
 
+       lpFactorsArray= createAllFactors(syncState->traceNb);
+
        if (syncState->stats)
        {
                analysisData->stats->chFactorsArray=
@@ -1794,7 +1797,6 @@ static void finalizeAnalysisEvalLP(SyncState* const syncState)
                        else
                        {
                                glp_delete_prob(lp);
-                               destroyFactorsCHull(lpFactors);
                        }
                }
        }
index 9dd5d30208b8ba9deb4214ce418b2cabe5eae371..8471096a6d07d90af439843196d4321c76cde370 100644 (file)
@@ -16,6 +16,7 @@
  * MA 02111-1307, USA.
  */
 
+#define _GNU_SOURCE
 #define NANOSECONDS_PER_SECOND 1000000000
 #define CPU_FREQ 1e9
 
@@ -120,6 +121,8 @@ static void destroyProcessingText(SyncState* const syncState)
                return;
        }
 
+       fclose(processingData->testCase);
+
        if (syncState->stats && processingData->factors)
        {
                g_array_free(processingData->factors, TRUE);
@@ -139,7 +142,6 @@ static void destroyProcessingText(SyncState* const syncState)
  */
 static void finalizeProcessingText(SyncState* const syncState)
 {
-       size_t len;
        int retval;
        unsigned int* seq;
        GArray* factors;
@@ -147,11 +149,12 @@ static void finalizeProcessingText(SyncState* const syncState)
                syncState->processingData;
        FILE* testCase= processingData->testCase;
        char* line= NULL;
+       size_t bufLen;
 
        seq= calloc(syncState->traceNb, sizeof(unsigned int));
 
        skipCommentLines(testCase);
-       retval= getline(&line, &len, testCase);
+       retval= getline(&line, &bufLen, testCase);
        while(!feof(testCase))
        {
                unsigned int sender, receiver;
@@ -164,9 +167,9 @@ static void finalizeProcessingText(SyncState* const syncState)
                        g_error(strerror(errno));
                }
 
-               if (line[len - 1] == '\n')
+               if (line[retval - 1] == '\n')
                {
-                       line[len - 1]= '\0';
+                       line[retval - 1]= '\0';
                }
 
                retval= sscanf(line, " %u %u %lf %lf %c", &sender, &receiver,
@@ -262,7 +265,7 @@ static void finalizeProcessingText(SyncState* const syncState)
                seq[sender]++;
 
                skipCommentLines(testCase);
-               retval= getline(&line, &len, testCase);
+               retval= getline(&line, &bufLen, testCase);
        }
 
        free(seq);
@@ -352,6 +355,11 @@ static unsigned int readTraceNb(FILE* testCase)
                abort();
        }
 
+       if (line)
+       {
+               free(line);
+       }
+
        return result;
 }
 
index 9b4b869c7f32bac3b622ac71a115e05050b7aaee..5d475ea8008f97c15d4ff548185a7d0ec842b109 100644 (file)
@@ -98,6 +98,7 @@ int main(const int argc, char* const argv[])
        bool stats;
        const char* testCaseName;
        GString* analysisModulesNames;
+       unsigned int id;
 
        // Initialize data structures
        syncState= malloc(sizeof(SyncState));
@@ -137,7 +138,7 @@ int main(const int argc, char* const argv[])
        else
        {
                syncState->stats= false;
-               g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, nullLog, NULL);
+               id= g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, nullLog, NULL);
        }
 
        if (optionSyncGraphs.present)
@@ -227,6 +228,11 @@ int main(const int argc, char* const argv[])
                        endUsage.ru_stime.tv_usec);
        }
 
+       if (!optionSyncStats.present)
+       {
+               g_log_remove_handler(NULL, id);
+       }
+
        return EXIT_SUCCESS;
 }
 
This page took 0.026824 seconds and 4 git commands to generate.