cb424d7448
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).
119 lines
2.8 KiB
C
119 lines
2.8 KiB
C
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -Wno-strict-prototypes -verify %s
|
|
|
|
void clang_analyzer_eval(int);
|
|
void clang_analyzer_checkInlined(int);
|
|
|
|
int test1_f1(void) {
|
|
int y = 1;
|
|
y++;
|
|
clang_analyzer_checkInlined(1); // expected-warning{{TRUE}}
|
|
return y;
|
|
}
|
|
|
|
void test1_f2(void) {
|
|
int x = 1;
|
|
x = test1_f1();
|
|
if (x == 1) {
|
|
int *p = 0;
|
|
*p = 3; // no-warning
|
|
}
|
|
if (x == 2) {
|
|
int *p = 0;
|
|
*p = 3; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}}
|
|
}
|
|
}
|
|
|
|
// Test that inlining works when the declared function has less arguments
|
|
// than the actual number in the declaration.
|
|
void test2_f1() {}
|
|
int test2_f2(void);
|
|
|
|
void test2_f3(void) {
|
|
test2_f1(test2_f2()); // expected-warning{{too many arguments in call to 'test2_f1'}}
|
|
}
|
|
|
|
// Test that inlining works with recursive functions.
|
|
|
|
unsigned factorial(unsigned x) {
|
|
if (x <= 1)
|
|
return 1;
|
|
return x * factorial(x - 1);
|
|
}
|
|
|
|
void test_factorial(void) {
|
|
if (factorial(3) == 6) {
|
|
int *p = 0;
|
|
*p = 0xDEADBEEF; // expected-warning {{null}}
|
|
}
|
|
else {
|
|
int *p = 0;
|
|
*p = 0xDEADBEEF; // no-warning
|
|
}
|
|
}
|
|
|
|
void test_factorial_2(void) {
|
|
unsigned x = factorial(3);
|
|
if (x == factorial(3)) {
|
|
int *p = 0;
|
|
*p = 0xDEADBEEF; // expected-warning {{null}}
|
|
}
|
|
else {
|
|
int *p = 0;
|
|
*p = 0xDEADBEEF; // no-warning
|
|
}
|
|
}
|
|
|
|
// Test that returning stack memory from a parent stack frame does
|
|
// not trigger a warning.
|
|
static char *return_buf(char *buf) {
|
|
return buf + 10;
|
|
}
|
|
|
|
void test_return_stack_memory_ok(void) {
|
|
char stack_buf[100];
|
|
char *pos = return_buf(stack_buf);
|
|
(void) pos;
|
|
}
|
|
|
|
char *test_return_stack_memory_bad(void) {
|
|
char stack_buf[100];
|
|
char *x = stack_buf;
|
|
return x; // expected-warning {{stack memory associated}}
|
|
}
|
|
|
|
// Test that passing a struct value with an uninitialized field does
|
|
// not trigger a warning if we are inlining and the body is available.
|
|
struct rdar10977037 { int x, y; };
|
|
int test_rdar10977037_aux(struct rdar10977037 v) { return v.y; }
|
|
int test_rdar10977037_aux_2(struct rdar10977037 v);
|
|
int test_rdar10977037(void) {
|
|
struct rdar10977037 v;
|
|
v.y = 1;
|
|
v. y += test_rdar10977037_aux(v); // no-warning
|
|
return test_rdar10977037_aux_2(v); // expected-warning {{Passed-by-value struct argument contains uninitialized data}}
|
|
}
|
|
|
|
|
|
// Test inlining a forward-declared function.
|
|
// This regressed when CallEvent was first introduced.
|
|
int plus1(int x);
|
|
void test(void) {
|
|
clang_analyzer_eval(plus1(2) == 3); // expected-warning{{TRUE}}
|
|
}
|
|
|
|
int plus1(int x) {
|
|
return x + 1;
|
|
}
|
|
|
|
|
|
void never_called_by_anyone(void) {
|
|
clang_analyzer_checkInlined(0); // no-warning
|
|
}
|
|
|
|
|
|
void knr_one_argument(a) int a; { }
|
|
|
|
void call_with_less_arguments(void) {
|
|
knr_one_argument(); // expected-warning{{too few arguments}} expected-warning{{Function taking 1 argument is called with fewer (0)}}
|
|
}
|