On Fri, Mar 10, 2017 at 12:13:11PM -0800, Junio C Hamano wrote: > René Scharfe <l.s.r@xxxxxx> writes: > > >> I think this misses the other two cases: (*dst, src) and (*dst, *src). > > > > ... and that's why I left them out. You can't get dst vs. *dst wrong > > with structs (at least not without the compiler complaining); only > > safe transformations are included in this round. > > I haven't followed this discussion to the end, but the omission of 2 > out of obvious 4 did pique my curiosity when I saw it, too, and made > me wonder if the omission was deliberate. If so, it would be nice > to state why in the log message (or in copy.cocci file itself as a > comment). Yeah, it definitely would be worth mentioning. I'm still undecided on whether we want to be endorsing struct assignment more fully. > It also made me wonder if we would be helped with a further > combinatorial explosion from "T **dstp, **srcp" and somesuch (in > other words, I am wondering why a rule for 'T *src' that uses '*src' > need to be spelled out separately when there already is a good rule > for 'T src' that uses 'src'---is that an inherent restriction of the > tool?). I had that thought, too, but I think the 4-way rules are necessary, because the transformations aren't the same in each case. E.g., for the four cases, the resulting assignments are: (dst, src): dst = src; (dst, *src): dst = *src; (*dst, src): *dst = src; (*dst, *src): *dst = *src; For pointer-to-pointer, I assumed the tool would handle that automatically by matching "T" as "T*". Though if that is the case, I think "(dst, src)" and "(*dst, *src)" would be equivalent (though of course our rule matches are different, as you do not memcpy the raw structs). -Peff