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

196 lines
5.1 KiB
Objective-C

// RUN: %clang_analyze_cc1 -analyzer-checker=core -w -verify %s
@interface MyObject
- (void)takePointer:(void *)ptr __attribute__((nonnull(1)));
- (void)takePointerArg:(void *)__attribute__((nonnull)) ptr;
@end
void testNonNullMethod(int *p, MyObject *obj) {
if (p)
return;
[obj takePointer:p]; // expected-warning{{nonnull}}
}
@interface Subclass : MyObject
// [[nonnull]] is an inherited attribute.
- (void)takePointer:(void *)ptr;
@end
void testSubclass(int *p, Subclass *obj) {
if (p)
return;
[obj takePointer:p]; // expected-warning{{nonnull}}
}
void testSubclassArg(int *p, Subclass *obj) {
if (p)
return;
[obj takePointerArg:p]; // expected-warning{{nonnull}}
}
union rdar16153464_const_cp_t {
const struct rdar16153464_cczp *zp;
const struct rdar16153464_cczp_prime *prime;
} __attribute__((transparent_union));
struct rdar16153464_header {
union rdar16153464_const_cp_t cp;
unsigned char pad[16 - sizeof(union rdar16153464_const_cp_t *)];
} __attribute__((aligned(16)));
struct rdar16153464_full_ctx {
struct rdar16153464_header hdr;
} __attribute__((aligned(16)));
struct rdar16153464_pub_ctx {
struct rdar16153464_header hdr;
} __attribute__((aligned(16)));
union rdar16153464_full_ctx_t {
struct rdar16153464_full_ctx *_full;
struct rdar16153464_header *hdr;
struct rdar16153464_body *body;
struct rdar16153464_public *pub;
} __attribute__((transparent_union));
union rdar16153464_pub_ctx_t {
struct rdar16153464_pub_ctx *_pub;
struct rdar16153464_full_ctx *_full;
struct rdar16153464_header *hdr;
struct rdar16153464_body *body;
struct rdar16153464_public *pub;
union rdar16153464_full_ctx_t innert;
} __attribute__((transparent_union));
int rdar16153464(union rdar16153464_full_ctx_t inner)
{
extern void rdar16153464_check(union rdar16153464_pub_ctx_t outer) __attribute((nonnull(1)));
rdar16153464_check((union rdar16153464_pub_ctx_t){ .innert = inner }); // no-warning
rdar16153464_check(inner); // no-warning
rdar16153464_check(0); // expected-warning{{nonnull}}
}
// Multiple attributes, the basic case
void multipleAttributes_1(char *p, char *q) __attribute((nonnull(1))) __attribute((nonnull(2)));
void testMultiple_1(void) {
char c;
multipleAttributes_1(&c, &c); // no-warning
}
void testMultiple_2(void) {
char c;
multipleAttributes_1(0, &c); // expected-warning{{nonnull}}
}
void testMultiple_3(void) {
char c;
multipleAttributes_1(&c, 0); // expected-warning{{nonnull}}
}
void testMultiple_4(void) {
multipleAttributes_1(0, 0);// expected-warning{{nonnull}}
}
// Multiple attributes, multiple prototypes
void multipleAttributes_2(char *p, char *q) __attribute((nonnull(1)));
void multipleAttributes_2(char *p, char *q) __attribute((nonnull(2)));
void testMultiple_5(void) {
char c;
multipleAttributes_2(0, &c);// expected-warning{{nonnull}}
}
void testMultiple_6(void) {
char c;
multipleAttributes_2(&c, 0);// expected-warning{{nonnull}}
}
void testMultiple_7(void) {
multipleAttributes_2(0, 0);// expected-warning{{nonnull}}
}
// Multiple attributes, same index
void multipleAttributes_3(char *p, char *q) __attribute((nonnull(1))) __attribute((nonnull(1)));
void testMultiple_8(void) {
char c;
multipleAttributes_3(0, &c); // expected-warning{{nonnull}}
}
void testMultiple_9(void) {
char c;
multipleAttributes_3(&c, 0); // no-warning
}
// Multiple attributes, the middle argument is missing an attribute
void multipleAttributes_4(char *p, char *q, char *r) __attribute((nonnull(1))) __attribute((nonnull(3)));
void testMultiple_10(void) {
char c;
multipleAttributes_4(0, &c, &c); // expected-warning{{nonnull}}
}
void testMultiple_11(void) {
char c;
multipleAttributes_4(&c, 0, &c); // no-warning
}
void testMultiple_12(void) {
char c;
multipleAttributes_4(&c, &c, 0); // expected-warning{{nonnull}}
}
// Multiple attributes, when the last is without index
void multipleAttributes_all_1(char *p, char *q) __attribute((nonnull(1))) __attribute((nonnull));
void testMultiple_13(void) {
char c;
multipleAttributes_all_1(0, &c); // expected-warning{{nonnull}}
}
void testMultiple_14(void) {
char c;
multipleAttributes_all_1(&c, 0); // expected-warning{{nonnull}}
}
// Multiple attributes, when the first is without index
void multipleAttributes_all_2(char *p, char *q) __attribute((nonnull)) __attribute((nonnull(2)));
void testMultiple_15(void) {
char c;
multipleAttributes_all_2(0, &c); // expected-warning{{nonnull}}
}
void testMultiple_16(void) {
char c;
multipleAttributes_all_2(&c, 0); // expected-warning{{nonnull}}
}
void testVararg(int k, void *p) {
extern void testVararg_check(int, ...) __attribute__((nonnull));
void *n = 0;
testVararg_check(0);
testVararg_check(1, p);
if (k == 1)
testVararg_check(1, n); // expected-warning{{nonnull}}
testVararg_check(2, p, p);
if (k == 2)
testVararg_check(2, n, p); // expected-warning{{nonnull}}
if (k == 3)
testVararg_check(2, p, n); // expected-warning{{nonnull}}
}
void testNotPtr(void) {
struct S { int a; int b; int c; } s = {};
extern void testNotPtr_check(struct S, int) __attribute__((nonnull(1, 2)));
testNotPtr_check(s, 0);
}