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).
274 lines
5.4 KiB
C++
274 lines
5.4 KiB
C++
// RUN: %clang_cc1 %s -triple=armv7-none-none-eabi -verify -Wunaligned-access -emit-llvm -o %t
|
|
// REQUIRES: arm-registered-target
|
|
//
|
|
// This test suite tests the warning triggered by the -Wunaligned-access option.
|
|
// The warning occurs when a struct or other type of record contains a field
|
|
// that is itself a record. The outer record must be a packed structure, while
|
|
// while the inner record must be unpacked. This is the fundamental condition
|
|
// for the warning to be triggered. Some of these tests may have three layers.
|
|
//
|
|
// The command line option -fsyntax-only is not used as Clang needs to be
|
|
// forced to layout the structs used in this test.
|
|
// The triple in the command line above is used for the assumptions about
|
|
// size and alignment of types.
|
|
|
|
// Packed-Unpacked Tests (No Pragma)
|
|
|
|
struct T1 {
|
|
char a;
|
|
int b;
|
|
};
|
|
|
|
struct __attribute__((packed)) U1 {
|
|
char a;
|
|
T1 b; // expected-warning {{field b within 'U1' is less aligned than 'T1' and is usually due to 'U1' being packed, which can lead to unaligned accesses}}
|
|
int c;
|
|
};
|
|
|
|
struct __attribute__((packed)) U2 {
|
|
char a;
|
|
T1 b __attribute__((aligned(4)));
|
|
int c;
|
|
};
|
|
|
|
struct __attribute__((packed)) U3 {
|
|
char a;
|
|
char b;
|
|
short c;
|
|
T1 d;
|
|
};
|
|
|
|
struct __attribute__((packed)) U4 {
|
|
T1 a;
|
|
int b;
|
|
};
|
|
|
|
struct __attribute__((aligned(4), packed)) U5 {
|
|
char a;
|
|
T1 b; // expected-warning {{field b within 'U5' is less aligned than 'T1' and is usually due to 'U5' being packed, which can lead to unaligned accesses}}
|
|
int c;
|
|
};
|
|
|
|
struct __attribute__((aligned(4), packed)) U6 {
|
|
char a;
|
|
char b;
|
|
short c;
|
|
T1 d;
|
|
};
|
|
|
|
// Packed-Unpacked Tests with Pragma
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
struct __attribute__((packed)) U7 {
|
|
char a;
|
|
T1 b; // expected-warning {{field b within 'U7' is less aligned than 'T1' and is usually due to 'U7' being packed, which can lead to unaligned accesses}}
|
|
int c;
|
|
};
|
|
|
|
struct __attribute__((packed)) U8 {
|
|
char a;
|
|
T1 b __attribute__((aligned(4))); // expected-warning {{field b within 'U8' is less aligned than 'T1' and is usually due to 'U8' being packed, which can lead to unaligned accesses}}
|
|
int c;
|
|
};
|
|
|
|
struct __attribute__((aligned(4))) U9 {
|
|
char a;
|
|
T1 b; // expected-warning {{field b within 'U9' is less aligned than 'T1' and is usually due to 'U9' being packed, which can lead to unaligned accesses}}
|
|
int c;
|
|
};
|
|
|
|
struct U10 {
|
|
char a;
|
|
T1 b; // expected-warning {{field b within 'U10' is less aligned than 'T1' and is usually due to 'U10' being packed, which can lead to unaligned accesses}}
|
|
int c;
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
// Packed-Packed Tests
|
|
|
|
struct __attribute__((packed)) T2 {
|
|
char a;
|
|
int b;
|
|
};
|
|
|
|
struct __attribute__((packed)) U11 {
|
|
char a;
|
|
T2 b;
|
|
int c;
|
|
};
|
|
|
|
#pragma pack(push, 1)
|
|
struct U12 {
|
|
char a;
|
|
T2 b;
|
|
int c;
|
|
};
|
|
#pragma pack(pop)
|
|
|
|
// Unpacked-Packed Tests
|
|
|
|
struct U13 {
|
|
char a;
|
|
T2 b;
|
|
int c;
|
|
};
|
|
|
|
struct U14 {
|
|
char a;
|
|
T2 b __attribute__((aligned(4)));
|
|
int c;
|
|
};
|
|
|
|
// Unpacked-Unpacked Test
|
|
|
|
struct T3 {
|
|
char a;
|
|
int b;
|
|
};
|
|
|
|
struct U15 {
|
|
char a;
|
|
T3 b;
|
|
int c;
|
|
};
|
|
|
|
// Packed-Packed-Unpacked Test (No pragma)
|
|
|
|
struct __attribute__((packed)) A1 {
|
|
char a;
|
|
T1 b; // expected-warning {{field b within 'A1' is less aligned than 'T1' and is usually due to 'A1' being packed, which can lead to unaligned accesses}}
|
|
};
|
|
|
|
struct __attribute__((packed)) U16 {
|
|
char a;
|
|
A1 b;
|
|
int c;
|
|
};
|
|
|
|
struct __attribute__((packed)) A2 {
|
|
char a;
|
|
T1 b __attribute__((aligned(4)));
|
|
};
|
|
|
|
struct __attribute__((packed)) U17 {
|
|
char a;
|
|
A2 b; // expected-warning {{field b within 'U17' is less aligned than 'A2' and is usually due to 'U17' being packed, which can lead to unaligned accesses}}
|
|
int c;
|
|
};
|
|
|
|
// Packed-Unpacked-Packed tests
|
|
|
|
struct A3 {
|
|
char a;
|
|
T2 b;
|
|
};
|
|
|
|
struct __attribute__((packed)) U18 {
|
|
char a;
|
|
A3 b;
|
|
int c;
|
|
};
|
|
|
|
struct A4 {
|
|
char a;
|
|
T2 b;
|
|
int c;
|
|
};
|
|
|
|
#pragma pack(push, 1)
|
|
struct U19 {
|
|
char a;
|
|
A4 b; // expected-warning {{field b within 'U19' is less aligned than 'A4' and is usually due to 'U19' being packed, which can lead to unaligned accesses}}
|
|
int c;
|
|
};
|
|
#pragma pack(pop)
|
|
|
|
// Packed-Unpacked-Unpacked tests
|
|
|
|
struct A5 {
|
|
char a;
|
|
T1 b;
|
|
};
|
|
|
|
struct __attribute__((packed)) U20 {
|
|
char a;
|
|
A5 b; // expected-warning {{field b within 'U20' is less aligned than 'A5' and is usually due to 'U20' being packed, which can lead to unaligned accesses}}
|
|
int c;
|
|
};
|
|
|
|
struct A6 {
|
|
char a;
|
|
T1 b;
|
|
};
|
|
|
|
#pragma pack(push, 1)
|
|
struct U21 {
|
|
char a;
|
|
A6 b; // expected-warning {{field b within 'U21' is less aligned than 'A6' and is usually due to 'U21' being packed, which can lead to unaligned accesses}}
|
|
int c;
|
|
};
|
|
#pragma pack(pop)
|
|
|
|
// Unpacked-Packed-Packed test
|
|
|
|
struct __attribute__((packed)) A7 {
|
|
char a;
|
|
T2 b;
|
|
};
|
|
|
|
struct U22 {
|
|
char a;
|
|
A7 b;
|
|
int c;
|
|
};
|
|
|
|
// Unpacked-Packed-Unpacked tests
|
|
|
|
struct __attribute__((packed)) A8 {
|
|
char a;
|
|
T1 b; // expected-warning {{field b within 'A8' is less aligned than 'T1' and is usually due to 'A8' being packed, which can lead to unaligned accesses}}
|
|
};
|
|
|
|
struct U23 {
|
|
char a;
|
|
A8 b;
|
|
int c;
|
|
};
|
|
|
|
struct __attribute__((packed)) A9 {
|
|
char a;
|
|
T1 b __attribute__((aligned(4)));
|
|
};
|
|
|
|
struct U24 {
|
|
char a;
|
|
A9 b;
|
|
int c;
|
|
};
|
|
|
|
struct U1 s1;
|
|
struct U2 s2;
|
|
struct U3 s3;
|
|
struct U4 s4;
|
|
struct U5 s5;
|
|
struct U6 s6;
|
|
struct U7 s7;
|
|
struct U8 s8;
|
|
struct U9 s9;
|
|
struct U10 s10;
|
|
struct U11 s11;
|
|
struct U12 s12;
|
|
struct U13 s13;
|
|
struct U14 s14;
|
|
struct U15 s15;
|
|
struct U16 s16;
|
|
struct U17 s17;
|
|
struct U18 s18;
|
|
struct U19 s19;
|
|
struct U20 s20;
|
|
struct U21 s21;
|
|
struct U22 s22;
|
|
struct U23 s23;
|
|
struct U24 s24; |