fix valgrind issues during ast serialization 14/15214/4
Clément DAVID [Fri, 12 Sep 2014 11:48:17 +0000 (13:48 +0200)]
Change-Id: I02de60699c787ee7e051942d6fc5fa95e3ed48e7

scilab/modules/ast/includes/ast/serializervisitor.hxx
scilab/modules/ast/src/cpp/types/macro.cpp
scilab/modules/io/sci_gateway/cpp/sci_genlib.cpp

index d379a91..f024cb9 100644 (file)
@@ -34,14 +34,16 @@ private :
 
     unsigned char* get_buf(void)
     {
-        need(1);
+        // set buffer size
         set_uint32(0, buflen);
-        //add scilab version
-        add_version();
+        // set scilab version
+        set_version();
         return buf;
     }
 
-    void add_version()
+    /** @{ Set the file header without modifying the file size. */
+
+    void set_version()
     {
         set_byte(4, (unsigned char)SCI_VERSION_MAJOR);
         set_byte(5, (unsigned char)SCI_VERSION_MINOR);
@@ -49,6 +51,24 @@ private :
         set_byte(7, (unsigned char)0);
     }
 
+    void set_uint32(unsigned int pos, unsigned int n)
+    {
+        buf[pos++] = (n & 0xff);
+        n >>= 8;
+        buf[pos++] = (n & 0xff);
+        n >>= 8;
+        buf[pos++] = (n & 0xff);
+        n >>= 8;
+        buf[pos++] = (n & 0xff);
+    }
+
+    void set_byte(unsigned int pos, unsigned char n)
+    {
+        buf[pos] = n;
+    }
+
+    /** @} */
+
     void add_location(const Location& loc)
     {
         add_uint32(loc.first_line);
@@ -77,6 +97,8 @@ private :
         add_uint8(e.is_continuable());
     }
 
+    /** @{ Low-level append to the buffer functions */
+
     /* ensure that we have [size] bytes in the buffer */
     void need(int size)
     {
@@ -84,20 +106,25 @@ private :
         {
             bufsize = 2 * bufsize + size + FAGMENT_SIZE;
             unsigned char *newbuf = (unsigned char*) malloc(bufsize * sizeof(unsigned char));
+            // std::cerr << "malloc " << (void*) newbuf << " " << bufsize << " " << (void*) buf << " " << buflen << std::endl;
             if ( buflen > 0 )
             {
+                // std::cerr << "memcpy " << (void*) newbuf << " " << bufsize << " " << (void*) buf << " " << buflen << std::endl;
                 memcpy(newbuf, buf, buflen);
             }
             if ( buf != NULL)
             {
+                // std::cerr << "free " << (void*) newbuf << " " << bufsize << " " << (void*) buf << " " << buflen << std::endl;
                 free(buf);
             }
             else
             {
-                buflen = 8;    /* space for final size of buf ( 4 bytes ) + scilab version ( 4 bytes )*/
+                buflen = 8;    /* Header length. Header =  final size of buf ( 4 bytes ) + scilab version ( 4 bytes )*/
             }
             buf = newbuf;
         }
+
+        // std::cerr << "need " << size << " " << bufsize << " " << (void*) buf << " " << buflen << std::endl;
     }
 
     void add_byte(unsigned char n)
@@ -140,22 +167,6 @@ private :
         buflen += 8;
     }
 
-    void set_uint32(unsigned int pos, unsigned int n)
-    {
-        buf[pos++] = (n & 0xff);
-        n >>= 8;
-        buf[pos++] = (n & 0xff);
-        n >>= 8;
-        buf[pos++] = (n & 0xff);
-        n >>= 8;
-        buf[pos++] = (n & 0xff);
-    }
-
-    void set_byte(unsigned int pos, unsigned char n)
-    {
-        buf[pos] = n;
-    }
-
     void add_wstring(const std::wstring &w)
     {
         int size = (int)w.size();
@@ -167,6 +178,7 @@ private :
         buflen += final_size;
     }
 
+    /** @} */
 
     void add_exps(const std::list<Exp *> exps)
     {
index ed9ece0..f292b65 100644 (file)
@@ -425,8 +425,8 @@ bool Macro::operator==(const InternalType& it)
     unsigned char* macroSerial = serialMacro.serialize(false);
 
     //check buffer length
-    unsigned int oldSize = ((unsigned int*)oldSerial)[0] + sizeof(unsigned int);
-    unsigned int macroSize = ((unsigned int*)macroSerial)[0] + sizeof(unsigned int);
+    unsigned int oldSize = *((unsigned int*)oldSerial);
+    unsigned int macroSize = *((unsigned int*)macroSerial);
     if (oldSize != macroSize)
     {
         free(oldSerial);
@@ -434,7 +434,7 @@ bool Macro::operator==(const InternalType& it)
         return false;
     }
 
-    bool ret = (memcmp(oldSerial, macroSerial, oldSize + sizeof(unsigned int)) == 0);
+    bool ret = (memcmp(oldSerial, macroSerial, oldSize) == 0);
 
     free(oldSerial);
     free(macroSerial);
index 3918dc6..a01617e 100644 (file)
@@ -185,8 +185,8 @@ Function::ReturnValue sci_genlib(types::typed_list &in, int _iRetCount, types::t
             ast::SerializeVisitor* s = new ast::SerializeVisitor(parser.getTree());
 
             unsigned char* serialAst = s->serialize();
-            //buffer size is store size + lenght of size
-            unsigned int size = ((unsigned int*)serialAst)[0] + sizeof(unsigned int);
+            // Header is : buffer size (4 bytes) + scilab version (4 bytes)
+            unsigned int size = *((unsigned int*)serialAst);
 
             FILE* f = os_wfopen(stFullPathBin.c_str(), L"wb");
             fwrite(serialAst, 1, size, f);