This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
PATCH: Fix SIZE_MAX, remove SIZE_MIN
- From: Mark Mitchell <mark at codesourcery dot com>
- To: newlib at sources dot redhat dot com
- Date: Sun, 27 Apr 2008 10:40:56 -0700
- Subject: PATCH: Fix SIZE_MAX, remove SIZE_MIN
- Reply-to: mark at codesourcery dot com
Newlib's <stdint.h> defines SIZE_MAX as a signed quantity equivalent
to LONG_MAX. This is incorrect; SIZE_MAX is supposed to be the
maximum value of a size_t and, as such, should be equilvalent to
ULONG_MAX. Furthermore, <stdint.h> defines SIZE_MIN, which is not a
macro specified by the C standard, and, as such, pollutes the user's
namespace.
Here's a patch to fix these problems, as well as creating a new test
case for the SIZE_MAX definition.
Tested on arm-none-eabi. OK to apply?
--
Mark Mitchell
CodeSourcery
mark@codesourcery.com
(650) 331-3385 x713
2008-04-26 Mark Mitchell <mark@codesourcery.com>
* libc/include/stdint.h (SIZE_MIN): Remove.
(SIZE_MAX): Define.
* testsuite/newlib.stdlib/stdlib.exp: New.
* testsuite/newlib.stdlib/size_max.c: Likewise.
Index: newlib/libc/include/stdint.h
===================================================================
--- newlib/libc/include/stdint.h (revision 205913)
+++ newlib/libc/include/stdint.h (working copy)
@@ -348,8 +348,7 @@ typedef unsigned long uintptr_t;
#endif
/* This must match size_t in stddef.h, currently long unsigned int */
-#define SIZE_MIN (-__STDINT_EXP(LONG_MAX) - 1L)
-#define SIZE_MAX __STDINT_EXP(LONG_MAX)
+#define SIZE_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1)
/* This must match sig_atomic_t in <signal.h> (currently int) */
#define SIG_ATOMIC_MIN (-__STDINT_EXP(INT_MAX) - 1)
Index: newlib/testsuite/newlib.stdlib/size_max.c
===================================================================
--- newlib/testsuite/newlib.stdlib/size_max.c (revision 0)
+++ newlib/testsuite/newlib.stdlib/size_max.c (revision 0)
@@ -0,0 +1,18 @@
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+int main () {
+ size_t s;
+
+ s = SIZE_MAX;
+ /* If SIZE_MAX is truncated when assigning to "s", then SIZE_MAX is
+ too big. */
+ if (s != SIZE_MAX)
+ abort ();
+ /* If SIZE_MAX + 1 is not zero, then SIZE_MAX is not big enough. */
+ if (++s != 0)
+ abort ();
+
+ return 0;
+}
Index: newlib/testsuite/newlib.stdlib/stdlib.exp
===================================================================
--- newlib/testsuite/newlib.stdlib/stdlib.exp (revision 0)
+++ newlib/testsuite/newlib.stdlib/stdlib.exp (revision 0)
@@ -0,0 +1,10 @@
+# Copyright (C) 2008 by CodeSourcery, Inc. All rights reserved.
+#
+# Permission to use, copy, modify, and distribute this software
+# is freely granted, provided that this notice is preserved.
+
+load_lib passfail.exp
+
+set exclude_list [list "atexit.c"]
+
+newlib_pass_fail_all -x $exclude_list