/* 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
}
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 );
dlrStep(pReader);
}
static void dlrDestroy(DLReader *pReader){
-#ifndef NDEBUG
- memset(pReader, 0x55, sizeof(pReader));
-#endif
+ SCRAMBLE(pReader);
}
#ifndef NDEBUG
#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){
plrStep(pReader);
}
static void plrDestroy(PLReader *pReader){
-#ifndef NDEBUG
- memset(pReader, 0x55, sizeof(pReader));
-#endif
+ SCRAMBLE(pReader);
}
/*******************************************************************/
}
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);
** 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;
}
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 */
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
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.
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;
InteriorWriter *pWriter){
InteriorBlock *block;
assert( iHeight>0 );
- memset(pWriter, 0, sizeof(*pWriter));
+ CLEAR(pWriter);
pWriter->iHeight = iHeight;
#ifndef NDEBUG
dataBufferDestroy(&b->data);
free(b);
}
-#ifndef NDEBUG
- memset(pWriter, 0x55, sizeof(pWriter));
-#endif
+ SCRAMBLE(pWriter);
return SQLITE_OK;
}
} InteriorReader;
static void interiorReaderDestroy(InteriorReader *pReader){
-#ifndef NDEBUG
- memset(pReader, 0x55, sizeof(pReader));
-#endif
+ SCRAMBLE(pReader);
}
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);
char c[VARINT_MAX];
int n;
- memset(pWriter, 0, sizeof(*pWriter));
+ CLEAR(pWriter);
pWriter->iLevel = iLevel;
pWriter->idx = idx;
static void leafReaderDestroy(LeafReader *pReader){
dataBufferDestroy(&pReader->term);
-#ifndef NDEBUG
- memset(pReader, 0x55, sizeof(pReader));
-#endif
+ SCRAMBLE(pReader);
}
static int leafReaderAtEnd(LeafReader *pReader){
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);
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
sqlite_int64 iEndBlockid,
const char *pRootData, int nRootData,
LeavesReader *pReader){
- memset(pReader, 0, sizeof(*pReader));
+ CLEAR(pReader);
pReader->idx = idx;
dataBufferInit(&pReader->rootData, 0);
-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
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
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