On Sun, 2005-08-21 at 20:32 +0200, Falk Hueffner wrote: > Hi, > > I'm trying to implement a tree pass that warns about bad array > accesses as suggested for PR 8268 by Jeff Law. However, I have trouble > with the following: > > char digit_vector[5]; > const char *ggc_alloc_string(int length) { > return digit_vector + ((length - 17) * 2); > } > > this translates to: > > ggc_alloc_string (length) > { > const char * D.1292; > int D.1293; > long unsigned int D.1294; > char * D.1295; > char * D.1296; > > D.1293 = length * 2; > D.1294 = (long unsigned int) D.1293; > D.1295 = (char *) D.1294; > D.1296 = &digit_vector + -34B; <----------- > D.1292 = D.1295 + D.1296; > return D.1292; > } > > that is, a pointer is formed that wouldn't be legal to form from C, > and we end up with > > return (char *) (long unsigned int) (length * 2) + > &digit_vector[-000000022]; IIRC creating an invalid pointer is OK -- dereferencing the pointer is what's bad. You need to focus on array accesses, pointer dereferences and the like, not pointer generation.
Warning for pointer generation is going to be a *lot* harder and I suspect will always result in more false positives. > producing a warning. Is that correct GIMPLE? If so, I fear it simply > isn't possible to do this kind of warnings after gimplification, and, > if at all possible, would have to be done in the front-end after all. Putting these warnings in the front-end is IMHO wrong. They belong in the generic parts of the compiler. Jeff