> On Apr 11, 2025, at 10:42, Andrew MacLeod <amacl...@redhat.com> wrote: > > > 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?) > Just tried to disable tree-vrp by adding -fno-tree-vrp, all the above warnings disappeared.
[]$ gcc -O2 -Warray-bounds -fno-tree-vrp t.c []$ Looks like tree-vrp tracks the bound information for this testing case. > 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. What’s the relationship between pointer_query and VRP? Is pointer_query part of VRP? Disable VRP also disable pointer_query? thanks. Qing > > 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 :-( > > Andrew > >