additive-folding.cpp [plain text]
void clang_analyzer_eval(bool);
#define UINT_MAX (~0U)
#define INT_MAX (UINT_MAX & (UINT_MAX >> 1))
#define INT_MIN (-INT_MAX - 1)
void separateExpressions (int a) {
int b = a + 1;
--b;
clang_analyzer_eval(a != 0 && b == 0); }
void oneLongExpression (int a) {
int b = 15 + a + 15 - 10 - 20;
clang_analyzer_eval(a != 0 && b == 0); }
void mixedTypes (int a) {
int b = a + 1LL;
clang_analyzer_eval(a != 0 && (b-1) == 0);
int c = a + 1U;
clang_analyzer_eval(a != 0 && (c-1) == 0); }
void eq_ne (unsigned a) {
if (a == UINT_MAX) {
clang_analyzer_eval(a+1 == 0); clang_analyzer_eval(a-1 == UINT_MAX-1); } else {
clang_analyzer_eval(a+1 != 0); clang_analyzer_eval(a-1 != UINT_MAX-1); }
}
void mixed_eq_ne (int a) {
if (a == 1) {
clang_analyzer_eval(a+1U == 2); clang_analyzer_eval(a-1U == 0); } else {
clang_analyzer_eval(a+1U != 2); clang_analyzer_eval(a-1U != 0); }
}
void baselineGT (unsigned a) {
if (a > 0)
clang_analyzer_eval(a != 0); else
clang_analyzer_eval(a == 0); }
void baselineGE (unsigned a) {
if (a >= UINT_MAX)
clang_analyzer_eval(a == UINT_MAX); else
clang_analyzer_eval(a != UINT_MAX); }
void baselineLT (unsigned a) {
if (a < UINT_MAX)
clang_analyzer_eval(a != UINT_MAX); else
clang_analyzer_eval(a == UINT_MAX); }
void baselineLE (unsigned a) {
if (a <= 0)
clang_analyzer_eval(a == 0); else
clang_analyzer_eval(a != 0); }
void adjustedGT (unsigned a) {
clang_analyzer_eval(a-1 > UINT_MAX-1); }
void adjustedGE (unsigned a) {
clang_analyzer_eval(a-1 > UINT_MAX-1);
if (a-1 >= UINT_MAX-1)
clang_analyzer_eval(a == UINT_MAX); }
void adjustedLT (unsigned a) {
clang_analyzer_eval(a+1 < 1); }
void adjustedLE (unsigned a) {
clang_analyzer_eval(a+1 <= 1);
if (a+1 <= 1)
clang_analyzer_eval(a == 0); }
void tautologies(unsigned a) {
clang_analyzer_eval(a <= UINT_MAX); clang_analyzer_eval(a >= 0); }
void tautologiesOutside(unsigned char a) {
clang_analyzer_eval(a <= 0x100); clang_analyzer_eval(a < 0x100);
clang_analyzer_eval(a != 0x100); clang_analyzer_eval(a != -1);
clang_analyzer_eval(a > -1); clang_analyzer_eval(a >= -1); }
void mixedWraparoundSanityCheck(int a) {
int max = INT_MAX;
int min = INT_MIN;
int b = a + 1;
clang_analyzer_eval(a == max && b != min); }
void mixedWraparoundLE_GT(int a) {
int max = INT_MAX;
int min = INT_MIN;
clang_analyzer_eval((a + 2) <= (max + 1LL)); clang_analyzer_eval((a - 2) > (min - 1LL)); clang_analyzer_eval((a + 2LL) <= max); }
void mixedWraparoundGE_LT(int a) {
int max = INT_MAX;
int min = INT_MIN;
clang_analyzer_eval((a + 2) < (max + 1LL)); clang_analyzer_eval((a - 2) >= (min - 1LL)); clang_analyzer_eval((a - 2LL) >= min); }
void mixedWraparoundEQ_NE(int a) {
int max = INT_MAX;
clang_analyzer_eval((a + 2) != (max + 1LL)); clang_analyzer_eval((a + 2LL) == (max + 1LL)); }
void mixedSignedness(int a, unsigned b) {
int sMin = INT_MIN;
unsigned uMin = INT_MIN;
clang_analyzer_eval(a == sMin && a != uMin); clang_analyzer_eval(b == uMin && b != sMin); }
void multiplicativeSanityTest(int x) {
if (x*4 < 8)
return;
clang_analyzer_eval(x == 3); }