From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20001 invoked by alias); 26 Jul 2007 22:01:31 -0000 Received: (qmail 19969 invoked by uid 22791); 26 Jul 2007 22:01:30 -0000 X-Spam-Check-By: sourceware.org Received: from sunsite.ms.mff.cuni.cz (HELO sunsite.mff.cuni.cz) (195.113.15.26) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 26 Jul 2007 22:01:28 +0000 Received: from sunsite.mff.cuni.cz (localhost.localdomain [127.0.0.1]) by sunsite.mff.cuni.cz (8.13.8/8.13.8) with ESMTP id l6QM5jdL028118; Fri, 27 Jul 2007 00:05:45 +0200 Received: (from jakub@localhost) by sunsite.mff.cuni.cz (8.13.8/8.13.8/Submit) id l6QM5ib4028117; Fri, 27 Jul 2007 00:05:44 +0200 Date: Thu, 26 Jul 2007 22:01:00 -0000 From: Jakub Jelinek To: Ulrich Drepper Cc: Glibc hackers Subject: [PATCH] Warning patrol - misc things Message-ID: <20070726220544.GN4603@sunsite.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.2i Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2007-07/txt/msg00048.txt.bz2 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 * 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 , 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 , 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