[patch] memset.c: Make memset safe even if sizeof (int) = 2.
Kazu Hirata
kazu@cs.umass.edu
Mon Nov 25 12:25:00 GMT 2002
Hi,
Attached is a patch to make memset safe even if sizeof (int) = 2.
A part of memset says
buffer = (c << 8) | c;
buffer |= (buffer << 16);
Playing with H8 port, where sizeof (int) = 2, shows that if c = 0x80
is given, then the value of buffer would be 0xffff8080 instead of
0x80808080 because "(c << 8) | c", which is 0x8080, is sign-extended
to a 32-bit signed integer.
I don't know the exact specification of the C language as to whether a
value should be sign-extended when the resulting type is unsigned, but
the patch makes this issue irrelevant by first making a copy of c into
d, which is unsigned.
OK to apply?
Thanks,
p.s.
Actually, the H8 port does not use this memset because newlib has the
assembly language version for H8, but the patch should be useful for
other ports.
Kazu Hirata
2002-11-25 Kazu Hirata <kazu@cs.umass.edu>
* libc/string/memset.c (memset): Make it safe even if
sizeof (2) = 2.
Index: memset.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/string/memset.c,v
retrieving revision 1.2
diff -c -r1.2 memset.c
*** memset.c 24 Aug 2000 16:25:36 -0000 1.2
--- memset.c 25 Nov 2002 20:17:27 -0000
***************
*** 71,77 ****
c &= 0xff;
if (LBLOCKSIZE == 4)
{
! buffer = (c << 8) | c;
buffer |= (buffer << 16);
}
else
--- 71,78 ----
c &= 0xff;
if (LBLOCKSIZE == 4)
{
! unsigned int d = c;
! buffer = (d << 8) | d;
buffer |= (buffer << 16);
}
else
More information about the Newlib
mailing list