aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/ubsan/ptr-overflow-sanitization-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/c-c++-common/ubsan/ptr-overflow-sanitization-1.c')
-rw-r--r--gcc/testsuite/c-c++-common/ubsan/ptr-overflow-sanitization-1.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/gcc/testsuite/c-c++-common/ubsan/ptr-overflow-sanitization-1.c b/gcc/testsuite/c-c++-common/ubsan/ptr-overflow-sanitization-1.c
new file mode 100644
index 00000000000..42c14523764
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/ubsan/ptr-overflow-sanitization-1.c
@@ -0,0 +1,80 @@
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-O -fsanitize=pointer-overflow" } */
+/* { dg-skip-if "" { *-*-* } "-flto" } */
+
+#define SMAX __PTRDIFF_MAX__
+
+void foo(void)
+{
+ char *p;
+ char *p2;
+ char b[1];
+ char c[1];
+
+ p = b + SMAX; /* pointer overflow check is needed */
+ p = b;
+ p++;
+ p2 = p + 1000;
+ p2 = p + 999;
+
+ p = b + SMAX;
+ p2 = p + 1; /* pointer overflow check is needed */
+
+ p = b;
+ p--; /* pointer overflow check is needed */
+ p2 = p + 1;
+ p2 = p + 2;
+
+ p = b - SMAX; /* pointer overflow check is needed */
+ p2 = p + (SMAX - 2); /* b - 2: pointer overflow check is needed */
+ p2 = p + (SMAX - 1); /* b - 1: pointer overflow check is needed */
+ p2 = p + SMAX; /* b: pointer overflow check is needed */
+ p2++; /* b + 1 */
+
+ p = c;
+ p++; /* c + 1 */
+ p = c - SMAX; /* pointer overflow check is needed */
+ p2 = p + SMAX; /* c: pointer overflow check is needed */
+ p2++; /* c + 1 */
+}
+
+void bar(char *ptr)
+{
+ char *p = ptr - 1000; /* pointer overflow check is needed */
+ p = ptr + 1000; /* pointer overflow check is needed */
+ p -= 2000; /* pointer overflow check is needed */
+}
+
+void baz(char *ptr)
+{
+ char **p = &ptr;
+ char **p2 = p + 20; /* pointer overflow check is needed */
+ p2--;
+}
+
+void positive_and_positive (char *ptr)
+{
+ char **p = &ptr;
+ char **p2 = p + 100; /* pointer overflow check is needed */
+ p2 = p + 10;
+ p += 50;
+}
+
+void negative_to_positive (char *ptr)
+{
+ char **p = &ptr;
+ char **p2 = p + 20; /* pointer overflow check is needed */
+ p2 = p - 10; /* pointer overflow check is needed */
+ p2 += 15;
+}
+
+void negative_to_negative (char *ptr)
+{
+ char **p = &ptr;
+ char **p2 = p - 20; /* pointer overflow check is needed */
+ p2 = p - 20;
+ p2 += 5;
+}
+
+
+/* { dg-final { scan-assembler-times "call\\s+__ubsan_handle_pointer_overflow" 17 } } */