1 #include <stdio.h> 2 3 int overflow_add_32(int x, int y) 4 { 5 int res; 6 return __builtin_add_overflow(x, y, &res); 7 } 8 9 int overflow_add_64(long long x, long long y) 10 { 11 long long res; 12 return __builtin_add_overflow(x, y, &res); 13 } 14 15 int overflow_sub_32(int x, int y) 16 { 17 int res; 18 return __builtin_sub_overflow(x, y, &res); 19 } 20 21 int overflow_sub_64(long long x, long long y) 22 { 23 long long res; 24 return __builtin_sub_overflow(x, y, &res); 25 } 26 27 int a1_add = -2147483648; 28 int b1_add = -2147483648; 29 long long a2_add = -9223372036854775808ULL; 30 long long b2_add = -9223372036854775808ULL; 31 32 int a1_sub; 33 int b1_sub = -2147483648; 34 long long a2_sub = 0L; 35 long long b2_sub = -9223372036854775808ULL; 36 37 int main() 38 { 39 int ret = 0; 40 41 if (!overflow_add_32(a1_add, b1_add)) { 42 fprintf(stderr, "data overflow while adding 32 bits\n"); 43 ret = 1; 44 } 45 if (!overflow_add_64(a2_add, b2_add)) { 46 fprintf(stderr, "data overflow while adding 64 bits\n"); 47 ret = 1; 48 } 49 if (!overflow_sub_32(a1_sub, b1_sub)) { 50 fprintf(stderr, "data overflow while subtracting 32 bits\n"); 51 ret = 1; 52 } 53 if (!overflow_sub_64(a2_sub, b2_sub)) { 54 fprintf(stderr, "data overflow while subtracting 64 bits\n"); 55 ret = 1; 56 } 57 return ret; 58 } 59