From f98226f89b795793183be2a98bdc7be45663f36b Mon Sep 17 00:00:00 2001
From: "johannes.heinecke" <johannes.heinecke@orange.fr>
Date: Tue, 1 Nov 2016 18:50:48 +0100
Subject: [PATCH] correction unfreed memory/invalid acces: valgrind does not
 report any error anymore

---
 maca_common/src/dico_vec.c                     | 10 +++++++---
 maca_common/src/hash.c                         |  1 +
 maca_lemmatizer/src/context.c                  | 11 +++++++++--
 maca_trans_parser/src/context.c                | 11 ++++++++++-
 maca_trans_parser/src/feat_desc.c              | 11 ++++-------
 maca_trans_parser/src/feat_desc.h              |  1 +
 maca_trans_parser/src/feat_lib.c               | 13 ++++++++++++-
 maca_trans_parser/src/feat_lib.h               |  2 +-
 maca_trans_parser/src/feat_model.c             |  9 ++++++---
 maca_trans_parser/src/feat_model.h             |  2 ++
 maca_trans_parser/src/maca_trans_interpreter.c |  2 +-
 maca_trans_parser/src/mvt_stack.c              |  3 +++
 12 files changed, 57 insertions(+), 19 deletions(-)

diff --git a/maca_common/src/dico_vec.c b/maca_common/src/dico_vec.c
index 9ac0716..a064288 100644
--- a/maca_common/src/dico_vec.c
+++ b/maca_common/src/dico_vec.c
@@ -18,9 +18,12 @@ dico_vec *dico_vec_new(void)
 void dico_vec_free(dico_vec *dv)
 {
   if(dv){
-    if(dv->t)
-      free(dv->t);
-    free(dv);
+      if (dv->ht)
+	  hash_free(dv->ht);
+
+      if(dv->t)
+	  free(dv->t);
+      free(dv);
   }
 }
 
@@ -98,5 +101,6 @@ dico_vec *dico_vec_read(char *filename, float ratio)
   while(!feof(f)){
     dico_vec_add(dv, dico_read_fh(f, ratio));
   }
+  fclose(f);
   return dv;
 }
diff --git a/maca_common/src/hash.c b/maca_common/src/hash.c
index 1a30c6f..724bcce 100644
--- a/maca_common/src/hash.c
+++ b/maca_common/src/hash.c
@@ -39,6 +39,7 @@ void hash_free(hash *h)
   int i;
   for(i=0; i < h->size; i++)
     cell_free(h->array[i]);
+  free(h->array);
   free(h);
 }
 
diff --git a/maca_lemmatizer/src/context.c b/maca_lemmatizer/src/context.c
index 262a08c..2fc6f42 100644
--- a/maca_lemmatizer/src/context.c
+++ b/maca_lemmatizer/src/context.c
@@ -156,8 +156,15 @@ void context_set_linguistic_resources_filenames(context *ctx)
 
   if(ctx->maca_data_path)
     strcat(absolute_path, ctx->maca_data_path);
-  else
-    strcat(absolute_path, getenv("MACAON_DIR"));
+  else {
+      char *e = getenv("MACAON_DIR");
+      if (e != NULL) {
+	  strcat(absolute_path, e);	  
+      } else {
+	  fprintf(stderr, "ATTENTION: the environment variable MACAON_DIR is not defined\n");
+      }
+  }
+
 	   
   strcat(absolute_path, "/");
   strcat(absolute_path, ctx->language);
diff --git a/maca_trans_parser/src/context.c b/maca_trans_parser/src/context.c
index 1b9704e..760410c 100644
--- a/maca_trans_parser/src/context.c
+++ b/maca_trans_parser/src/context.c
@@ -22,6 +22,13 @@ void context_free(context *ctx)
   if(ctx->maca_data_path)          free(ctx->maca_data_path);
   if(ctx->language)                free(ctx->language);
   if(ctx->root_label)              free(ctx->root_label);
+  if(ctx->vocabs_filename)         free(ctx->vocabs_filename);
+
+  if (ctx->mcd_struct)
+      mcd_free(ctx->mcd_struct);
+
+  if (ctx->vocabs) 
+      dico_vec_free(ctx->vocabs);
 
   if(ctx->d_perceptron_features)
     dico_free(ctx->d_perceptron_features);
@@ -251,12 +258,14 @@ context *context_read_options(int argc, char *argv[])
 	ctx->vocabs_filename = strdup(optarg);
 	break;
       case 'L':
-	ctx->language = strdup(optarg);
+	if (ctx->language) free(ctx->language); // libérer le default (strdup("fr") )
+  	ctx->language = strdup(optarg);
 	break;
       case 'D':
 	ctx->maca_data_path = strdup(optarg);
 	break;
       case 'R':
+	if (ctx->root_label) free(ctx->root_label); // libérer le default (strdup("root") )
 	ctx->root_label = strdup(optarg);
 	break;
       case 'P':
diff --git a/maca_trans_parser/src/feat_desc.c b/maca_trans_parser/src/feat_desc.c
index ab76597..7eb5c88 100644
--- a/maca_trans_parser/src/feat_desc.c
+++ b/maca_trans_parser/src/feat_desc.c
@@ -6,18 +6,15 @@
 
 void simple_feat_desc_free(simple_feat_desc *sfd)
 {
-  /*  if(sfd->name)
-      free(sfd->name);
-  free(sfd);*/
+    if(sfd->name)
+	free(sfd->name);
+    free(sfd);
 }
 
 void feat_desc_free(feat_desc *fd)
 {
-  int i;
-  for(i=0; i < fd->nbelem; i++)
-    simple_feat_desc_free(fd->array[i]);
   free(fd->array);
-  /* free(fd); */
+  free(fd);
 }
 
 simple_feat_desc *simple_feat_desc_new(char *name, int type, feat_fct fct)
diff --git a/maca_trans_parser/src/feat_desc.h b/maca_trans_parser/src/feat_desc.h
index 13e0edb..e32390d 100644
--- a/maca_trans_parser/src/feat_desc.h
+++ b/maca_trans_parser/src/feat_desc.h
@@ -23,6 +23,7 @@ feat_desc *feat_desc_new(void);
 void feat_desc_free(feat_desc *fd);
 feat_desc *feat_desc_add(feat_desc *fd, simple_feat_desc *sfd);
 simple_feat_desc *simple_feat_desc_new(char *name, int type, feat_fct fct);
+void simple_feat_desc_free(simple_feat_desc *sfd);
 
 #endif
 
diff --git a/maca_trans_parser/src/feat_lib.c b/maca_trans_parser/src/feat_lib.c
index e76cc2a..a7471e2 100644
--- a/maca_trans_parser/src/feat_lib.c
+++ b/maca_trans_parser/src/feat_lib.c
@@ -7,6 +7,7 @@ void feat_lib_add(feat_lib *fl, int feature_type, char *feature_name, feat_fct f
   int feature_nb = dico_add(fl->d_features, feature_name); 
   fl->array = (simple_feat_desc **)realloc(fl->array, (feature_nb + 1) * sizeof(simple_feat_desc *));
   fl->array[feature_nb] = simple_feat_desc_new(feature_name, feature_type, feature_fct);
+  fl->nbelem = feature_nb+1;
 }
 
 simple_feat_desc *feat_lib_get_simple_feat_desc(feat_lib *fl, char *feat_name)
@@ -28,13 +29,23 @@ feat_lib *feat_lib_new(void)
   return fl;
 }
 
+void feat_lib_free(feat_lib *fl) {
+
+    for(int i=0; i < fl->nbelem; ++i) {
+	simple_feat_desc_free(fl->array[i]);
+    }
+    dico_free(fl->d_features);
+    free(fl->array);
+    free(fl); // ne devrait pas etre en commentaire
+
+}
 
 feat_lib *feat_lib_build(void)
 {
   feat_lib *fl = feat_lib_new();
   
   feat_lib_add(fl, FEAT_TYPE_LABEL,  (char *)"s0sf", s0sf);
-  feat_lib_add(fl, FEAT_TYPE_INT       ,  (char *)"s0g", s0g);
+  feat_lib_add(fl, FEAT_TYPE_INT,    (char *)"s0g", s0g);
 
   feat_lib_add(fl, FEAT_TYPE_FORM,  (char *)"s0f", s0f);
   feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"s0l", s0l);
diff --git a/maca_trans_parser/src/feat_lib.h b/maca_trans_parser/src/feat_lib.h
index 1ec85ba..b0af822 100644
--- a/maca_trans_parser/src/feat_lib.h
+++ b/maca_trans_parser/src/feat_lib.h
@@ -16,5 +16,5 @@ feat_lib *feat_lib_new(void);
 void feat_lib_add(feat_lib *fl, int feature_type, char *feature_name, feat_fct feature_fct);
 simple_feat_desc *feat_lib_get_simple_feat_desc(feat_lib *fl, char *feat_name);
 feat_lib *feat_lib_build(void);
-
+void feat_lib_free(feat_lib *fl);
 #endif
diff --git a/maca_trans_parser/src/feat_model.c b/maca_trans_parser/src/feat_model.c
index 1495776..9ee83b2 100644
--- a/maca_trans_parser/src/feat_model.c
+++ b/maca_trans_parser/src/feat_model.c
@@ -44,7 +44,9 @@ void feat_model_free(feat_model *fm)
   int i;
   for(i=0; i < fm->nbelem; i++)
     feat_desc_free(fm->array[i]);
+  free(fm->array);
   free(fm->name);
+  feat_lib_free(fm->fl); 
   free(fm);
 }
 
@@ -55,10 +57,11 @@ feat_model *feat_model_read(char *filename, int verbose)
   int feature_number = 0;
   char buffer[1000]; /* ugly */
   char *feat_name;
-  feat_lib *fl = feat_lib_build();
+  //feat_lib *fl
+  fm->fl = feat_lib_build(); // must be preserved in feature_model to delete correctly features at the end
   simple_feat_desc *sfd;
   feat_desc *fd;
-  
+
   while(fgets(buffer, 1000, f)){
     if(feof(f)) break;
     if((buffer[0] == '\n') || (buffer[0] == '#')) continue;
@@ -67,7 +70,7 @@ feat_model *feat_model_read(char *filename, int verbose)
     feat_name = strtok(buffer, " \n");
     do{
       if(verbose) fprintf(stderr, "\t%s", feat_name);
-      sfd = feat_lib_get_simple_feat_desc(fl, feat_name);
+      sfd = feat_lib_get_simple_feat_desc(fm->fl, feat_name);
       if(sfd)
 	feat_desc_add(fd, sfd);
     }while((feat_name = strtok(NULL, " \n")));
diff --git a/maca_trans_parser/src/feat_model.h b/maca_trans_parser/src/feat_model.h
index d371d25..4fa12d4 100644
--- a/maca_trans_parser/src/feat_model.h
+++ b/maca_trans_parser/src/feat_model.h
@@ -2,6 +2,7 @@
 #define __FEAT_MODEL__
 
 #include "feat_desc.h"
+#include "feat_lib.h"
 
 typedef struct {
   char string[2048];
@@ -9,6 +10,7 @@ typedef struct {
   int nbelem;
   feat_desc **array;
   int dim;
+    feat_lib *fl; // stores all simple features 
 } feat_model;
 
 #include "config.h"
diff --git a/maca_trans_parser/src/maca_trans_interpreter.c b/maca_trans_parser/src/maca_trans_interpreter.c
index 281d3aa..a7dbc63 100644
--- a/maca_trans_parser/src/maca_trans_interpreter.c
+++ b/maca_trans_parser/src/maca_trans_interpreter.c
@@ -41,7 +41,7 @@ int main(int argc, char *argv[])
   char *mcf_filename = NULL;
   FILE *mcf_file = NULL;
   int verbose = 0;
-  word_buffer *wb = NULL;
+  //word_buffer *wb = NULL;
   config *c = NULL;
   int mode = MODE_PARSER;
   
diff --git a/maca_trans_parser/src/mvt_stack.c b/maca_trans_parser/src/mvt_stack.c
index 6f99a11..6d3023d 100644
--- a/maca_trans_parser/src/mvt_stack.c
+++ b/maca_trans_parser/src/mvt_stack.c
@@ -12,6 +12,9 @@ int i;
 
 void mvt_stack_free(mvt_stack *s)
 {
+    for(int i=0; i < s->size; ++i) {
+	  mvt_free(s->array[i]);
+  }
   free(s->array);
   free(s);
 }
-- 
GitLab