| /* { dg-do run } */ |
| /* { dg-require-effective-target hwaddress_exec } */ |
| /* { dg-options "-fno-builtin-malloc -fno-builtin-free" } */ |
| /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ |
| /* { dg-shouldfail "hwasan" } */ |
| |
| #include <stdio.h> |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| extern void *malloc (__SIZE_TYPE__); |
| extern void free (void *); |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| struct Simple { |
| int value; |
| }; |
| |
| int f(struct Simple simple) { |
| return simple.value; |
| } |
| |
| int main() { |
| struct Simple *psimple = (struct Simple *) malloc(sizeof(struct Simple)); |
| psimple->value = 42; |
| free(psimple); |
| printf("%d\n", f(*psimple)); |
| return 0; |
| } |
| |
| /* { dg-output "HWAddressSanitizer: tag-mismatch on address 0x\[0-9a-f\]*.*" } */ |
| /* { dg-output "READ of size 4 at 0x\[0-9a-f\]* tags: \[\[:xdigit:\]\]\[\[:xdigit:\]\]/\[\[:xdigit:\]\]\[\[:xdigit:\]\] \\(ptr/mem\\) in thread T0.*" } */ |
| /* { dg-output "freed by thread T0 here:.*" } */ |
| /* { dg-output "previously allocated here:" } */ |