Files
RedBear-OS/local/recipes/dev/libclc/source/clang/test/Analysis/switch-case.c
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

232 lines
6.4 KiB
C

// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify -analyzer-config eagerly-assume=false %s
void clang_analyzer_eval(int);
void clang_analyzer_warnIfReached(void);
#define INT_MIN 0x80000000
#define INT_MAX 0x7fffffff
// PR16833: Analyzer consumes memory until killed by kernel OOM killer
// while analyzing large case ranges.
void PR16833(unsigned op) {
switch (op) {
case 0x02 << 26 ... 0x03 << 26: // Analyzer should not hang here.
return;
}
}
void testAdjustment(int t) {
switch (t + 1) {
case 2:
clang_analyzer_eval(t == 1); // expected-warning{{TRUE}}
break;
case 3 ... 10:
clang_analyzer_eval(t > 1); // expected-warning{{TRUE}}
clang_analyzer_eval(t + 2 <= 11); // expected-warning{{TRUE}}
clang_analyzer_eval(t > 2); // expected-warning{{UNKNOWN}}
clang_analyzer_eval(t + 1 == 3); // expected-warning{{UNKNOWN}}
clang_analyzer_eval(t + 1 == 10); // expected-warning{{UNKNOWN}}
break;
default:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}
}
void testUnknownVal(int value, int mask) {
// Once ConstraintManager will process '&' and this test will require some changes.
switch (value & mask) {
case 1:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
case 3 ... 10:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
default:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}
}
void testSwitchCond(int arg) {
if (arg > 10) {
switch (arg) {
case INT_MIN ... 10:
clang_analyzer_warnIfReached(); // no-warning
break;
case 11 ... 20:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
default:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}
switch (arg) {
case INT_MIN ... 9:
clang_analyzer_warnIfReached(); // no-warning
break;
case 10 ... 20:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
clang_analyzer_eval(arg > 10); // expected-warning{{TRUE}}
break;
default:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}
} // arg > 10
}
void testDefaultUnreachable(int arg) {
if (arg > 10) {
switch (arg) {
case INT_MIN ... 9:
clang_analyzer_warnIfReached(); // no-warning
break;
case 10 ... INT_MAX:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
clang_analyzer_eval(arg > 10); // expected-warning{{TRUE}}
break;
default:
clang_analyzer_warnIfReached(); // no-warning
}
}
}
void testBranchReachability(int arg) {
if (arg > 10 && arg < 20) {
switch (arg) {
case INT_MIN ... 4:
clang_analyzer_warnIfReached(); // no-warning
break;
case 5 ... 9:
clang_analyzer_warnIfReached(); // no-warning
break;
case 10 ... 15:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
clang_analyzer_eval(arg > 10 && arg <= 15); // expected-warning{{TRUE}}
break;
default:
clang_analyzer_warnIfReached(); // no-warning
break;
case 17 ... 25:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
clang_analyzer_eval(arg >= 17 && arg < 20); // expected-warning{{TRUE}}
break;
case 26 ... INT_MAX:
clang_analyzer_warnIfReached(); // no-warning
break;
case 16:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
clang_analyzer_eval(arg == 16); // expected-warning{{TRUE}}
break;
}
}
}
void testDefaultBranchRange(int arg) {
switch (arg) {
case INT_MIN ... 9:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
case 20 ... INT_MAX:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
clang_analyzer_eval(arg >= 20); // expected-warning{{TRUE}}
break;
default:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
clang_analyzer_eval(arg == 16); // expected-warning{{FALSE}}
clang_analyzer_eval(arg > 9); // expected-warning{{TRUE}}
clang_analyzer_eval(arg <= 20); // expected-warning{{TRUE}}
case 16:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}
}
void testAllUnreachableButDefault(int arg) {
if (arg < 0) {
switch (arg) {
case 0 ... 9:
clang_analyzer_warnIfReached(); // no-warning
break;
case 20 ... INT_MAX:
clang_analyzer_warnIfReached(); // no-warning
break;
default:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
case 16:
clang_analyzer_warnIfReached(); // no-warning
}
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}
}
void testAllUnreachable(int arg) {
if (arg < 0) {
switch (arg) {
case 0 ... 9:
clang_analyzer_warnIfReached(); // no-warning
break;
case 20 ... INT_MAX:
clang_analyzer_warnIfReached(); // no-warning
break;
case 16:
clang_analyzer_warnIfReached(); // no-warning
}
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}
}
void testDifferentTypes(int arg) {
switch (arg) {
case -1U ... 400000000LL:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
default:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
}
}
void testDifferentTypes2(unsigned long arg) {
switch (arg) {
case 1UL ... 400000000UL:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
default:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
}
}
void testDifferentTypes3(int arg) {
switch (arg) {
case 1UL ... 400000000UL:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
default:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
}
}
void testConstant(void) {
switch (3) {
case 1 ... 5:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
default:
clang_analyzer_warnIfReached(); // no-warning
break;
}
}
void testExhaustiveSwitch(unsigned int a) {
switch (a & 5) {
case 0 ... 5:
clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
break;
default:
clang_analyzer_warnIfReached(); // no-warning
break;
}
}