postgres.git / summary / log / commit / refs
commit 183b1bf84f127f420451f9eb0bc74c86af238cfa
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon Jul 18 15:53:46 2005 +0000
First released in: 8.1.0, 7.3.11, 7.4.9, 8.0.4
MemSet() must not cast its pointer argument to int32* until after it has
checked that the pointer is actually word-aligned. Casting a non-aligned
pointer to int32* is technically illegal per the C spec, and some recent
versions of gcc actually generate bad code for the memset() when given
such a pointer. Per report from Andrew Morrow.
src/include/c.h | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/include/c.h b/src/include/c.h
index 5f884d8f2f0..08ce6dd243f 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -12,7 +12,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/c.h,v 1.178 2004/12/31 22:03:18 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/c.h,v 1.178.4.1 2005/07/18 15:53:46 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -593,21 +593,22 @@ typedef NameData *Name;
#define MemSet(start, val, len) \
do \
{ \
- int32 * _start = (int32 *) (start); \
+ void *_vstart = (void *) (start); \
int _val = (val); \
Size _len = (len); \
\
- if ((((long) _start) & INT_ALIGN_MASK) == 0 && \
+ if ((((long) _vstart) & INT_ALIGN_MASK) == 0 && \
(_len & INT_ALIGN_MASK) == 0 && \
_val == 0 && \
_len <= MEMSET_LOOP_LIMIT) \
{ \
- int32 * _stop = (int32 *) ((char *) _start + _len); \
+ int32 *_start = (int32 *) _vstart; \
+ int32 *_stop = (int32 *) ((char *) _start + _len); \
while (_start < _stop) \
*_start++ = 0; \
} \
else \
- memset((char *) _start, _val, _len); \
+ memset(_vstart, _val, _len); \
} while (0)
#define MEMSET_LOOP_LIMIT 1024
[parent: f6cb7198edd2]