ziqingluo-90 added inline comments.

================
Comment at: 
clang/test/SemaCXX/warn-unsafe-buffer-usage-fixits-multi-parm-span.cpp:13-15
+   expected-note{{change type of 'p' to 'std::span' to preserve bounds 
information, and change 'q' and 'a' to 'std::span' to propagate bounds 
information between them}} \
+   expected-note{{change type of 'q' to 'std::span' to preserve bounds 
information, and change 'p' and 'a' to 'std::span' to propagate bounds 
information between them}} \
+   expected-note{{change type of 'a' to 'std::span' to preserve bounds 
information, and change 'p' and 'q' to 'std::span' to propagate bounds 
information between them}}
----------------
ziqingluo-90 wrote:
> NoQ wrote:
> > QoL thing: //"to propagate bounds information between them"// isn't the 
> > correct reason in this case. Bounds information doesn't propagate between 
> > `p` and `q` and `a`. Each of them carries its own, completely unrelated 
> > bounds information.
> > 
> > We need to come up with a different reason. Or it might be better to 
> > combine the warnings into one warning here, so that we didn't need a reason:
> > ```
> > warning: 'p', 'q' and 'a' are unsafe pointers used for buffer access
> > note: change type of 'p', 'q' and 'a' to 'std::span' to preserve bounds 
> > information
> > ```
> > 
> > This gets a bit worse when parameters are implicated indirectly, but it 
> > still mostly works fine, for example:
> > ```
> > void foo(int *p, int *q) {
> >   int *p2 = p;
> >   p2[5] = 7;
> >   int *q2 = q;
> >   q2[5] = 7;
> > }
> > ```
> > would produce:
> > ```
> > warning: 'p2' and 'q2' are unsafe pointers used for buffer access
> > note: change type of 'p2' and 'q2' to 'std::span' to preserve bounds 
> > information, and
> >       change 'p' and 'q' to 'std::span' to propagate bounds information 
> > between them
> > ```
> > 
> > ---
> > 
> > In any case, this shows that the relationship between parameters (grouped 
> > together simply for being parameters) is very different from the 
> > relationship within groups of variables implicated by assignments (even if 
> > two or more of them are parameters). All the way down to the warning/note 
> > printer, we probably need to continue giving the parameter relationship a 
> > special treatment.
> This is a good argument!  An edge from `p` to `q` in an assignment graph 
> stands for not only that fixing `p` implicates fixing `q` but also that the 
> bounds information is propagated from `q` to `p`.   In this sense, the way I 
> connect parameters is inappropriate.
> 
> But my concern is that although treating parameters specially could improve 
> the quality of the diagnostic messages, the code may be more complex and less 
> re-used.
So for such an example
```
int f(int *p, int *q) {
int * a = p;
int * b = q;

a[5] = 0;
b[5] = 0;
}
```
We will fix all four variables `a, b, p, q` together.  But bounds information 
propagation only happens between `a` and `p`,  and `b` and `q`, respectively. 
Then what should the diagnostic message be?  How about something like
```
change type of 'a' to 'std::span' to preserve bounds information, and change 
'p' to propagate bounds information between them. 
To ensure parameters are changed together, also
change type of 'b' to 'std::span' to preserve bounds information, and change 
'q' to propagate bounds information between them;
...
```
for variable `a`.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D153059/new/

https://reviews.llvm.org/D153059

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to