PR sanitizer/83392
[official-gcc.git] / gcc / testsuite / c-c++-common / ubsan / ptr-overflow-sanitization-1.c
blob14569d5a5c6106101a45fddb362b64da1b167b21
1 /* { dg-options "-O -fsanitize=pointer-overflow -fdump-tree-optimized" } */
2 /* { dg-skip-if "" { *-*-* } "-flto" } */
4 #define SMAX __PTRDIFF_MAX__
6 void foo(void)
8 char *p;
9 char *p2;
10 char b[1];
11 char c[1];
13 p = b + SMAX; /* pointer overflow check is needed */
14 p = b;
15 p++;
16 p2 = p + 1000;
17 p2 = p + 999;
19 p = b + SMAX;
20 p2 = p + 1; /* pointer overflow check is needed */
22 p = b;
23 p--; /* pointer overflow check is needed */
24 p2 = p + 1;
25 p2 = p + 2;
27 p = b - SMAX; /* pointer overflow check is needed */
28 p2 = p + (SMAX - 2); /* b - 2: no need to check this */
29 p2 = p + (SMAX - 1); /* b - 1: no need to check this */
30 p2 = p + SMAX; /* b: no need to check this */
31 p2++; /* b + 1 */
33 p = c;
34 p++; /* c + 1 */
35 p = c - SMAX; /* pointer overflow check is needed */
36 p2 = p + SMAX; /* c: pointer overflow check is needed */
37 p2++; /* c + 1 */
40 void bar(char *ptr)
42 char *p = ptr - 1000; /* pointer overflow check is needed */
43 p = ptr + 1000; /* pointer overflow check is needed */
44 p -= 2000; /* pointer overflow check is needed */
47 void baz(char *ptr)
49 char **p = &ptr;
50 char **p2 = p + 20; /* pointer overflow check is needed */
51 p2--;
54 void positive_and_positive (char *ptr)
56 char **p = &ptr;
57 char **p2 = p + 100; /* pointer overflow check is needed */
58 p2 = p + 10;
59 p += 50;
62 void negative_to_positive (char *ptr)
64 char **p = &ptr;
65 char **p2 = p + 20; /* pointer overflow check is needed */
66 p2 = p - 10; /* pointer overflow check is needed */
67 p2 += 15;
70 void negative_to_negative (char *ptr)
72 char **p = &ptr;
73 char **p2 = p - 20; /* pointer overflow check is needed */
74 p2 = p - 20;
75 p2 += 5;
78 /* { dg-final { scan-tree-dump-times "__ubsan_handle_pointer_overflow" 14 "optimized" } } */