Overflowcheck
unknown
c_cpp
a year ago
6.2 kB
10
Indexable
#include <iostream>
#include <typeinfo>
#include <stdio.h>
#include <limits>
/*
TYPE_VAR - Variable to determine returned type value (It can be the same as var1)
var1 - First variable
var2 - Second variable
x - Operation
*/
template <typename T, typename U, typename O>
void check_overflow(const T TYPE_VAR, const U var1 = 0, char x = '_', const O var2 = 0)
{
if (typeid(TYPE_VAR) == typeid(float) || typeid(var1) == typeid(float) || typeid(var2) == typeid(float)) // -3.4e+30f - 3.4e+30f
{
//printf("\n\n\n<<< NOT HANDLING THIS TYPE YET !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\n");
printf("\n\nerror !!! FLOAT DETECTED -> check for yourself!!! Type min -> max (-3.4e+30f -> 3.4e+30f)");
printf("\nerror TYPE_VALUE has type: %s", typeid(T).name());
printf("\nerror FIRST VALUE has type: %s", typeid(U).name());
printf("\nerror SECOND VALUE has type: %s", typeid(O).name());
printf("\nerror (%%f) TYPE_VALUE: %f \nerror (%%f) FIRST VALUE: %f \nerror (%%f) SECOND VALUE: %f", TYPE_VAR,var1,var2);
printf("\nerror (%%llu) TYPE_VALUE: %llu \nerror (%%llu) FIRST VALUE: %llu \nerror (%%llu) SECOND VALUE: %llu", TYPE_VAR,var1,var2);
return;
}
else if (typeid(TYPE_VAR) == typeid(signed long long) || typeid(var1) == typeid(signed long long) || typeid(var2) == typeid(signed long long)) // -9223372036854775809 - 9223372036854775807
{
printf("\n\nerror (SIGNED LONG LONG) CHECK FOR OVERFLOW YOURSELF!!! Type min -> max (-9223372036854775809 -> 9223372036854775807) \n");
printf("\nerror TYPE_VALUE has type: %s", typeid(T).name());
printf("\nerror FIRST VALUE has type: %s", typeid(U).name());
printf("\nerror SECOND VALUE has type: %s", typeid(O).name());
printf("\nerror (%%lld) TYPE_VALUE: %lld \nerror (%%lld) FIRST VALUE: %lld \nerror (%%lld) SECOND VALUE: %lld", TYPE_VAR, var1, var2);
printf("\nerror (%%llu) TYPE_VALUE: %llu \nerror (%%llu) FIRST VALUE: %llu \nerror (%%llu) SECOND VALUE: %llu", TYPE_VAR, var1, var2);
return;
}
else if (typeid(TYPE_VAR) == typeid(unsigned long long) || typeid(var1) == typeid(unsigned long long) || typeid(var2) == typeid(unsigned long long)) // 0 - 18446744073709551615
{
printf("\n\nerror (UNSIGNED LONG LONG) CHECK FOR OVERFLOW YOURSELF!!! (0 -> 18446744073709551615)");
printf("\nerror TYPE_VALUE has type: %s", typeid(T).name());
printf("\nerror FIRST VALUE has type: %s", typeid(U).name());
printf("\nerror SECOND VALUE has type: %s", typeid(O).name());
printf("\nerror (%%lld) TYPE_VALUE: %lld \nerror (%%lld) FIRST VALUE: %lld \nerror (%%lld) SECOND VALUE: %lld", TYPE_VAR, var1, var2);
printf("\nerror (%%llu) TYPE_VALUE: %llu \nerror (%%llu) FIRST VALUE: %llu \nerror (%%llu) SECOND VALUE: %llu", TYPE_VAR, var1, var2);
return;
}
long long TYPE_MINIMUM = std::numeric_limits<T>::min();
long long TYPE_MAXIMUM = std::numeric_limits<T>::max();
long long temp_var1 = var1;
long long temp_var2 = var2;
switch (x)
{
case '+':
if ((temp_var1 + temp_var2) > TYPE_MAXIMUM)
{
printf("\nerror OVERFLOW !!! ");
printf("\nerror Sum result: %lld is higher than TYPE MAXIMUM: %lld\n\n", temp_var1 + temp_var2, TYPE_MAXIMUM);
}
break;
case '-':
if ((temp_var1 - temp_var2) < TYPE_MINIMUM)
{
printf("\nerror UNDERFLOW !!! ");
printf("\nerror Subtraction result: %lld is lower than TYPE MINIMUM: %lld\n\n", temp_var1 - temp_var2, TYPE_MINIMUM);
}
break;
case '*':
if ((temp_var1 * temp_var2) > TYPE_MAXIMUM)
{
printf("\nerror OVERFLOW !!! ");
printf("\nerror Multiplication result: %lld is higher than TYPE MAXIMUM: %lld\n\n", temp_var1 * temp_var2, TYPE_MAXIMUM);
}
else if ((temp_var1 * temp_var2) < TYPE_MINIMUM)
{
printf("\nerror UNDERFLOW !!! ");
printf("\nerror Multiplication result: %lld is lower than TYPE MINIMUM: %lld\n\n", temp_var1 * temp_var2, TYPE_MINIMUM);
}
break;
case '/':
if (temp_var2 == 0)
{
printf("\nerror DIVIDING BY 0 !!! \n\n");
}
else if ((temp_var1 / temp_var2) > TYPE_MAXIMUM)
{
printf("\nerror OVERFLOW !!! ");
printf("\nerror Dividing result: %lld is higher than TYPE MAXIMUM: %lld\n\n", temp_var1 / temp_var2, TYPE_MAXIMUM);
}
else if ((temp_var1 / temp_var2) < TYPE_MINIMUM)
{
printf("\nerror UNDERFLOW !!! ");
printf("\nerror Dividing result: %lld is lower than TYPE MINIMUM: %lld\n\n", temp_var1 / temp_var2, TYPE_MINIMUM);
}
break;
default:
printf("\n\n\n<<< NOT HANDLING THIS OPERATION YET !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\n");
break;
}
}
int main()
{
signed char char_x = 0;
unsigned char uchar_x = 0;
signed short short_x = 0;
unsigned short ushort_x = 0;
signed int int_x = 0;
unsigned int uint_x = 0;
signed long long_x = 0;
unsigned long ulong_x = 0;
signed long long longlong_x = 0;
unsigned long long ulonglong_x = 0;
float float_x = 0;
check_overflow(char_x, 0,'+',0);
check_overflow(uchar_x, 0,'+',0);
check_overflow(short_x, 0,'+',0);
check_overflow(ushort_x, 0,'+',0);
check_overflow(int_x, 0,'+',0);
check_overflow(uint_x, 0,'+',0);
check_overflow(long_x, 0,'+',0);
check_overflow(ulong_x, 0,'+',0);
check_overflow(ulong_x, 0,'+',0);
check_overflow(longlong_x, 0,'+',0);
check_overflow(ulonglong_x, 0,'+',0);
check_overflow(float_x, 0,'+',0);
}
Editor is loading...
Leave a Comment