Fixed uninitialized read while Save()
authornvalimak <nvalimak@3cdefd35-fc62-479d-8e8d-bae585ffb9ca>
Mon, 9 Feb 2009 13:27:10 +0000 (13:27 +0000)
committernvalimak <nvalimak@3cdefd35-fc62-479d-8e8d-bae585ffb9ca>
Mon, 9 Feb 2009 13:27:10 +0000 (13:27 +0000)
git-svn-id: svn+ssh://idea.nguyen.vg/svn/sxsi/trunk/TextCollection@164 3cdefd35-fc62-479d-8e8d-bae585ffb9ca

BSGAP.cpp
CSA.cpp

index 9a25b75..4a3d1c6 100644 (file)
--- a/BSGAP.cpp
+++ b/BSGAP.cpp
@@ -62,7 +62,9 @@ BSGAP::BSGAP(ulong *B, ulong u_, bool freeB, ulong sampleRate)
     ulong **tempP = new ulong * [n / b + 1];
     ulong *bitsInBSD = new ulong [n / b + 1];
     ulong totalBits = 0;
-    this->firstKeyA = new BlockArray(n/b + 1, Tools::CeilLog2(this->u));
+    // Number of nodes:
+    this->topCount = n%b ? n/b + 1: n/b;
+    this->firstKeyA = new BlockArray(topCount, Tools::CeilLog2(this->u));
     
     for (ulong i = 0; i < n/b; i ++)
     {
@@ -101,11 +103,10 @@ BSGAP::BSGAP(ulong *B, ulong u_, bool freeB, ulong sampleRate)
         (*firstKeyA)[n/b] = firstKey;
     }
 
-    // Number of nodes:
-    this->topCount = n%b ? n/b + 1: n/b;
-
     // Catenate binary trees into one bitvector
     this->P = new ulong[totalBits/W + 1];
+    for (ulong i = 0; i < totalBits/W + 1; ++i)
+        P[i] = 0;
     this->bitsInP = totalBits;
     ulong offset = 0;
     for (ulong i = 0; i < this->topCount ; ++i)
@@ -574,6 +575,8 @@ ulong * BSGAP::GetSubtree(ulong *B, ulong firstKey, ulong l, ulong r, ulong n, b
     // bits is the sum of keyBits, jumpBits, leftBits and rightBits 
     bits = keyBits + jumpBits + leftBits + rightBits;
     ulong *output = new ulong[bits / W + 1];
+    for (ulong i = 0; i < bits/W+1; ++i)
+        output[i] = 0;
     
     /**
      * Write "output"
@@ -732,9 +735,9 @@ void BSGAP::Save(FILE *file) const
     
     for (ulong offset = 0; offset < bitsInP/W+1; offset ++)
     {
-        if (std::fwrite(this->P+offset, sizeof(ulong), 1, file) != 1)
+        if (std::fwrite((this->P)+offset, sizeof(ulong), 1, file) != 1)
             throw std::runtime_error("BSGAP::Save(): file write error (P).");
-    }
+            }
 
     if (std::fwrite(&(this->b), sizeof(unsigned), 1, file) != 1)
         throw std::runtime_error("BSGAP::Save(): file write error (b).");
diff --git a/CSA.cpp b/CSA.cpp
index bdf97ef..5f69aa8 100644 (file)
--- a/CSA.cpp
+++ b/CSA.cpp
@@ -745,12 +745,12 @@ void CSA::Save(FILE *file) const
 
     if (std::fwrite(&(this->bwtEndPos), sizeof(TextPosition), 1, file) != 1)
         throw std::runtime_error("CSA::Save(): file write error (bwt end position).");
-
+    
     alphabetrank->save(file);
     sampled->Save(file);
     suffixes->Save(file);
     suffixDocId->Save(file);
-
+    
     if (std::fwrite(&(this->numberOfTexts), sizeof(unsigned), 1, file) != 1)
         throw std::runtime_error("CSA::Save(): file write error (numberOfTexts).");
     if (std::fwrite(&(this->numberOfAllTexts), sizeof(unsigned), 1, file) != 1)
@@ -760,6 +760,7 @@ void CSA::Save(FILE *file) const
 
     endmarkerDocId->Save(file);
     emptyTextRank->Save(file);
+    fflush(file);
 }