オーバーフロー

参考:INT32-C. 符号付き整数演算がオーバーフローを引き起こさないことを保証する

乗算の場合
void func(signed int si_a, signed int si_b) {
  signed int result;
  if (si_a > 0) {  
    if (si_b > 0) {  
      if (si_a > (INT_MAX / si_b)) {
        /* エラー処理 */
      }
    } else { /* si_a は正、 si_b はゼロ以下 */
      if (si_b < (INT_MIN / si_a)) {
        /* エラー処理 */
      }
    } /* si_a は正、si_b はゼロ以下 */
  } else { /* si_a はゼロ以下 */
    if (si_b > 0) { /* si_a is nonpositive, si_b is positive */
      if (si_a < (INT_MIN / si_b)) {
        /* エラー処理 */
      }
    } else { /* si_a と si_b はゼロ以下 */
      if ( (si_a != 0) && (si_b < (INT_MAX / si_a))) {
        /* エラー処理 */
      }
    }
  }

  result = si_a * si_b;
}