| /* { dg-do run } */ |
| /* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2 halt_on_error=0" } */ |
| /* { dg-options "-fsanitize=address,pointer-subtract" } */ |
| |
| volatile __PTRDIFF_TYPE__ v; |
| |
| __attribute__((noipa)) void |
| foo (char *p, char *q) |
| { |
| v = p - q; |
| } |
| |
| char global1[100] = {}, global2[100] = {}; |
| |
| int |
| main () |
| { |
| /* Heap allocated memory. */ |
| char *heap1 = (char *)__builtin_malloc (42); |
| char *heap2 = (char *)__builtin_malloc (42); |
| |
| /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */ |
| foo (heap1, heap2); |
| |
| /* Global variables. */ |
| /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */ |
| foo (&global1[0], &global2[10]); |
| |
| /* Stack variables. */ |
| char stack1, stack2; |
| /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */ |
| foo (&stack1, &stack2); |
| |
| /* Mixtures. */ |
| /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */ |
| foo (heap1, &stack1); |
| /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair.*" } */ |
| foo (heap1, &global1[0]); |
| /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair" } */ |
| foo (&stack1, &global1[0]); |
| |
| __builtin_free (heap1); |
| __builtin_free (heap2); |
| return 0; |
| } |