On 9/18/18 5:44 AM, Bernd Edlinger wrote: >> > > Hmm, you know, I wrote a while ago the following: > https://gcc.gnu.org/ml/gcc-patches/2018-09/msg00411.html > > Where I suggested to change c_strlen parameter nonstr to a > structure, where additional information could go. It certainly seems better than continually adding more parameters and/or having a given parameter have multiple overloaded meanings. We'd fill in everything we can and let the caller determine what bits they need.
Martin has suggested something similar. > > Well, I have the impression that the 6/6 patch should be split > up in a part that uses c_strlen in its current form, and a > follow-up patch that adds any additional info. > I prefer doing things step-by-step, you know. I'm pretty sure it's not going to be able to use c_strlen in its current form. There are times when it really wants the length of the string, even if it's not terminated. > > Note that the example given is probably unsafe: >> T (&b[3][1] + v0, bsz); > > This does not pass the check in string_constant because it > looks like _2 = (char*)&b + _1; _3 = strlen (_2); > I have no way to prove that v0 is not larger than sizeof (b[3]). That's OK. The existence of the variable part turns "must" warnings into "may" warnings precisely because we don't know how v0 impacts things. > > By the way test test case for pr87053 is an example > of a false positive warning (it comes twice even though > TREE_NO_WARNING is used). > > gcc pr87053.c > pr87053.c: In function 'main': > pr87053.c:15:26: warning: 'strlen' argument missing terminating nul > [-Wstringop-overflow=] > 15 | if (__builtin_strlen (u.z) != 7) > | ~^~ > pr87053.c:11:3: note: referenced argument declared here > 11 | } u = {{"1234", "567"}}; > | ^ > pr87053.c:15:26: warning: 'strlen' argument missing terminating nul > [-Wstringop-overflow=] > 15 | if (__builtin_strlen (u.z) != 7) > | ~^~ > pr87053.c:11:3: note: referenced argument declared here > 11 | } u = {{"1234", "567"}}; > | ^ > > I think the duplicate warnings will not go away unless > this warning is only diagnosed in the tree-ssa-strlen > pass instead of the folding code, which happens repeatedly. Please file a bug. FWIW, I wouldn't necessarily rely on on the strlen pass not being repeated either. jeff