https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109437
Benjamin Priour <vultkayn at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |vultkayn at gcc dot gnu.org --- Comment #1 from Benjamin Priour <vultkayn at gcc dot gnu.org> --- (In reply to Benjamin Priour from comment #0) > OOB refers to Out-Of-Bounds. > > Curiously, it seems that if a frame was a cause for a OOB (either by > containing the spurious code or by being a caller to such code), it will > only emit one set of warning, rather than at each unique compromising > statements. > > > int consecutive_oob_in_frame () > { > int arr[] = {1,2,3,4,5,6,7}; > int y1 = arr[9]; // only this one is diagnosed > int y2 = arr[10]; // no OOB warning emitted here ... > int y3 = arr[50]; // ... nor here. > return (y1+y2+y3); > } > > int main () { > consecutive_oob_in_frame (); // OOB warning emitted > int x [] = {1,2}; > x[5]; /* silent, probably because another set of OOB warnings > has already been issued with this frame being the source */ > return 0; > } > > > As per David suggestion, it might be worth to implement > pending_diagnostic::supercedes_p vfunc for the OOB checker. Actually the cause seems to be related to [https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109439]. Indeed, the further warning are not emitted only after an OOB read. Consider: int arr[] = {1,2,3,4,5,6,7}; arr[9] = 7; // 1 warning OOB arr[15] = 12; // 1 warning OOB int y = arr[12]; // 2 Warnings as in PR109439, terminate path arr[11]; // No warnings The reason is because of the poisoned_value diagnostic that is implementing the diagnostic_path::terminate_path method