PATCH: Fix SIZE_MAX, remove SIZE_MIN

Jeff Johnston jjohnstn@redhat.com
Wed Apr 30 02:54:00 GMT 2008


Mark Mitchell wrote:
> 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?
>
>   

Ok, thanks.

-- Jeff J.
> --
> 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
>   



More information about the Newlib mailing list