Am Freitag, dem 11.04.2025 um 10:42 -0400 schrieb Andrew MacLeod:
> On 4/11/25 10:27, Qing Zhao wrote:
> > 
> > > On Apr 10, 2025, at 11:12, Martin Uecker <uec...@tugraz.at> wrote:
> > > 
> > > Am Donnerstag, dem 10.04.2025 um 10:55 -0400 schrieb Siddhesh Poyarekar:
> > > > On 2025-04-10 10:50, Andrew MacLeod wrote:
> > > > > Its not clear to me exactly what is being asked, but I think the
> > > > > suggestion is that pointer references are being replaced with a 
> > > > > builtin
> > > > > function called .ACCESS_WITH_SIZE ?    and I presume that builtin
> > > > > function has some parameters that give you relevant range information 
> > > > > of
> > > > > some sort?
> > > > Added, not replaced, but yes, that's essentially it.
> > > > 
> > > > > range-ops is setup to pull range information from builtin functions
> > > > > already in gimple-range-op.cc::
> > > > > gimple_range_op_handler::maybe_builtin_call ().  We'd just need to 
> > > > > write
> > > > > a handler for this new one.  You can pull information from 2 operands
> > > > > under normal circumstances, but exceptions can be made.    I'd need a
> > > > > description of what it looks like and how that translates to range 
> > > > > info.
> > > > That's perfect!  It's probably redundant for cases where we end up with
> > > > both .ACCESS_WITH_SIZE and a __bos/__bdos call, but I don't remember if
> > > > that's the only place where .ACCESS_WITH_SIZE is generated today.  Qing,
> > > > could you please work with Andrew on this?
> > > BTW, what I would find very interesting is inserting such information
> > > at the points where arrays decay to pointer.
> > Is the following the example?
> > 
> >    1 #include <stdio.h>
> >    2
> >    3 void foo (int arr[]) {
> >    4   // Inside the function, arr is treated as a pointer
> >    5   arr[6] = 10;
> >    6 }
> >    7
> >    8 int my_array[5] = {10, 20, 30, 40, 50};
> >    9
> >   10 int main() {
> >   11   my_array[6] = 6;
> >   12   int *ptr = my_array; // Array decays to pointer here
> >   13   ptr[7] = 7;
> >   14   foo (my_array);
> >   15   16   return 0;
> >   17 }
> > 
> > When I use the latest gcc to compile the above with -Warray-bounds:
> > 
> > []$ gcc -O2 -Warray-bounds t.c
> > t.c: In function ‘main’:
> > t.c:13:6: warning: array subscript 7 is outside array bounds of ‘int[5]’ 
> > [-Warray-bounds=]
> >     13 |   ptr[7] = 7;
> >        |   ~~~^~~
> > t.c:8:5: note: at offset 28 into object ‘my_array’ of size 20
> >      8 | int my_array[5] = {10, 20, 30, 40, 50};
> >        |     ^~~~~~~~
> > In function ‘foo’,
> >      inlined from ‘main’ at t.c:14:3:
> > t.c:5:10: warning: array subscript 6 is outside array bounds of ‘int[5]’ 
> > [-Warray-bounds=]
> >      5 |   arr[6] = 10;
> >        |   ~~~~~~~^~~~
> > t.c: In function ‘main’:
> > t.c:8:5: note: at offset 24 into object ‘my_array’ of size 20
> >      8 | int my_array[5] = {10, 20, 30, 40, 50};
> >        |     ^~~~~~~~
> > 
> > Looks like that even after the array decay to pointer, the bound 
> > information is still carried
> > for the decayed pointer somehow (I guess that vrp did this?)
> 
> No, the behaviour in these warnings is from something else. Although 
> some range info from VRP is used, most of this is tracked by the 
> pointer_query (pointer-query.cc) mechanism that was written a number of 
> years ago before ranger was completed.  It attempts to do its own custom 
> tracking of pointers and what they point to and the size of things they 
> access.
> 
> There are issues with that code, and the goal is to replace it with 
> rangers prange.  Alas there is enhancement work to prange for that to 
> happen as it doesnt currently track and points to info. That would then 
> be followed by converting the warning code to then use ranger/VRP instead.
> 
>   Any any adjustments to ranger for this are unlikely to affect anything 
> until that work is done, and I do not think anyone is equipped to 
> attempt to update the existing pointer-query code.
> 
> Unfortunately :-(

Examples I have in mind for the .ACCESS_WITH_SIZE are the
following two:

struct foo {

    char arr[3];
    int b;
};
 
void f(struct foo x)
{
    char *ptr = x.arr;
    ptr[4] = 10;
}

void g(char (*arr)[4])
{
    char *ptr = *arr;
    ptr[4] = 1;
}


Martin



Reply via email to