Целочисленное умножение. При переполнении выбрасывается исключение
int mul(int lhs, int rhs)
{
int res = lhs * rhs;
if (res != 0 && res / lhs != rhs) {
throw std::runtime_error("signed overflow has occured");
}
return res;
}