Files
RedBear-OS/local/recipes/dev/libclc/source/clang/test/Analysis/svalbuilder-rearrange-comparisons.cpp
T
vasilito cb424d7448 build: static patch-sanity linter (shift-left the malformed-patch class)
verify-patch-sanity.py validates every active recipe .patch has internally-
consistent hunk line counts — catching the 'malformed patch at line N' failure
at commit/CI/preflight time instead of hours into a cook. This cycle hit that
class three times (qtwaylandscanner, sddm, xwayland), each only discovered when
cookbook tried to apply the patch.

Running it across the repo found 29 latent malformed patches (validated against
GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22').
They were harmless only because they sit in vendored recipes (baked, not re-
applied) — but would fail on any version-bump re-derivation. --fix recounts the
hunk headers (body untouched) and repaired all 29.

Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test
(test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats
(empty placeholders, bare-@@ git hunks).
2026-08-01 05:13:02 +03:00

1029 lines
36 KiB
C++

// RUN: %clang_analyze_cc1 \
// RUN: -analyzer-checker=debug.ExprInspection,core.builtin \
// RUN: -analyzer-config aggressive-binary-operation-simplification=true \
// RUN: -analyzer-config support-symbolic-integer-casts=false \
// RUN: -analyzer-config eagerly-assume=false \
// RUN: -verify %s
// RUN: %clang_analyze_cc1 \
// RUN: -analyzer-checker=debug.ExprInspection,core.builtin \
// RUN: -analyzer-config aggressive-binary-operation-simplification=true \
// RUN: -analyzer-config support-symbolic-integer-casts=true \
// RUN: -DSUPPORT_SYMBOLIC_INTEGER_CASTS \
// RUN: -analyzer-config eagerly-assume=false \
// RUN: -verify %s
void clang_analyzer_eval(bool x);
template <typename T>
void clang_analyzer_denote(T x, const char *literal);
template <typename T>
void clang_analyzer_express(T x);
void exit(int);
#define UINT_MAX (~0U)
#define INT_MAX (UINT_MAX & (UINT_MAX >> 1))
extern void __assert_fail (__const char *__assertion, __const char *__file,
unsigned int __line, __const char *__function)
__attribute__ ((__noreturn__));
#define assert(expr) \
((expr) ? (void)(0) : __assert_fail (#expr, __FILE__, __LINE__, __func__))
int g(void);
int f(void) {
int x = g();
// Assert that no overflows occur in this test file.
// Assuming that concrete integers are also within that range.
assert(x <= ((int)INT_MAX / 4));
assert(x >= -((int)INT_MAX / 4));
return x;
}
void compare_different_symbol_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(x == y); // expected-warning {{$x - $y == 0}}
}
void compare_different_symbol_plus_left_int_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x += 1;
clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}
}
void compare_different_symbol_minus_left_int_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x -= 1;
clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}
}
void compare_different_symbol_plus_right_int_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
y += 2;
clang_analyzer_express(y); // expected-warning {{$y + 2}}
clang_analyzer_express(x == y); // expected-warning {{$x - $y == 2}}
}
void compare_different_symbol_minus_right_int_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
y -= 2;
clang_analyzer_express(y); // expected-warning {{$y - 2}}
clang_analyzer_express(x == y); // expected-warning {{$y - $x == 2}}
}
void compare_different_symbol_plus_left_plus_right_int_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x += 2;
y += 1;
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}
}
void compare_different_symbol_plus_left_minus_right_int_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x += 2;
y -= 1;
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x == y); // expected-warning {{$y - $x == 3}}
}
void compare_different_symbol_minus_left_plus_right_int_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x -= 2;
y += 1;
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x == y); // expected-warning {{$x - $y == 3}}
}
void compare_different_symbol_minus_left_minus_right_int_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x -= 2;
y -= 1;
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}
}
void compare_same_symbol_equal(void) {
int x = f(), y = x;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
}
void compare_same_symbol_plus_left_int_equal(void) {
int x = f(), y = x;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
}
void compare_same_symbol_minus_left_int_equal(void) {
int x = f(), y = x;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
}
void compare_same_symbol_plus_right_int_equal(void) {
int x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
}
void compare_same_symbol_minus_right_int_equal(void) {
int x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
}
void compare_same_symbol_plus_left_plus_right_int_equal(void) {
int x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
}
void compare_same_symbol_plus_left_minus_right_int_equal(void) {
int x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
}
void compare_same_symbol_minus_left_plus_right_int_equal(void) {
int x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x == y); // expected-warning {{FALSE}}
}
void compare_same_symbol_minus_left_minus_right_int_equal(void) {
int x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
}
void compare_different_symbol_less_or_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 0}}
}
void compare_different_symbol_plus_left_int_less_or_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x += 1;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}
}
void compare_different_symbol_minus_left_int_less_or_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x -= 1;
clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}
}
void compare_different_symbol_plus_right_int_less_or_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
y += 2;
clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 2}}
}
void compare_different_symbol_minus_right_int_less_or_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
y -= 2;
clang_analyzer_express(y); // expected-warning {{$y - 2}}
clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 2}}
}
void compare_different_symbol_plus_left_plus_right_int_less_or_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x += 2;
y += 1;
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}
}
void compare_different_symbol_plus_left_minus_right_int_less_or_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x += 2;
y -= 1;
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 3}}
}
void compare_different_symbol_minus_left_plus_right_int_less_or_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x -= 2;
y += 1;
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 3}}
}
void compare_different_symbol_minus_left_minus_right_int_less_or_equal(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x -= 2;
y -= 1;
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}
}
void compare_same_symbol_less_or_equal(void) {
int x = f(), y = x;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
}
void compare_same_symbol_plus_left_int_less_or_equal(void) {
int x = f(), y = x;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x <= y); // expected-warning {{FALSE}}
}
void compare_same_symbol_minus_left_int_less_or_equal(void) {
int x = f(), y = x;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
}
void compare_same_symbol_plus_right_int_less_or_equal(void) {
int x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
}
void compare_same_symbol_minus_right_int_less_or_equal(void) {
int x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x <= y); // expected-warning {{FALSE}}
}
void compare_same_symbol_plus_left_plus_right_int_less_or_equal(void) {
int x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
}
void compare_same_symbol_plus_left_minus_right_int_less_or_equal(void) {
int x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x <= y); // expected-warning {{FALSE}}
}
void compare_same_symbol_minus_left_plus_right_int_less_or_equal(void) {
int x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
}
void compare_same_symbol_minus_left_minus_right_int_less_or_equal(void) {
int x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
}
void compare_different_symbol_less(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x < y); // expected-warning {{$x - $y < 0}}
}
void compare_different_symbol_plus_left_int_less(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x += 1;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}
}
void compare_different_symbol_minus_left_int_less(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x -= 1;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}
}
void compare_different_symbol_plus_right_int_less(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
y += 2;
clang_analyzer_express(y); // expected-warning {{$y + 2}}
clang_analyzer_express(x < y); // expected-warning {{$x - $y < 2}}
}
void compare_different_symbol_minus_right_int_less(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
y -= 2;
clang_analyzer_express(y); // expected-warning {{$y - 2}}
clang_analyzer_express(x < y); // expected-warning {{$y - $x > 2}}
}
void compare_different_symbol_plus_left_plus_right_int_less(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x += 2;
y += 1;
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}
}
void compare_different_symbol_plus_left_minus_right_int_less(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x += 2;
y -= 1;
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x < y); // expected-warning {{$y - $x > 3}}
}
void compare_different_symbol_minus_left_plus_right_int_less(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x -= 2;
y += 1;
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x < y); // expected-warning {{$x - $y < 3}}
}
void compare_different_symbol_minus_left_minus_right_int_less(void) {
int x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
x -= 2;
y -= 1;
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}
}
void compare_same_symbol_less(void) {
int x = f(), y = x;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
}
void compare_same_symbol_plus_left_int_less(void) {
int x = f(), y = x;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
}
void compare_same_symbol_minus_left_int_less(void) {
int x = f(), y = x;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x < y); // expected-warning {{TRUE}}
}
void compare_same_symbol_plus_right_int_less(void) {
int x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x < y); // expected-warning {{TRUE}}
}
void compare_same_symbol_minus_right_int_less(void) {
int x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
}
void compare_same_symbol_plus_left_plus_right_int_less(void) {
int x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
}
void compare_same_symbol_plus_left_minus_right_int_less(void) {
int x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
}
void compare_same_symbol_minus_left_plus_right_int_less(void) {
int x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x < y); // expected-warning {{TRUE}}
}
void compare_same_symbol_minus_left_minus_right_int_less(void) {
int x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
}
// Rearrange should happen on signed types only (tryRearrange):
//
// // Rearrange signed symbolic expressions only
// if (!SingleTy->isSignedIntegerOrEnumerationType())
// return std::nullopt;
//
// Without the symbolic casts, the SVal for `x` in `unsigned x = f()` will be
// the signed `int`. However, with the symbolic casts it will be `unsigned`.
// Thus, these tests are meaningful only if the cast is not emitted.
#ifndef SUPPORT_SYMBOLIC_INTEGER_CASTS
void compare_different_symbol_equal_unsigned(void) {
unsigned x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x == y); // expected-warning {{$x - $y == 0}}
}
void compare_different_symbol_plus_left_int_equal_unsigned(void) {
unsigned x = f() + 1, y = f();
clang_analyzer_denote(x - 1, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}
}
void compare_different_symbol_minus_left_int_equal_unsigned(void) {
unsigned x = f() - 1, y = f();
clang_analyzer_denote(x + 1, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}
}
void compare_different_symbol_plus_right_int_equal_unsigned(void) {
unsigned x = f(), y = f() + 2;
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y - 2, "$y");
clang_analyzer_express(y); // expected-warning {{$y + 2}}
clang_analyzer_express(x == y); // expected-warning {{$x - $y == 2}}
}
void compare_different_symbol_minus_right_int_equal_unsigned(void) {
unsigned x = f(), y = f() - 2;
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y + 2, "$y");
clang_analyzer_express(y); // expected-warning {{$y - 2}}
clang_analyzer_express(x == y); // expected-warning {{$y - $x == 2}}
}
void compare_different_symbol_plus_left_plus_right_int_equal_unsigned(void) {
unsigned x = f() + 2, y = f() + 1;
clang_analyzer_denote(x - 2, "$x");
clang_analyzer_denote(y - 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x == y); // expected-warning {{$y - $x == 1}}
}
void compare_different_symbol_plus_left_minus_right_int_equal_unsigned(void) {
unsigned x = f() + 2, y = f() - 1;
clang_analyzer_denote(x - 2, "$x");
clang_analyzer_denote(y + 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x == y); // expected-warning {{$y - $x == 3}}
}
void compare_different_symbol_minus_left_plus_right_int_equal_unsigned(void) {
unsigned x = f() - 2, y = f() + 1;
clang_analyzer_denote(x + 2, "$x");
clang_analyzer_denote(y - 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x == y); // expected-warning {{$x - $y == 3}}
}
void compare_different_symbol_minus_left_minus_right_int_equal_unsigned(void) {
unsigned x = f() - 2, y = f() - 1;
clang_analyzer_denote(x + 2, "$x");
clang_analyzer_denote(y + 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x == y); // expected-warning {{$x - $y == 1}}
}
void compare_same_symbol_equal_unsigned(void) {
unsigned x = f(), y = x;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
}
void compare_same_symbol_plus_left_int_equal_unsigned(void) {
unsigned x = f(), y = x;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_express(x == y); // expected-warning {{$x + 1U == $x}}
}
void compare_same_symbol_minus_left_int_equal_unsigned(void) {
unsigned x = f(), y = x;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_express(x == y); // expected-warning {{$x - 1U == $x}}
}
void compare_same_symbol_plus_right_int_equal_unsigned(void) {
unsigned x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_express(x == y); // expected-warning {{$x == $x + 1U}}
}
void compare_same_symbol_minus_right_int_equal_unsigned(void) {
unsigned x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_express(x == y); // expected-warning {{$x == $x - 1U}}
}
void compare_same_symbol_plus_left_plus_right_int_equal_unsigned(void) {
unsigned x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
}
void compare_same_symbol_plus_left_minus_right_int_equal_unsigned(void) {
unsigned x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_express(x == y); // expected-warning {{$x + 1U == $x - 1U}}
}
void compare_same_symbol_minus_left_plus_right_int_equal_unsigned(void) {
unsigned x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_express(x == y); // expected-warning {{$x - 1U == $x + 1U}}
}
void compare_same_symbol_minus_left_minus_right_int_equal_unsigned(void) {
unsigned x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x == y); // expected-warning {{TRUE}}
}
void compare_different_symbol_less_or_equal_unsigned(void) {
unsigned x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 0}}
}
void compare_different_symbol_plus_left_int_less_or_equal_unsigned(void) {
unsigned x = f() + 1, y = f();
clang_analyzer_denote(x - 1, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}
}
void compare_different_symbol_minus_left_int_less_or_equal_unsigned(void) {
unsigned x = f() - 1, y = f();
clang_analyzer_denote(x + 1, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}
}
void compare_different_symbol_plus_right_int_less_or_equal_unsigned(void) {
unsigned x = f(), y = f() + 2;
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y - 2, "$y");
clang_analyzer_express(y); // expected-warning {{$y + 2}}
clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 2}}
}
void compare_different_symbol_minus_right_int_less_or_equal_unsigned(void) {
unsigned x = f(), y = f() - 2;
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y + 2, "$y");
clang_analyzer_express(y); // expected-warning {{$y - 2}}
clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 2}}
}
void compare_different_symbol_plus_left_plus_right_int_less_or_equal_unsigned(void) {
unsigned x = f() + 2, y = f() + 1;
clang_analyzer_denote(x - 2, "$x");
clang_analyzer_denote(y - 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 1}}
}
void compare_different_symbol_plus_left_minus_right_int_less_or_equal_unsigned(void) {
unsigned x = f() + 2, y = f() - 1;
clang_analyzer_denote(x - 2, "$x");
clang_analyzer_denote(y + 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x <= y); // expected-warning {{$y - $x >= 3}}
}
void compare_different_symbol_minus_left_plus_right_int_less_or_equal_unsigned(void) {
unsigned x = f() - 2, y = f() + 1;
clang_analyzer_denote(x + 2, "$x");
clang_analyzer_denote(y - 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 3}}
}
void compare_different_symbol_minus_left_minus_right_int_less_or_equal_unsigned(void) {
unsigned x = f() - 2, y = f() - 1;
clang_analyzer_denote(x + 2, "$x");
clang_analyzer_denote(y + 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x <= y); // expected-warning {{$x - $y <= 1}}
}
void compare_same_symbol_less_or_equal_unsigned(void) {
unsigned x = f(), y = x;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
}
void compare_same_symbol_plus_left_int_less_or_equal_unsigned(void) {
unsigned x = f(), y = x;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_express(x <= y); // expected-warning {{$x + 1U <= $x}}
}
void compare_same_symbol_minus_left_int_less_or_equal_unsigned(void) {
unsigned x = f(), y = x;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_express(x <= y); // expected-warning {{$x - 1U <= $x}}
}
void compare_same_symbol_plus_right_int_less_or_equal_unsigned(void) {
unsigned x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_express(x <= y); // expected-warning {{$x <= $x + 1U}}
}
void compare_same_symbol_minus_right_int_less_or_equal_unsigned(void) {
unsigned x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_express(x <= y); // expected-warning {{$x <= $x - 1U}}
}
void compare_same_symbol_plus_left_plus_right_int_less_or_equal_unsigned(void) {
unsigned x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
}
void compare_same_symbol_plus_left_minus_right_int_less_or_equal_unsigned(void) {
unsigned x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_express(x <= y); // expected-warning {{$x + 1U <= $x - 1U}}
}
void compare_same_symbol_minus_left_plus_right_int_less_or_equal_unsigned(void) {
unsigned x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_express(x <= y); // expected-warning {{$x - 1U <= $x + 1U}}
}
void compare_same_symbol_minus_left_minus_right_int_less_or_equal_unsigned(void) {
unsigned x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x <= y); // expected-warning {{TRUE}}
}
void compare_different_symbol_less_unsigned(void) {
unsigned x = f(), y = f();
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x < y); // expected-warning {{$x - $y < 0}}
}
void compare_different_symbol_plus_left_int_less_unsigned(void) {
unsigned x = f() + 1, y = f();
clang_analyzer_denote(x - 1, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}
}
void compare_different_symbol_minus_left_int_less_unsigned(void) {
unsigned x = f() - 1, y = f();
clang_analyzer_denote(x + 1, "$x");
clang_analyzer_denote(y, "$y");
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}
}
void compare_different_symbol_plus_right_int_less_unsigned(void) {
unsigned x = f(), y = f() + 2;
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y - 2, "$y");
clang_analyzer_express(y); // expected-warning {{$y + 2}}
clang_analyzer_express(x < y); // expected-warning {{$x - $y < 2}}
}
void compare_different_symbol_minus_right_int_less_unsigned(void) {
unsigned x = f(), y = f() - 2;
clang_analyzer_denote(x, "$x");
clang_analyzer_denote(y + 2, "$y");
clang_analyzer_express(y); // expected-warning {{$y - 2}}
clang_analyzer_express(x < y); // expected-warning {{$y - $x > 2}}
}
void compare_different_symbol_plus_left_plus_right_int_less_unsigned(void) {
unsigned x = f() + 2, y = f() + 1;
clang_analyzer_denote(x - 2, "$x");
clang_analyzer_denote(y - 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x < y); // expected-warning {{$y - $x > 1}}
}
void compare_different_symbol_plus_left_minus_right_int_less_unsigned(void) {
unsigned x = f() + 2, y = f() - 1;
clang_analyzer_denote(x - 2, "$x");
clang_analyzer_denote(y + 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x + 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x < y); // expected-warning {{$y - $x > 3}}
}
void compare_different_symbol_minus_left_plus_right_int_less_unsigned(void) {
unsigned x = f() - 2, y = f() + 1;
clang_analyzer_denote(x + 2, "$x");
clang_analyzer_denote(y - 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y + 1}}
clang_analyzer_express(x < y); // expected-warning {{$x - $y < 3}}
}
void compare_different_symbol_minus_left_minus_right_int_less_unsigned(void) {
unsigned x = f() - 2, y = f() - 1;
clang_analyzer_denote(x + 2, "$x");
clang_analyzer_denote(y + 1, "$y");
clang_analyzer_express(x); // expected-warning {{$x - 2}}
clang_analyzer_express(y); // expected-warning {{$y - 1}}
clang_analyzer_express(x < y); // expected-warning {{$x - $y < 1}}
}
#endif
// These pass even with aggressive-binary-operation-simplification=false
void compare_same_symbol_less_unsigned(void) {
unsigned x = f(), y = x;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
}
void compare_same_symbol_plus_left_int_less_unsigned(void) {
unsigned x = f(), y = x;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_express(x < y); // expected-warning {{$x + 1U < $x}}
}
void compare_same_symbol_minus_left_int_less_unsigned(void) {
unsigned x = f(), y = x;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x}}
clang_analyzer_express(x < y); // expected-warning {{$x - 1U < $x}}
}
void compare_same_symbol_plus_right_int_less_unsigned(void) {
unsigned x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_express(x < y); // expected-warning {{$x < $x + 1U}}
}
void compare_same_symbol_minus_right_int_less_unsigned(void) {
unsigned x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_express(x < y); // expected-warning {{$x < $x - 1U}}
}
void compare_same_symbol_plus_left_plus_right_int_less_unsigned(void) {
unsigned x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
}
void compare_same_symbol_plus_left_minus_right_int_less_unsigned(void) {
unsigned x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
++x;
clang_analyzer_express(x); // expected-warning {{$x + 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_express(x < y); // expected-warning {{$x + 1U < $x - 1U}}
}
void compare_same_symbol_minus_left_plus_right_int_less_unsigned(void) {
unsigned x = f(), y = x + 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x + 1}}
clang_analyzer_express(x < y); // expected-warning {{$x - 1U < $x + 1U}}
}
void compare_same_symbol_minus_left_minus_right_int_less_unsigned(void) {
unsigned x = f(), y = x - 1;
clang_analyzer_denote(x, "$x");
--x;
clang_analyzer_express(x); // expected-warning {{$x - 1}}
clang_analyzer_express(y); // expected-warning {{$x - 1}}
clang_analyzer_eval(x < y); // expected-warning {{FALSE}}
}
void overflow(signed char n, signed char m) {
if (n + 0 > m + 0) {
clang_analyzer_eval(n - 126 == m + 3); // expected-warning {{UNKNOWN}}
}
}
int mixed_integer_types(int x, int y) {
short a = x - 1U;
return a - y;
}
unsigned gu(void);
unsigned fu(void) {
unsigned x = gu();
// Assert that no overflows occur in this test file.
// Assuming that concrete integers are also within that range.
assert(x <= ((unsigned)UINT_MAX / 4));
return x;
}
void unsigned_concrete_int_no_crash(void) {
unsigned x = fu() + 1U, y = fu() + 1U;
clang_analyzer_denote(x - 1U, "$x");
clang_analyzer_denote(y - 1U, "$y");
clang_analyzer_express(y); // expected-warning {{$y}}
clang_analyzer_express(x == y); // expected-warning {{$x + 1U == $y + 1U}}
}