> On Oct 22, 2022, at 12:54 PM, Martin Sebor <mse...@gmail.com> wrote: > > On 10/21/22 09:29, Qing Zhao wrote: >> Hi, >> (FAM below refers to Flexible Array Members): >> I need inputs on how to handle the combination of -fstrict-flex-arrays + >> -Warray-bounds. >> Our initial goal is to update -Warray-bounds with multiple levels of >> -fstrict-flex-arrays=N >> to issue warnings according to the different levels of “N”. >> However, after detailed study, I found that this goal was very hard to be >> achieved. >> 1. -fstrict-flex-arrays and its levels >> The new option -fstrict-flex-arrays has 4 levels: >> level trailing arrays >> treated as FAM >> 0 [],[0],[1],[n] the default without option >> 1 [],[0],[1] >> 2 [],[0] >> 3 [] the default when option specified >> without value >> 2. -Warray-bounds and its levels >> The option -Warray-bounds currently has 2 levels: >> level trailing arrays >> treated as FAM >> 1 [],[0],[1] the default when option specified >> without value >> 2 [] >> i.e, >> When -Warray-bounds=1, it treats [],[0],[1] as FAM, the same level as >> -fstrict-flex-arrays=1; >> When -Warray-bounds=2, it only treat [] as FAM, the same level as >> -fstrict-flex-arrays=3; >> 3. How to handle the combination of -fstrict-flex-arrays and -Warray-bounds? >> Question 1: when -fstrict-flex-arrays does not present, the default is >> -strict-flex-arrays=0, >> which treats [],[0],[1],[n] as FAM, so should we update >> the default behavior >> of -Warray-bounds to treat any trailing array [n] as >> FAMs? >> My immediate answer to Q1 is NO, we shouldn’t, that will be a big regression >> on -Warray-bounds, right? > > Yes, it would disable -Warray-bounds in the cases where it warns > for past-the-end accesses to trailing arrays with two or more > elements. Diagnosing those has historically (i.e., before recent > changes) been a design goal. > >> Question 2: when -fstrict-flex-arrays=N1 and -Warray-bounds=N2 present at >> the same time, >> Which one has higher priority? N1 or N2? >> -fstrict-flex-arrays=N1 controls how the compiler code generation treats the >> trailing arrays as FAMs, it seems >> reasonable to give higher priority to N1, > > I tend to agree. In other words, set N2' = min(N1, N2). > >> However, then should we completely disable the level of -Warray-bounds >> N2 under such situation? >> I really don’t know what’s the best way to handle the conflict between N1 >> and N2. >> Can we completely cancel the 2 levels of -Warray-bounds, and always honor >> the level of -fstrict-flex-arrays? >> Any comments or suggestion will be helpful. > > The recent -fstrict-flex-array changes aside, IIRC, there's only > a subtle distinction between the two -Warray-bounds levels (since > level 1 started warning on a number of instances that only level > 2 used to diagnose a few releases ago).
From the doc: (and I also checked the source code) -Warray-bounds=2 This warning level also warns about out of bounds accesses to trailing struct members of one-element array types (@pxref{Zero Length}) and about the intermediate results of pointer arithmetic that may yield out of bounds values. This warning level may give a larger number of false positives and is deactivated by default. As I understand, -Warray-bounds=1 (i.e., -Warray-bounds) will report out-of-bounds access to trailing arrays with two or more elements, and treat trailing arrays with 0 or 1 as FAMs; -Warray-bounds=2 will report out-of-bounds access to trailing arrays with 0 or 1elements in addition to -Warray-bounds =1. Is the above understanding correct? > I think that subset of > level 2 could be merged into level 1 without increasing the rate > of false positives. Then level 2 could be assigned a new set of > potential problems to detect (such as past-the-end accesses to > trailing one-element arrays). If I understand correctly, Current Level 2 already include warning about past-the-end accesses to trailing one-element arrays (and also 0-length arrays). Qing > > Martin