Commit ce433f8090da6784cdee754defcbf325fc66f274
1 parent
a5c1cb63dd
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
tile: avoid undefined behavior with regs[TREG_TP] etc
Recent compilers warn about accesses to arrays past the end, which is supported for pt_regs and sigcontext with the intended alias past the end of regs[] to sp, tp, and lr using TREG_SP, TREG_TP, and TREG_LR. Make the intended usage explict by providing an anonymous union of regs[56] on the one hand, and a short __regs[53] on the other followed by the sp, tp, and lr fields, so the aliasing is done explicitly and is visible to the compiler. Reviewed-by: Jeff Epler <jepler@unpythonic.net> Signed-off-by: Chris Metcalf <cmetcalf@ezchip.com>
Showing 2 changed files with 20 additions and 10 deletions Side-by-side Diff
arch/tile/include/uapi/asm/ptrace.h
... | ... | @@ -52,12 +52,16 @@ |
52 | 52 | * system call or exception. "struct sigcontext" has the same shape. |
53 | 53 | */ |
54 | 54 | struct pt_regs { |
55 | - /* Saved main processor registers; 56..63 are special. */ | |
56 | - /* tp, sp, and lr must immediately follow regs[] for aliasing. */ | |
57 | - pt_reg_t regs[53]; | |
58 | - pt_reg_t tp; /* aliases regs[TREG_TP] */ | |
59 | - pt_reg_t sp; /* aliases regs[TREG_SP] */ | |
60 | - pt_reg_t lr; /* aliases regs[TREG_LR] */ | |
55 | + union { | |
56 | + /* Saved main processor registers; 56..63 are special. */ | |
57 | + pt_reg_t regs[56]; | |
58 | + struct { | |
59 | + pt_reg_t __regs[53]; | |
60 | + pt_reg_t tp; /* aliases regs[TREG_TP] */ | |
61 | + pt_reg_t sp; /* aliases regs[TREG_SP] */ | |
62 | + pt_reg_t lr; /* aliases regs[TREG_LR] */ | |
63 | + }; | |
64 | + }; | |
61 | 65 | |
62 | 66 | /* Saved special registers. */ |
63 | 67 | pt_reg_t pc; /* stored in EX_CONTEXT_K_0 */ |
arch/tile/include/uapi/asm/sigcontext.h
... | ... | @@ -24,10 +24,16 @@ |
24 | 24 | * but is simplified since we know the fault is from userspace. |
25 | 25 | */ |
26 | 26 | struct sigcontext { |
27 | - __uint_reg_t gregs[53]; /* General-purpose registers. */ | |
28 | - __uint_reg_t tp; /* Aliases gregs[TREG_TP]. */ | |
29 | - __uint_reg_t sp; /* Aliases gregs[TREG_SP]. */ | |
30 | - __uint_reg_t lr; /* Aliases gregs[TREG_LR]. */ | |
27 | + __extension__ union { | |
28 | + /* General-purpose registers. */ | |
29 | + __uint_reg_t gregs[56]; | |
30 | + __extension__ struct { | |
31 | + __uint_reg_t __gregs[53]; | |
32 | + __uint_reg_t tp; /* Aliases gregs[TREG_TP]. */ | |
33 | + __uint_reg_t sp; /* Aliases gregs[TREG_SP]. */ | |
34 | + __uint_reg_t lr; /* Aliases gregs[TREG_LR]. */ | |
35 | + }; | |
36 | + }; | |
31 | 37 | __uint_reg_t pc; /* Program counter. */ |
32 | 38 | __uint_reg_t ics; /* In Interrupt Critical Section? */ |
33 | 39 | __uint_reg_t faultnum; /* Fault number. */ |