
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
15 lines
306 B
C
15 lines
306 B
C
#ifdef _INCLUDE_NO_WARN
|
|
// the snippet will be included in an opt-out region
|
|
p1++;
|
|
|
|
#undef _INCLUDE_NO_WARN
|
|
|
|
#elif defined(_INCLUDE_WARN)
|
|
// the snippet will be included in a location where warnings are expected
|
|
p2++; // expected-note{{used in pointer arithmetic here}}
|
|
#undef _INCLUDE_WARN
|
|
|
|
#else
|
|
|
|
#endif
|