2016-08-30 17:34 GMT+02:00 Prathamesh Kulkarni <prathamesh.kulka...@linaro.org>: > On 30 August 2016 at 20:24, Tom de Vries <tom_devr...@mentor.com> wrote: >> On 26/08/16 13:39, Prathamesh Kulkarni wrote: >>> >>> Hi, >>> The following patch adds option -Wrestrict that warns when an argument >>> is passed to a restrict qualified parameter and it aliases with >>> another argument. >>> >>> eg: >>> int foo (const char *__restrict buf, const char *__restrict fmt, ...); >>> >>> void f(void) >>> { >>> char buf[100] = "hello"; >>> foo (buf, "%s-%s", buf, "world"); >>> } >> >> >> Does -Wrestrict generate a warning for this example? >> >> ... >> void h(int n, int * restrict p, int * restrict q, int * restrict r) >> { >> int i; >> for (i = 0; i < n; i++) >> p[i] = q[i] + r[i]; >> } >> >> h (100, a, b, b) >> ... >> >> [ Note that this is valid C, and does not violate the restrict definition. ] >> >> If -Wrestrict indeed generates a warning, then we should be explicit in the >> documentation that while the warning triggers on this type of example, the >> code is correct. > I am afraid it would warn for the above case. The patch just checks if > the parameter is qualified > with restrict, and if the corresponding argument has aliases in the > call (by calling operand_equal_p). > Is such code common in practice ? If it is, I wonder if we should keep > the warning in -Wall ? > > To avoid such false positives, we would need to track which arguments > are modified by the call. > I suppose that could be done with ipa mod/ref analysis (and moving the > warning to middle-end) ? > I tried looking into gcc sources but couldn't find where it's implemented.
I don't know either which pass can be used, but I guess it should be doable. If so, a first step would be to determine useless restrict-qualified args (and possibly warn for them), and then perform the current -Wrestrict analysis only on non-useless restrict-qualified args ? -- Fabien