]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Make memset() uses less error-prone.
authorshess <shess@noemail.net>
Thu, 26 Oct 2006 00:04:31 +0000 (00:04 +0000)
committershess <shess@noemail.net>
Thu, 26 Oct 2006 00:04:31 +0000 (00:04 +0000)
http://www.sqlite.org/cvstrac/tktview?tn=2036,35 describes some cases
where we were passing memset() a length which was the sizeof a
pointer, rather than the structure pointed to.  Instead, wrap this
idiom up in CLEAR() and SCRAMBLE() macros. (CVS 3488)

FossilOrigin-Name: 5878add0839f9c5bec77caae2361ec20cb60b48b

ext/fts2/fts2.c
manifest
manifest.uuid

index 7f1de9cf5f71237cb051c718f9253d05f5d9ca5a..eb303aa0f6426c6c5378dd67656a33421cc74245 100644 (file)
@@ -329,6 +329,22 @@ enum {
 
 /* utility functions */
 
+/* CLEAR() and SCRAMBLE() abstract memset() on a pointer to a single
+** record to prevent errors of the form:
+**
+** my_function(SomeType *b){
+**   memset(b, '\0', sizeof(b));  // sizeof(b)!=sizeof(*b)
+** }
+*/
+/* TODO(shess) Obvious candidates for a header file. */
+#define CLEAR(b) memset(b, '\0', sizeof(*(b)))
+
+#ifndef NDEBUG
+#  define SCRAMBLE(b) memset(b, 0x55, sizeof(*(b)))
+#else
+#  define SCRAMBLE(b)
+#endif
+
 /* We may need up to VARINT_MAX bytes to store an encoded 64-bit integer. */
 #define VARINT_MAX 10
 
@@ -405,9 +421,7 @@ static void dataBufferReset(DataBuffer *pBuffer){
 }
 static void dataBufferDestroy(DataBuffer *pBuffer){
   if( pBuffer->pData!=NULL ) free(pBuffer->pData);
-#ifndef NDEBUG
-  memset(pBuffer, 0x55, sizeof(*pBuffer));
-#endif
+  SCRAMBLE(pBuffer);
 }
 static void dataBufferExpand(DataBuffer *pBuffer, int nAddCapacity){
   assert( nAddCapacity>0 );
@@ -623,9 +637,7 @@ static void dlrInit(DLReader *pReader, DocListType iType,
   dlrStep(pReader);
 }
 static void dlrDestroy(DLReader *pReader){
-#ifndef NDEBUG
-  memset(pReader, 0x55, sizeof(pReader));
-#endif
+  SCRAMBLE(pReader);
 }
 
 #ifndef NDEBUG
@@ -703,9 +715,7 @@ static void dlwInit(DLWriter *pWriter, DocListType iType, DataBuffer *b){
 #endif
 }
 static void dlwDestroy(DLWriter *pWriter){
-#ifndef NDEBUG
-  memset(pWriter, 0x55, sizeof(pWriter));
-#endif
+  SCRAMBLE(pWriter);
 }
 static void dlwAppend(DLWriter *pWriter,
                       const char *pData, int nData){
@@ -840,9 +850,7 @@ static void plrInit(PLReader *pReader, DocListType iType,
   plrStep(pReader);
 }
 static void plrDestroy(PLReader *pReader){
-#ifndef NDEBUG
-  memset(pReader, 0x55, sizeof(pReader));
-#endif
+  SCRAMBLE(pReader);
 }
 
 /*******************************************************************/
@@ -925,9 +933,7 @@ static PLWriter *plwNew(sqlite_int64 iDocid, DocListType iType){
 }
 static void plwDestroy(PLWriter *pWriter){
   dataBufferDestroy(&pWriter->b);
-#ifndef NDEBUG
-  memset(pWriter, 0x55, sizeof(pWriter));
-#endif
+  SCRAMBLE(pWriter);
 }
 static void plwDelete(PLWriter *pWriter){
   plwDestroy(pWriter);
@@ -2352,7 +2358,7 @@ static int parseSpec(TableSpec *pSpec, int argc, const char *const*argv,
   ** The argv[][] array is read-only and transient.  We can write to the
   ** copy in order to modify things and the copy is persistent.
   */
-  memset(pSpec, 0, sizeof(*pSpec));
+  CLEAR(pSpec);
   for(i=n=0; i<argc; i++){
     n += strlen(argv[i]) + 1;
   }
@@ -2467,7 +2473,7 @@ static int constructVtab(
 
   v = (fulltext_vtab *) malloc(sizeof(fulltext_vtab));
   if( v==0 ) return SQLITE_NOMEM;
-  memset(v, 0, sizeof(*v));
+  CLEAR(v);
   /* sqlite will initialize v->base */
   v->db = db;
   v->zName = spec->zName;   /* Freed when azColumn is freed */
@@ -2658,7 +2664,7 @@ static void queryClear(Query *q){
     free(q->pTerms[i].pTerm);
   }
   free(q->pTerms);
-  memset(q, 0, sizeof(*q));
+  CLEAR(q);
 }
 
 /* Free all of the dynamically allocated memory held by the
@@ -2668,7 +2674,7 @@ static void snippetClear(Snippet *p){
   free(p->aMatch);
   free(p->zOffset);
   free(p->zSnippet);
-  memset(p, 0, sizeof(*p));
+  CLEAR(p);
 }
 /*
 ** Append a single entry to the p->aMatch[] log.
@@ -3119,7 +3125,7 @@ static void queryAdd(Query *q, const char *pTerm, int nTerm){
     return;
   }
   t = &q->pTerms[q->nTerms - 1];
-  memset(t, 0, sizeof(*t));
+  CLEAR(t);
   t->pTerm = malloc(nTerm+1);
   memcpy(t->pTerm, pTerm, nTerm);
   t->pTerm[nTerm] = 0;
@@ -3644,7 +3650,7 @@ static void interiorWriterInit(int iHeight, const char *pTerm, int nTerm,
                                InteriorWriter *pWriter){
   InteriorBlock *block;
   assert( iHeight>0 );
-  memset(pWriter, 0, sizeof(*pWriter));
+  CLEAR(pWriter);
 
   pWriter->iHeight = iHeight;
 #ifndef NDEBUG
@@ -3691,9 +3697,7 @@ static int interiorWriterDestroy(InteriorWriter *pWriter){
     dataBufferDestroy(&b->data);
     free(b);
   }
-#ifndef NDEBUG
-  memset(pWriter, 0x55, sizeof(pWriter));
-#endif
+  SCRAMBLE(pWriter);
   return SQLITE_OK;
 }
 
@@ -3758,9 +3762,7 @@ typedef struct InteriorReader {
 } InteriorReader;
 
 static void interiorReaderDestroy(InteriorReader *pReader){
-#ifndef NDEBUG
-  memset(pReader, 0x55, sizeof(pReader));
-#endif
+  SCRAMBLE(pReader);
 }
 
 static void interiorReaderInit(const char *pData, int nData,
@@ -3771,7 +3773,7 @@ static void interiorReaderInit(const char *pData, int nData,
   assert( nData>0 );
   assert( pData[0]!='\0' );
 
-  memset(pReader, '\0', sizeof(pReader));
+  CLEAR(pReader);
 
   /* Decode the base blockid, and set the cursor to the first term. */
   n = getVarint(pData+1, &pReader->iBlockid);
@@ -3860,7 +3862,7 @@ static void leafWriterInit(int iLevel, int idx, LeafWriter *pWriter){
   char c[VARINT_MAX];
   int n;
 
-  memset(pWriter, 0, sizeof(*pWriter));
+  CLEAR(pWriter);
   pWriter->iLevel = iLevel;
   pWriter->idx = idx;
 
@@ -4265,9 +4267,7 @@ typedef struct LeafReader {
 
 static void leafReaderDestroy(LeafReader *pReader){
   dataBufferDestroy(&pReader->term);
-#ifndef NDEBUG
-  memset(pReader, 0x55, sizeof(pReader));
-#endif
+  SCRAMBLE(pReader);
 }
 
 static int leafReaderAtEnd(LeafReader *pReader){
@@ -4304,7 +4304,7 @@ static void leafReaderInit(const char *pData, int nData,
   assert( nData>0 );
   assert( pData[0]=='\0' );
 
-  memset(pReader, '\0', sizeof(pReader));
+  CLEAR(pReader);
 
   /* Read the first term, skipping the header byte. */
   n = getVarint32(pData+1, &nTerm);
@@ -4400,9 +4400,7 @@ static int leavesReaderAtEnd(LeavesReader *pReader){
 static void leavesReaderDestroy(LeavesReader *pReader){
   leafReaderDestroy(&pReader->leafReader);
   dataBufferDestroy(&pReader->rootData);
-#ifndef NDEBUG
-  memset(pReader, 0x55, sizeof(pReader));
-#endif
+  SCRAMBLE(pReader);
 }
 
 /* Initialize pReader with the given root data (if iStartBlockid==0
@@ -4415,7 +4413,7 @@ static int leavesReaderInit(fulltext_vtab *v,
                             sqlite_int64 iEndBlockid,
                             const char *pRootData, int nRootData,
                             LeavesReader *pReader){
-  memset(pReader, 0, sizeof(*pReader));
+  CLEAR(pReader);
   pReader->idx = idx;
 
   dataBufferInit(&pReader->rootData, 0);
index be8cc5da7b5f077765b70ba177e05452b217f6ca..4d5d02d7ab1af2f4372c0ebddffe06a6a882b0fb 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\sunreferenced\slocal\svariable.\s(CVS\s3487)
-D 2006-10-25T23:22:04
+C Make\smemset()\suses\sless\serror-prone.\nhttp://www.sqlite.org/cvstrac/tktview?tn=2036,35\sdescribes\ssome\scases\nwhere\swe\swere\spassing\smemset()\sa\slength\swhich\swas\sthe\ssizeof\sa\npointer,\srather\sthan\sthe\sstructure\spointed\sto.\s\sInstead,\swrap\sthis\nidiom\sup\sin\sCLEAR()\sand\sSCRAMBLE()\smacros.\s(CVS\s3488)
+D 2006-10-26T00:04:31
 F Makefile.in 4379c909d46b38b8c5db3533084601621d4f14b2
 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -33,7 +33,7 @@ F ext/fts1/fulltext.h 08525a47852d1d62a0be81d3fc3fe2d23b094efd
 F ext/fts1/simple_tokenizer.c 1844d72f7194c3fd3d7e4173053911bf0661b70d
 F ext/fts1/tokenizer.h 0c53421b832366d20d720d21ea3e1f6e66a36ef9
 F ext/fts2/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
-F ext/fts2/fts2.c f3d0b37ba8c46ca93347066b99a440145a5a4845
+F ext/fts2/fts2.c bee8988db6a97104d86ad7e025f1b6e80e4aa41a
 F ext/fts2/fts2.h bbdab26d34f91974d5b9ade8b7836c140a7c4ce1
 F ext/fts2/fts2_hash.c b3f22116d4ef0bc8f2da6e3fdc435c86d0951a9b
 F ext/fts2/fts2_hash.h e283308156018329f042816eb09334df714e105e
@@ -419,7 +419,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P af5bfb986e39248abbfc6fff2e13c6f9e634a751
-R 73cf88c7c9731e5b1854a60f83bf6d34
+P 2d3b22197c7c06488b789cce333b34b6d1ae39aa
+R c18224b43b58b956ecd0a15ea9ad3008
 U shess
-Z bcb114a3f40e115c505e69af1ff62ca0
+Z 69630a14b82d73d5314cd0d1d7882fb7
index 7be1952024292cda70151c5924412a139856a4e0..2657b2c17ba294a85d8b81b05d300d8f8bdbee63 100644 (file)
@@ -1 +1 @@
-2d3b22197c7c06488b789cce333b34b6d1ae39aa
\ No newline at end of file
+5878add0839f9c5bec77caae2361ec20cb60b48b
\ No newline at end of file