This is the mail archive of the libc-hacker@sourceware.org mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi! In ld-monetary gcc complains about signed_char_var < -128 || signed_char_var > 127 check which is always false due to signed char range. The patch below just disables range checking for the two vars that want full signed char range to be allowed. If we want to do any range checking even there, we'd need to check much earlier (when the unsigned long val.num is assigned to the signed char, see whether we lost any bits in the conversion). The rest are aliasing violations. In the first two cases the patch will give a few cycle hit in functions that take a lot of time to execute though, copying two longs isn't IMHO too expensive over possibility of incorrectly generated code. The last one is also aliasing violation, solved by peeling off the first iteration. 2007-07-26 Jakub Jelinek <jakub@redhat.com> * locale/programs/ld-monetary.c (monetary_finish): Avoid range check for int_frac_digits and frac_digits. * login/logout.c (logout): Avoid aliasing violation. * login/logwtmp.c (logwtmp): Likewise. * libio/genops.c (_IO_un_link): Avoid aliasing violation. --- libc/locale/programs/ld-monetary.c.jj 2007-07-16 09:58:46.000000000 +0200 +++ libc/locale/programs/ld-monetary.c 2007-07-26 18:57:19.000000000 +0200 @@ -1,4 +1,5 @@ -/* Copyright (C) 1995-1999,2000,2001,2002,2005 Free Software Foundation, Inc. +/* Copyright (C) 1995-1999,2000,2001,2002,2005,2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -279,13 +280,14 @@ not correspond to a valid name in ISO 42 monetary->cat = initval; \ } \ else if ((monetary->cat < min || monetary->cat > max) \ + && min < max \ && !be_quiet && !nothing) \ WITH_CUR_LOCALE (error (0, 0, _("\ %s: value for field `%s' must be in range %d...%d"), \ "LC_MONETARY", #cat, min, max)) - TEST_ELEM (int_frac_digits, -128, 127, -1); - TEST_ELEM (frac_digits, -128, 127, -1); + TEST_ELEM (int_frac_digits, 1, 0, -1); + TEST_ELEM (frac_digits, 1, 0, -1); TEST_ELEM (p_cs_precedes, -1, 1, -1); TEST_ELEM (p_sep_by_space, -1, 2, -1); TEST_ELEM (n_cs_precedes, -1, 1, -1); --- libc/login/logout.c.jj 2002-10-24 01:49:21.000000000 +0200 +++ libc/login/logout.c 2007-07-26 13:17:14.000000000 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 2002, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -51,15 +51,10 @@ logout (const char *line) bzero (ut->ut_host, sizeof ut->ut_host); #endif #if _HAVE_UT_TV - 0 - if (sizeof (ut->ut_tv) == sizeof (struct timeval)) - __gettimeofday ((struct timeval *) &ut->ut_tv, NULL); - else - { struct timeval tv; __gettimeofday (&tv, NULL); ut->ut_tv.tv_sec = tv.tv_sec; ut->ut_tv.tv_usec = tv.tv_usec; - } #else ut->ut_time = time (NULL); #endif --- libc/login/logwtmp.c.jj 2002-10-24 01:49:21.000000000 +0200 +++ libc/login/logwtmp.c 2007-07-26 13:17:14.000000000 +0200 @@ -44,15 +44,10 @@ logwtmp (const char *line, const char *n #endif #if _HAVE_UT_TV - 0 - if (sizeof (ut.ut_tv) == sizeof (struct timeval)) - __gettimeofday ((struct timeval *) &ut.ut_tv, NULL); - else - { - struct timeval tv; - __gettimeofday (&tv, NULL); - ut.ut_tv.tv_sec = tv.tv_sec; - ut.ut_tv.tv_usec = tv.tv_usec; - } + struct timeval tv; + __gettimeofday (&tv, NULL); + ut.ut_tv.tv_sec = tv.tv_sec; + ut.ut_tv.tv_usec = tv.tv_usec; #else ut.ut_time = time (NULL); #endif --- libc/libio/genops.c.jj 2007-04-23 10:54:00.000000000 +0200 +++ libc/libio/genops.c 2007-07-26 13:17:14.000000000 +0200 @@ -64,23 +64,29 @@ _IO_un_link (fp) { if (fp->file._flags & _IO_LINKED) { - struct _IO_FILE_plus **f; + struct _IO_FILE **f; #ifdef _IO_MTSAFE_IO _IO_cleanup_region_start_noarg (flush_cleanup); _IO_lock_lock (list_all_lock); run_fp = (_IO_FILE *) fp; _IO_flockfile ((_IO_FILE *) fp); #endif - for (f = &INTUSE(_IO_list_all); *f; - f = (struct _IO_FILE_plus **) &(*f)->file._chain) + if (INTUSE(_IO_list_all) == NULL) + ; + else if (fp == INTUSE(_IO_list_all)) { - if (*f == fp) + INTUSE(_IO_list_all) + = (struct _IO_FILE_plus *) INTUSE(_IO_list_all)->file._chain; + ++_IO_list_all_stamp; + } + else + for (f = &INTUSE(_IO_list_all)->file._chain; *f; f = &(*f)->_chain) + if (*f == (_IO_FILE *) fp) { - *f = (struct _IO_FILE_plus *) fp->file._chain; + *f = fp->file._chain; ++_IO_list_all_stamp; break; } - } fp->file._flags &= ~_IO_LINKED; #ifdef _IO_MTSAFE_IO _IO_funlockfile ((_IO_FILE *) fp); Jakub
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |