From: shess Date: Thu, 26 Oct 2006 00:04:31 +0000 (+0000) Subject: Make memset() uses less error-prone. X-Git-Tag: version-3.6.10~2680 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9d5586fc9f90d6d84e9678b3818a18272a6730d1;p=thirdparty%2Fsqlite.git Make memset() uses less error-prone. 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 --- diff --git a/ext/fts2/fts2.c b/ext/fts2/fts2.c index 7f1de9cf5f..eb303aa0f6 100644 --- a/ext/fts2/fts2.c +++ b/ext/fts2/fts2.c @@ -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; ibase */ 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); diff --git a/manifest b/manifest index be8cc5da7b..4d5d02d7ab 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 7be1952024..2657b2c17b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2d3b22197c7c06488b789cce333b34b6d1ae39aa \ No newline at end of file +5878add0839f9c5bec77caae2361ec20cb60b48b \ No newline at end of file