[analyzer] Avoid unnecessary enum range check on LValueToRValue casts
Summary: EnumCastOutOfRangeChecker should not perform enum range checks on LValueToRValue casts, since this type of cast does not actually change the underlying type. Performing the unnecessary check actually triggered an assertion failure deeper in EnumCastOutOfRange for certain input (which is captured in the accompanying test code).
Reviewers: #clang, Szelethus, gamesh411, NoQ
Reviewed By: Szelethus, gamesh411, NoQ
Subscribers: NoQ, gamesh411, xazax.hun, baloghadamsoftware, szepet, a.sidorin, mikhail.ramalho, donat.nagy, dkrupp, Charusso, bjope, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D66014
llvm-svn: 369760
2019-08-23 22:21:13 +08:00
|
|
|
// RUN: %clang_analyze_cc1 \
|
|
|
|
// RUN: -analyzer-checker=core,alpha.cplusplus.EnumCastOutOfRange \
|
|
|
|
// RUN: -verify %s
|
|
|
|
|
|
|
|
enum En_t {
|
|
|
|
En_0 = -4,
|
|
|
|
En_1,
|
|
|
|
En_2 = 1,
|
|
|
|
En_3,
|
|
|
|
En_4 = 4
|
|
|
|
};
|
|
|
|
|
2022-02-12 20:23:43 +08:00
|
|
|
void unscopedUnspecifiedCStyle(void) {
|
[analyzer] Avoid unnecessary enum range check on LValueToRValue casts
Summary: EnumCastOutOfRangeChecker should not perform enum range checks on LValueToRValue casts, since this type of cast does not actually change the underlying type. Performing the unnecessary check actually triggered an assertion failure deeper in EnumCastOutOfRange for certain input (which is captured in the accompanying test code).
Reviewers: #clang, Szelethus, gamesh411, NoQ
Reviewed By: Szelethus, gamesh411, NoQ
Subscribers: NoQ, gamesh411, xazax.hun, baloghadamsoftware, szepet, a.sidorin, mikhail.ramalho, donat.nagy, dkrupp, Charusso, bjope, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D66014
llvm-svn: 369760
2019-08-23 22:21:13 +08:00
|
|
|
enum En_t Below = (enum En_t)(-5); // expected-warning {{not in the valid range}}
|
|
|
|
enum En_t NegVal1 = (enum En_t)(-4); // OK.
|
|
|
|
enum En_t NegVal2 = (enum En_t)(-3); // OK.
|
|
|
|
enum En_t InRange1 = (enum En_t)(-2); // expected-warning {{not in the valid range}}
|
|
|
|
enum En_t InRange2 = (enum En_t)(-1); // expected-warning {{not in the valid range}}
|
|
|
|
enum En_t InRange3 = (enum En_t)(0); // expected-warning {{not in the valid range}}
|
|
|
|
enum En_t PosVal1 = (enum En_t)(1); // OK.
|
|
|
|
enum En_t PosVal2 = (enum En_t)(2); // OK.
|
|
|
|
enum En_t InRange4 = (enum En_t)(3); // expected-warning {{not in the valid range}}
|
|
|
|
enum En_t PosVal3 = (enum En_t)(4); // OK.
|
|
|
|
enum En_t Above = (enum En_t)(5); // expected-warning {{not in the valid range}}
|
|
|
|
}
|
|
|
|
|
|
|
|
enum En_t unused;
|
2022-02-12 20:23:43 +08:00
|
|
|
void unusedExpr(void) {
|
[analyzer] Avoid unnecessary enum range check on LValueToRValue casts
Summary: EnumCastOutOfRangeChecker should not perform enum range checks on LValueToRValue casts, since this type of cast does not actually change the underlying type. Performing the unnecessary check actually triggered an assertion failure deeper in EnumCastOutOfRange for certain input (which is captured in the accompanying test code).
Reviewers: #clang, Szelethus, gamesh411, NoQ
Reviewed By: Szelethus, gamesh411, NoQ
Subscribers: NoQ, gamesh411, xazax.hun, baloghadamsoftware, szepet, a.sidorin, mikhail.ramalho, donat.nagy, dkrupp, Charusso, bjope, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D66014
llvm-svn: 369760
2019-08-23 22:21:13 +08:00
|
|
|
// Following line is not something that EnumCastOutOfRangeChecker should
|
|
|
|
// evaluate. Checker should either ignore this line or process it without
|
|
|
|
// producing any warnings. However, compilation will (and should) still
|
|
|
|
// generate a warning having nothing to do with this checker.
|
|
|
|
unused; // expected-warning {{expression result unused}}
|
|
|
|
}
|