+2014-03-24 Marek Polacek <polacek@redhat.com>
+
+ * c-c++-common/ubsan/div-by-zero-4.c: Don't include limits.h. Define
+ INT_MIN.
+ * c-c++-common/ubsan/overflow-1.c: Check for unwanted output.
+ * c-c++-common/ubsan/overflow-add-1.c: Likewise.
+ * c-c++-common/ubsan/overflow-mul-1.c: Likewise.
+ * c-c++-common/ubsan/overflow-mul-3.c: Likewise.
+ * c-c++-common/ubsan/overflow-negate-2.c: Likewise.
+ * c-c++-common/ubsan/overflow-sub-1.c: Likewise.
+ * c-c++-common/ubsan/pr59503.c: Likewise.
+ * c-c++-common/ubsan/pr60613-1.c: Likewise.
+ * c-c++-common/ubsan/save-expr-1.c: Likewise.
+ * c-c++-common/ubsan/shift-3.c: Likewise.
+ * c-c++-common/ubsan/shift-6.c: Likewise.
+ * c-c++-common/ubsan/undefined-1.c: Likewise.
+ * c-c++-common/ubsan/vla-2.c: Likewise.
+ * c-c++-common/ubsan/vla-3.c: Likewise.
+ * c-c++-common/ubsan/vla-4.c: Likewise.
+ * g++.dg/ubsan/cxx11-shift-1.C: Likewise.
+ * g++.dg/ubsan/return-2.C: Likewise.
+
2014-03-23 John David Anglin <danglin@gcc.gnu.org>
* gcc.dg/tree-prof/pr59003.c: Add -fno-common to dg-options on
/* { dg-do run } */
/* { dg-options "-fsanitize=integer-divide-by-zero -Wno-overflow" } */
-#include <limits.h>
+#define INT_MIN (-__INT_MAX__ - 1)
int
main (void)
/* { dg-do run } */
/* { dg-options "-fsanitize=signed-integer-overflow" } */
+#include <stdio.h>
+
#ifndef ASM1
# define ASM1(a) /* Nothing */
#endif
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
CHECK (FN1 (char, char, +), 23);
CHECK (FN1 (char, char, -), 5);
CHECK (FN1 (char, char, *), 126);
CHECK (FN5 (long long int), -77);
CHECK (FN5 (unsigned long long int), -77);
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable" } */
+#include <stdio.h>
+
#define SCHAR_MAX __SCHAR_MAX__
#define SHRT_MAX __SHRT_MAX__
#define INT_MAX __INT_MAX__
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
#if __INT_MAX__ == 2147483647
/* Here, nothing should fail. */
volatile int j = INT_MAX;
check (d, -32768);
#endif
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable" } */
+#include <stdio.h>
+
#define SCHAR_MAX __SCHAR_MAX__
#define SHRT_MAX __SHRT_MAX__
#define INT_MAX __INT_MAX__
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
/* Test integer promotion. */
#if __SCHAR_MAX__ == 127
volatile signed char a = -2;
check (o, INT_MIN);
#endif
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=signed-integer-overflow" } */
+#include <stdio.h>
+
__attribute__((noinline, noclone)) long long
mul (long long x, long long y)
{
int
main ()
{
+ fputs ("UBSAN TEST START\n", stderr);
+
unsigned int i;
for (i = 0; i < sizeof (tab) / sizeof (long long); i += 3)
if (mul (tab[i], tab[i + 1]) != tab[i + 2]
|| mul (tab[i + 1], tab[i]) != tab[i + 2])
__builtin_abort ();
+
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable" } */
+#include <stdio.h>
+
#define SCHAR_MIN (-__SCHAR_MAX__ - 1)
#define SHRT_MIN (-__SHRT_MAX__ - 1)
#define INT_MIN (-__INT_MAX__ - 1)
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
volatile signed char c = -SCHAR_MIN;
CHECK (c, -128);
lli = -(unsigned long long) lli;
CHECK (lli, -0x8000000000000000L);
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable" } */
+#include <stdio.h>
+
#define SCHAR_MAX __SCHAR_MAX__
#define SCHAR_MIN (-__SCHAR_MAX__ - 1)
#define SHRT_MAX __SHRT_MAX__
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
#if __INT_MAX__ == 2147483647
/* Here, nothing should fail. */
volatile int i = -1;
check (d, 32767);
#endif
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=signed-integer-overflow" } */
+#include <stdio.h>
+
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
long long int a = 14;
long int b = 9;
asm volatile ("" : "+r" (a), "+r" (b));
if ((a - b) != 5)
__builtin_abort ();
+
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=undefined" } */
+#include <stdio.h>
+
long long y;
__attribute__((noinline, noclone)) long long
int
main ()
{
+ fputs ("UBSAN TEST START\n", stderr);
+
y = 1;
if (foo (8 - 2040) != 8 - 1)
__builtin_abort ();
if (bar (1) != 8 - 1)
__builtin_abort ();
+
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do compile } */
/* { dg-options "-fsanitize=shift -Wall -Werror -O" } */
+#include <stdio.h>
+
static int x;
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
int o = 1;
int y = x << o;
+
+ fputs ("UBSAN TEST END\n", stderr);
return y;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=shift -w" } */
+#include <stdio.h>
+
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
unsigned int a = 1;
a <<= 31;
a <<= 1;
+
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run { target int32plus } } */
/* { dg-options "-fsanitize=shift -w" } */
+#include <stdio.h>
+
int x = 7;
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
/* All of the following should pass. */
int A[128 >> 5] = {};
int B[128 << 5] = {};
case 128 >> (4 + 1):
return 1;
}
+
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=undefined" } */
+#include <stdio.h>
+
int
foo (int x, int y)
{
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
foo (3, 2);
bar (12, 42);
+
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=vla-bound -Wall -Wno-unused-variable" } */
+#include <stdio.h>
+
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
const int t = 0;
struct s {
int x;
int g[t];
};
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=vla-bound" } */
+#include <stdio.h>
+
/* Don't instrument the arrays here. */
int
foo (int n, int a[])
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
int a[6] = { };
- return foo (3, a);
+ int ret = foo (3, a);
+
+ fputs ("UBSAN TEST END\n", stderr);
+ return ret;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run } */
/* { dg-options "-fsanitize=vla-bound" } */
+#include <stdio.h>
+
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
int x = 1;
/* Check that the size of an array is evaluated only once. */
int a[++x];
if (x != 2)
__builtin_abort ();
+
+ fputs ("UBSAN TEST END\n", stderr);
return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
/* { dg-do run { target c++11 } } */
/* { dg-options "-fsanitize=shift -w" } */
+#include <stdio.h>
+
int
main (void)
{
+ fputs ("UBSAN TEST START\n", stderr);
+
int a = 1;
a <<= 31;
+
+ fputs ("UBSAN TEST END\n", stderr);
+ return 0;
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */
// { dg-do run }
// { dg-options "-fsanitize=return" }
+#include <stdio.h>
+
struct S { S (); ~S (); };
S::S () {}
int
main ()
{
+ fputs ("UBSAN TEST START\n", stderr);
+
foo (1);
foo (14);
+
+ fputs ("UBSAN TEST END\n", stderr);
}
+
+/* { dg-output "UBSAN TEST START(\n|\r\n|\r)UBSAN TEST END" } */