[-Wunsafe-buffer-usage] Add unsafe buffer checking opt-out pragmas
authorZiqing Luo <ziqing@udel.edu>
Wed, 8 Feb 2023 22:06:37 +0000 (14:06 -0800)
committerZiqing Luo <ziqing@udel.edu>
Wed, 8 Feb 2023 22:12:03 +0000 (14:12 -0800)
commit829bcb06ec43ab4b56b95ff040ec9d36feeaf06a
tree6608c7c245a389295ba0591e5dbf84194314ce94
parenta1507668807e6108c12ffecf3740cb339b15018d
[-Wunsafe-buffer-usage] Add unsafe buffer checking opt-out pragmas

Add a pair of clang pragmas:
- `#pragma clang unsafe_buffer_usage begin` and
- `#pragma clang unsafe_buffer_usage end`,
which specify the start and end of an (unsafe buffer checking) opt-out
region, respectively.

Behaviors of opt-out regions conform to the following rules:

- No nested nor overlapped opt-out regions are allowed. One cannot
  start an opt-out region with `... unsafe_buffer_usage begin` but never
  close it with `... unsafe_buffer_usage end`. Mis-use of the pragmas
  will be warned.
- Warnings raised from unsafe buffer operations inside such an opt-out
  region will always be suppressed. This behavior CANNOT be changed by
  `clang diagnostic` pragmas or command-line flags.
- Warnings raised from unsafe operations outside of such opt-out
  regions may be reported on declarations inside opt-out
  regions. These warnings are NOT suppressed.
- An un-suppressed unsafe operation warning may be attached with
  notes. These notes are NOT suppressed as well regardless of whether
  they are in opt-out regions.

The implementation maintains a separate sequence of location pairs
representing opt-out regions in `Preprocessor`.  The `UnsafeBufferUsage`
analyzer reads the region sequence to check if an unsafe operation is
in an opt-out region. If it is, discard the warning raised from the
operation immediately.

This is a re-land after I reverting it at 9aa00c8a306561c4e3ddb09058e66bae322a0769.
The compilation error should be resolved.

Reviewed by: NoQ

Differential revision: https://reviews.llvm.org/D140179
12 files changed:
clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h
clang/include/clang/Basic/DiagnosticLexKinds.td
clang/include/clang/Lex/Preprocessor.h
clang/lib/Analysis/UnsafeBufferUsage.cpp
clang/lib/Lex/PPLexerChange.cpp
clang/lib/Lex/Pragma.cpp
clang/lib/Lex/Preprocessor.cpp
clang/lib/Sema/AnalysisBasedWarnings.cpp
clang/test/SemaCXX/warn-unsafe-buffer-usage-pragma-fixit.cpp [new file with mode: 0644]
clang/test/SemaCXX/warn-unsafe-buffer-usage-pragma-misuse.cpp [new file with mode: 0644]
clang/test/SemaCXX/warn-unsafe-buffer-usage-pragma.cpp [new file with mode: 0644]
clang/test/SemaCXX/warn-unsafe-buffer-usage-pragma.h [new file with mode: 0644]