Re: [switch conv] Bootsrap error because of the (CERT) pointer wraparound warning

2008-04-30 Thread Martin Jambor
On Mon, Apr 28, 2008 at 05:59:54PM -0700, Ian Lance Taylor wrote:
 
 The warnings I added for the CERT advisory say assuming pointer
 wraparound does not occur  You are running into one of the older
 signed overflow warnings.
 

Oh, sorry for that oversight.  It has started happening (when testing
exactly the same  code) shortly after the CERT patch got  in and so I
got misled.

 
 Make branch_num an unsigned int.
 

That did it.

Thank you,

Martin


[switch conv] Bootsrap error because of the (CERT) pointer wraparound warning

2008-04-28 Thread Martin Jambor
Hi,

I've been  rebootstrapping my switch conversion patch  (which is still
waiting for  review) to make  sure it still works.   Unfortunately, it
did not.  The error given was  the following and I believe this is the
warning introduced by Ian as a response to the infamous CERT advisory.
(Furthermore, I am  getting this warning at revision  134664 but I was
not getting it at 134135.)

--- Compiler output ---
/cswtch/gcc/. -I/abuild/mjambor/cswtch/gcc/../include 
-I/abuild/mjambor/cswtch/gcc/../libcpp/include  
-I/abuild/mjambor/cswtch/gcc/../libdecnumber 
-I/abuild/mjambor/cswtch/gcc/../libdecnumber/bid -I../libdecnumber  
/abuild/mjambor/cswtch/gcc/tree-switch-conversion.c -o tree-switch-conversion.o
cc1: warnings being treated as errors
/abuild/mjambor/cswtch/gcc/tree-switch-conversion.c: In function 
'process_switch':
/abuild/mjambor/cswtch/gcc/tree-switch-conversion.c:182: error: assuming signed 
overflow does not occur when assuming that (X - c)  X is always false
make[3]: *** [tree-switch-conversion.o] Error 1
- End -

The whole switch conversion patch can be found at:
http://gcc.gnu.org/ml/gcc-patches/2008-04/msg00863.html.  The code
that triggers the warning is the following, line 182 is the last one
in this snippet:

static bool 
check_range (tree swtch) /* swtch is a SWITCH_EXPR */
{
  tree min_case, max_case;
  tree cases = SWITCH_LABELS (swtch);
  int branch_num = TREE_VEC_LENGTH (cases);

  min_case = TREE_VEC_ELT (cases, 0);
  info.range_min = CASE_LOW (min_case);

  gcc_assert (branch_num  1);
  gcc_assert (CASE_LOW (TREE_VEC_ELT (cases, branch_num - 1)) == NULL_TREE);
  max_case = TREE_VEC_ELT (cases, branch_num - 2); 

Now the fundamental question is,  am I doing something wrong?  My best
guess is  that this is only  a very unfortunate bogus  instance of the
warning.  When checking is not enabled, TREE_VEC_ELT(T, I) is expanded
to  ((T)-vec.a[I]) and  given  that branch_num  holds  the number  of
vector elements, I am certainly accessing an item inside the array.

On the contrary, bootstrapping is done with checking on and so
TREE_VEC_ELT expands to much more complex thing:

#define TREE_VEC_ELT_CHECK(T, I) __extension__  \
(*({__typeof (T) const __t = (T);   \
const int __i = (I);\
if (TREE_CODE (__t) != TREE_VEC)\
  tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, \
 TREE_VEC, 0);  \
if (__i  0 || __i = __t-vec.length)  \
  tree_vec_elt_check_failed (__i, __t-vec.length,  \
 __FILE__, __LINE__, __FUNCTION__); \
__t-vec.a[__i]; }))

And I  guess that the second  condition triggers the  warning which is
then treated like an error.

Having  said the  above, I  do not  know why  the TREE_VEC_ELT  on the
previous line does not trigger the warning.

In the end, I basically have these questions:
  1. Am I doing something wrong?
  2. How can I get rid of the error and bootstrap my code? 
  3. If the warning is really bogus, should we perhaps turn it off for
 bootstrap, (or  turn it  off by default  in general and  leave it
 there for people who want  to check their code after reading CERT
 advisories)?
  
Thank you,

Martin


Re: [switch conv] Bootsrap error because of the (CERT) pointer wraparound warning

2008-04-28 Thread Ian Lance Taylor
Martin Jambor [EMAIL PROTECTED] writes:

 I've been  rebootstrapping my switch conversion patch  (which is still
 waiting for  review) to make  sure it still works.   Unfortunately, it
 did not.  The error given was  the following and I believe this is the
 warning introduced by Ian as a response to the infamous CERT advisory.
 (Furthermore, I am  getting this warning at revision  134664 but I was
 not getting it at 134135.)

 --- Compiler output ---
 /cswtch/gcc/. -I/abuild/mjambor/cswtch/gcc/../include 
 -I/abuild/mjambor/cswtch/gcc/../libcpp/include  
 -I/abuild/mjambor/cswtch/gcc/../libdecnumber 
 -I/abuild/mjambor/cswtch/gcc/../libdecnumber/bid -I../libdecnumber  
 /abuild/mjambor/cswtch/gcc/tree-switch-conversion.c -o 
 tree-switch-conversion.o
 cc1: warnings being treated as errors
 /abuild/mjambor/cswtch/gcc/tree-switch-conversion.c: In function 
 'process_switch':
 /abuild/mjambor/cswtch/gcc/tree-switch-conversion.c:182: error: assuming 
 signed overflow does not occur when assuming that (X - c)  X is always false
 make[3]: *** [tree-switch-conversion.o] Error 1
 - End -

The warnings I added for the CERT advisory say assuming pointer
wraparound does not occur  You are running into one of the older
signed overflow warnings.

   1. Am I doing something wrong?

No.

   2. How can I get rid of the error and bootstrap my code? 

Make branch_num an unsigned int.

   3. If the warning is really bogus, should we perhaps turn it off for
  bootstrap, (or  turn it  off by default  in general and  leave it
  there for people who want  to check their code after reading CERT
  advisories)?

The basic criteria for -Wall is: could indicate a problem, easy to
rewrite code to avoid.  You've encountered a false positive, but it's
easy to avoid.

Ian