mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-14 06:50:27 +08:00
More tests for ubsan.
From-SVN: r205985
This commit is contained in:
parent
7ddf4d5ace
commit
dc4fe9edfb
@ -1,3 +1,8 @@
|
||||
2013-12-14 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
* c-c++-common/ubsan/overflow-1.c: New test.
|
||||
* c-c++-common/ubsan/overflow-2.c: New test.
|
||||
|
||||
2013-12-14 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR sanitizer/59503
|
||||
|
263
gcc/testsuite/c-c++-common/ubsan/overflow-1.c
Normal file
263
gcc/testsuite/c-c++-common/ubsan/overflow-1.c
Normal file
@ -0,0 +1,263 @@
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-fsanitize=signed-integer-overflow" } */
|
||||
/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */
|
||||
|
||||
#ifndef ASM1
|
||||
# define ASM1(a) /* Nothing */
|
||||
#endif
|
||||
#ifndef ASM2
|
||||
# define ASM2(a, b) /* Nothing */
|
||||
#endif
|
||||
|
||||
#define CHECK(A, B) ({ if ((A) != (B)) __builtin_abort (); })
|
||||
|
||||
#define FN1(T1, T2, OP) \
|
||||
({ \
|
||||
T1 a = 14; \
|
||||
T2 b = 9; \
|
||||
ASM2 (a, b); \
|
||||
a OP b; \
|
||||
})
|
||||
|
||||
#define FN2(T, OP) \
|
||||
({ \
|
||||
T a = 14; \
|
||||
ASM1 (a); \
|
||||
a OP 7; \
|
||||
})
|
||||
|
||||
#define FN3(T1, T2, OP) \
|
||||
({ \
|
||||
T1 a = 4; \
|
||||
T2 b = 1; \
|
||||
ASM2 (a, b); \
|
||||
~a OP b; \
|
||||
})
|
||||
|
||||
#define FN4(T1, T2, OP) \
|
||||
({ \
|
||||
T1 a = 4; \
|
||||
T2 b = 1; \
|
||||
ASM2 (a, b); \
|
||||
a OP ~b; \
|
||||
})
|
||||
|
||||
#define FN5(T) \
|
||||
({ \
|
||||
T a = 77; \
|
||||
ASM1 (a); \
|
||||
-a; \
|
||||
})
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
CHECK (FN1 (char, char, +), 23);
|
||||
CHECK (FN1 (char, char, -), 5);
|
||||
CHECK (FN1 (char, char, *), 126);
|
||||
CHECK (FN1 (unsigned char, unsigned char, +), 23);
|
||||
CHECK (FN1 (unsigned char, unsigned char, -), 5);
|
||||
CHECK (FN1 (unsigned char, unsigned char, *), 126);
|
||||
CHECK (FN1 (short, short, +), 23);
|
||||
CHECK (FN1 (short, short, -), 5);
|
||||
CHECK (FN1 (short, short, *), 126);
|
||||
CHECK (FN1 (unsigned short, unsigned short, +), 23);
|
||||
CHECK (FN1 (unsigned short, unsigned short, -), 5);
|
||||
CHECK (FN1 (unsigned short, unsigned short, *), 126);
|
||||
CHECK (FN1 (int, int, +), 23);
|
||||
CHECK (FN1 (int, int, -), 5);
|
||||
CHECK (FN1 (int, int, *), 126);
|
||||
CHECK (FN1 (unsigned int, unsigned int, +), 23);
|
||||
CHECK (FN1 (unsigned int, unsigned int, -), 5);
|
||||
CHECK (FN1 (unsigned int, unsigned int, *), 126);
|
||||
CHECK (FN1 (long int, long int, +), 23);
|
||||
CHECK (FN1 (long int, long int, -), 5);
|
||||
CHECK (FN1 (long int, long int, *), 126);
|
||||
CHECK (FN1 (unsigned long int, unsigned long int, +), 23);
|
||||
CHECK (FN1 (unsigned long int, unsigned long int, -), 5);
|
||||
CHECK (FN1 (unsigned long int, unsigned long int, *), 126);
|
||||
CHECK (FN1 (long long int, long int, +), 23);
|
||||
CHECK (FN1 (long long int, long int, -), 5);
|
||||
CHECK (FN1 (long long int, long int, *), 126);
|
||||
CHECK (FN1 (unsigned long long int, unsigned long long int, +), 23);
|
||||
CHECK (FN1 (unsigned long long int, unsigned long long int, -), 5);
|
||||
CHECK (FN1 (unsigned long long int, unsigned long long int, *), 126);
|
||||
CHECK (FN1 (int, unsigned char, +), 23);
|
||||
CHECK (FN1 (int, unsigned char, -), 5);
|
||||
CHECK (FN1 (int, unsigned char, *), 126);
|
||||
CHECK (FN1 (unsigned char, int, +), 23);
|
||||
CHECK (FN1 (unsigned char, int, -), 5);
|
||||
CHECK (FN1 (unsigned char, int, *), 126);
|
||||
CHECK (FN1 (int, long int, +), 23);
|
||||
CHECK (FN1 (int, long int, -), 5);
|
||||
CHECK (FN1 (int, long int, *), 126);
|
||||
CHECK (FN1 (long int, int, +), 23);
|
||||
CHECK (FN1 (long int, int, -), 5);
|
||||
CHECK (FN1 (long int, int, *), 126);
|
||||
CHECK (FN1 (unsigned int, int, +), 23);
|
||||
CHECK (FN1 (unsigned int, int, -), 5);
|
||||
CHECK (FN1 (unsigned int, int, *), 126);
|
||||
CHECK (FN1 (int, unsigned int, +), 23);
|
||||
CHECK (FN1 (int, unsigned int, -), 5);
|
||||
CHECK (FN1 (int, unsigned int, *), 126);
|
||||
CHECK (FN1 (unsigned long int, int, +), 23);
|
||||
CHECK (FN1 (unsigned long int, int, -), 5);
|
||||
CHECK (FN1 (unsigned long int, int, *), 126);
|
||||
CHECK (FN1 (int, unsigned long int, +), 23);
|
||||
CHECK (FN1 (int, unsigned long int, -), 5);
|
||||
CHECK (FN1 (int, unsigned long int, *), 126);
|
||||
|
||||
CHECK (FN2 (char, +), 21);
|
||||
CHECK (FN2 (char, -), 7);
|
||||
CHECK (FN2 (char, *), 98);
|
||||
CHECK (FN2 (unsigned char, +), 21);
|
||||
CHECK (FN2 (unsigned char, -), 7);
|
||||
CHECK (FN2 (unsigned char, *), 98);
|
||||
CHECK (FN2 (short, +), 21);
|
||||
CHECK (FN2 (short, -), 7);
|
||||
CHECK (FN2 (short, *), 98);
|
||||
CHECK (FN2 (unsigned short, +), 21);
|
||||
CHECK (FN2 (unsigned short, -), 7);
|
||||
CHECK (FN2 (unsigned short, *), 98);
|
||||
CHECK (FN2 (int, +), 21);
|
||||
CHECK (FN2 (int, -), 7);
|
||||
CHECK (FN2 (int, *), 98);
|
||||
CHECK (FN2 (unsigned int, +), 21);
|
||||
CHECK (FN2 (unsigned int, -), 7);
|
||||
CHECK (FN2 (unsigned int, *), 98);
|
||||
CHECK (FN2 (long int, +), 21);
|
||||
CHECK (FN2 (long int, -), 7);
|
||||
CHECK (FN2 (long int, *), 98);
|
||||
CHECK (FN2 (unsigned long int, +), 21);
|
||||
CHECK (FN2 (unsigned long int, -), 7);
|
||||
CHECK (FN2 (unsigned long int, *), 98);
|
||||
CHECK (FN2 (long long int, +), 21);
|
||||
CHECK (FN2 (long long int, -), 7);
|
||||
CHECK (FN2 (long long int, *), 98);
|
||||
CHECK (FN2 (unsigned long long int, +), 21);
|
||||
CHECK (FN2 (unsigned long long int, -), 7);
|
||||
CHECK (FN2 (unsigned long long int, *), 98);
|
||||
|
||||
CHECK (FN3 (char, char, +), -4);
|
||||
CHECK (FN3 (char, char, -), -6);
|
||||
CHECK (FN3 (char, char, *), -5);
|
||||
CHECK (FN3 (unsigned char, unsigned char, +), -4);
|
||||
CHECK (FN3 (unsigned char, unsigned char, -), -6);
|
||||
CHECK (FN3 (unsigned char, unsigned char, *), -5);
|
||||
CHECK (FN3 (short, short, +), -4);
|
||||
CHECK (FN3 (short, short, -), -6);
|
||||
CHECK (FN3 (short, short, *), -5);
|
||||
CHECK (FN3 (unsigned short, unsigned short, +), -4);
|
||||
CHECK (FN3 (unsigned short, unsigned short, -), -6);
|
||||
CHECK (FN3 (unsigned short, unsigned short, *), -5);
|
||||
CHECK (FN3 (int, int, +), -4);
|
||||
CHECK (FN3 (int, int, -), -6);
|
||||
CHECK (FN3 (int, int, *), -5);
|
||||
CHECK (FN3 (unsigned int, unsigned int, +), -4);
|
||||
CHECK (FN3 (unsigned int, unsigned int, -), -6);
|
||||
CHECK (FN3 (unsigned int, unsigned int, *), -5);
|
||||
CHECK (FN3 (long int, long int, +), -4);
|
||||
CHECK (FN3 (long int, long int, -), -6);
|
||||
CHECK (FN3 (long int, long int, *), -5);
|
||||
CHECK (FN3 (unsigned long int, unsigned long int, +), -4);
|
||||
CHECK (FN3 (unsigned long int, unsigned long int, -), -6);
|
||||
CHECK (FN3 (unsigned long int, unsigned long int, *), -5);
|
||||
CHECK (FN3 (long long int, long int, +), -4);
|
||||
CHECK (FN3 (long long int, long int, -), -6);
|
||||
CHECK (FN3 (long long int, long int, *), -5);
|
||||
CHECK (FN3 (unsigned long long int, unsigned long long int, +), -4);
|
||||
CHECK (FN3 (unsigned long long int, unsigned long long int, -), -6);
|
||||
CHECK (FN3 (unsigned long long int, unsigned long long int, *), -5);
|
||||
CHECK (FN3 (int, unsigned char, +), -4);
|
||||
CHECK (FN3 (int, unsigned char, -), -6);
|
||||
CHECK (FN3 (int, unsigned char, *), -5);
|
||||
CHECK (FN3 (unsigned char, int, +), -4);
|
||||
CHECK (FN3 (unsigned char, int, -), -6);
|
||||
CHECK (FN3 (unsigned char, int, *), -5);
|
||||
CHECK (FN3 (int, long int, +), -4);
|
||||
CHECK (FN3 (int, long int, -), -6);
|
||||
CHECK (FN3 (int, long int, *), -5);
|
||||
CHECK (FN3 (long int, int, +), -4);
|
||||
CHECK (FN3 (long int, int, -), -6);
|
||||
CHECK (FN3 (long int, int, *), -5);
|
||||
CHECK (FN3 (unsigned int, int, +), -4);
|
||||
CHECK (FN3 (unsigned int, int, -), -6);
|
||||
CHECK (FN3 (unsigned int, int, *), -5);
|
||||
CHECK (FN3 (int, unsigned int, +), -4);
|
||||
CHECK (FN3 (int, unsigned int, -), -6);
|
||||
CHECK (FN3 (int, unsigned int, *), -5);
|
||||
CHECK (FN3 (unsigned long int, int, +), -4);
|
||||
CHECK (FN3 (unsigned long int, int, -), -6);
|
||||
CHECK (FN3 (unsigned long int, int, *), -5);
|
||||
CHECK (FN3 (int, unsigned long int, +), -4);
|
||||
CHECK (FN3 (int, unsigned long int, -), -6);
|
||||
CHECK (FN3 (int, unsigned long int, *), -5);
|
||||
|
||||
CHECK (FN4 (char, char, +), 2);
|
||||
CHECK (FN4 (char, char, -), 6);
|
||||
CHECK (FN4 (char, char, *), -8);
|
||||
CHECK (FN4 (unsigned char, unsigned char, +), 2);
|
||||
CHECK (FN4 (unsigned char, unsigned char, -), 6);
|
||||
CHECK (FN4 (unsigned char, unsigned char, *), -8);
|
||||
CHECK (FN4 (short, short, +), 2);
|
||||
CHECK (FN4 (short, short, -), 6);
|
||||
CHECK (FN4 (short, short, *), -8);
|
||||
CHECK (FN4 (unsigned short, unsigned short, +), 2);
|
||||
CHECK (FN4 (unsigned short, unsigned short, -), 6);
|
||||
CHECK (FN4 (unsigned short, unsigned short, *), -8);
|
||||
CHECK (FN4 (int, int, +), 2);
|
||||
CHECK (FN4 (int, int, -), 6);
|
||||
CHECK (FN4 (int, int, *), -8);
|
||||
CHECK (FN4 (unsigned int, unsigned int, +), 2);
|
||||
CHECK (FN4 (unsigned int, unsigned int, -), 6);
|
||||
CHECK (FN4 (unsigned int, unsigned int, *), -8);
|
||||
CHECK (FN4 (long int, long int, +), 2);
|
||||
CHECK (FN4 (long int, long int, -), 6);
|
||||
CHECK (FN4 (long int, long int, *), -8);
|
||||
CHECK (FN4 (unsigned long int, unsigned long int, +), 2);
|
||||
CHECK (FN4 (unsigned long int, unsigned long int, -), 6);
|
||||
CHECK (FN4 (unsigned long int, unsigned long int, *), -8);
|
||||
CHECK (FN4 (long long int, long int, +), 2);
|
||||
CHECK (FN4 (long long int, long int, -), 6);
|
||||
CHECK (FN4 (long long int, long int, *), -8);
|
||||
CHECK (FN4 (unsigned long long int, unsigned long long int, +), 2);
|
||||
CHECK (FN4 (unsigned long long int, unsigned long long int, -), 6);
|
||||
CHECK (FN4 (unsigned long long int, unsigned long long int, *), -8);
|
||||
CHECK (FN4 (int, unsigned char, +), 2);
|
||||
CHECK (FN4 (int, unsigned char, -), 6);
|
||||
CHECK (FN4 (int, unsigned char, *), -8);
|
||||
CHECK (FN4 (unsigned char, int, +), 2);
|
||||
CHECK (FN4 (unsigned char, int, -), 6);
|
||||
CHECK (FN4 (unsigned char, int, *), -8);
|
||||
CHECK (FN4 (int, long int, +), 2);
|
||||
CHECK (FN4 (int, long int, -), 6);
|
||||
CHECK (FN4 (int, long int, *), -8);
|
||||
CHECK (FN4 (long int, int, +), 2);
|
||||
CHECK (FN4 (long int, int, -), 6);
|
||||
CHECK (FN4 (long int, int, *), -8);
|
||||
CHECK (FN4 (unsigned int, int, +), 2);
|
||||
CHECK (FN4 (unsigned int, int, -), 6);
|
||||
CHECK (FN4 (unsigned int, int, *), -8);
|
||||
CHECK (FN4 (int, unsigned int, +), 2);
|
||||
CHECK (FN4 (int, unsigned int, -), 6);
|
||||
CHECK (FN4 (int, unsigned int, *), -8);
|
||||
CHECK (FN4 (unsigned long int, int, +), 2);
|
||||
CHECK (FN4 (unsigned long int, int, -), 6);
|
||||
CHECK (FN4 (unsigned long int, int, *), -8);
|
||||
CHECK (FN4 (int, unsigned long int, +), 2);
|
||||
CHECK (FN4 (int, unsigned long int, -), 6);
|
||||
CHECK (FN4 (int, unsigned long int, *), -8);
|
||||
|
||||
CHECK (FN5 (char), -77);
|
||||
CHECK (FN5 (unsigned char), -77);
|
||||
CHECK (FN5 (short), -77);
|
||||
CHECK (FN5 (unsigned short), -77);
|
||||
CHECK (FN5 (int), -77);
|
||||
CHECK (FN5 (unsigned int), -77);
|
||||
CHECK (FN5 (long int), -77);
|
||||
CHECK (FN5 (unsigned long int), -77);
|
||||
CHECK (FN5 (long long int), -77);
|
||||
CHECK (FN5 (unsigned long long int), -77);
|
||||
|
||||
return 0;
|
||||
}
|
8
gcc/testsuite/c-c++-common/ubsan/overflow-2.c
Normal file
8
gcc/testsuite/c-c++-common/ubsan/overflow-2.c
Normal file
@ -0,0 +1,8 @@
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-fsanitize=signed-integer-overflow" } */
|
||||
/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */
|
||||
|
||||
#define ASM1(a) asm volatile ("" : "+g" (a))
|
||||
#define ASM2(a, b) asm volatile ("" : "+g" (a), "+g" (b))
|
||||
|
||||
#include "overflow-1.c"
|
Loading…
x
Reference in New Issue
Block a user