On Mon, 2024-07-22 at 17:54 +0100, Joern Wolfgang Rennecke wrote: > > > On 22/07/2024 17:13, Joern Wolfgang Rennecke wrote: > > I guess you could reduce the differences between platforms if you > didn't > > use types as defined by headerfiles directly, as they might be > > #defines > > or typedefs or whatever, and instead used your own typedef or > > struct types. > > It seems a typedef to int is seen through, even if you chain two of > them > together. > After preprocessing, newlib has: > > typedef long int __int32_t; > > typedef __int32_t int32_t ; > > So the crucial point seems to be to have 'long int', but that is of > course not portable for int32_t. > > So to get portable code and consistent messages, I suppose we should > use > a struct: > > typedef struct { int32_t i; } my_int32; > my_int32 s42 = { 42 }; > my_int32 *buf = (my_int32 *) __builtin_alloca (4 * size + 3); /* { > dg-warning "allocated buffer size is not a multiple of the pointee's > size" } */ > buf[size] = s42; /* { dg-warning "stack-based buffer overflow" } > */ > > Now suddenly the diagram is made *more* verbose, with the struct > keyword > added. > > ┌─────────────────────────────────────────────┐ > │ write of ‘struct my_int32’ (4 > bytes) │ > > └─────────────────────────────────────────────┘ > │ │ > │ │ > v v > ┌───────────────────────────────────────┐ > ┌────────────────────────┐ > │ buffer allocated on stack at (1) │ │ after valid > range │ > └───────────────────────────────────────┘ > └────────────────────────┘ > ├───────────────────┬───────────────────┤ > ├───────────┬────────────┤ > │ │ > ╭────────────────┴───────────────╮ > ╭─────────┴────────╮ > │capacity: ‘(size * 4) + 3’ bytes│ │overflow of 1 > byte│ > ╰────────────────────────────────╯ > ╰──────────────────╯ >
Sorry, I didn't see this followup before sending my last email. I like this approach, as I don't care about exactly what the wording in that upper-right box is, just the wording towards the bottom of the diagram. Thanks Dave