Più semplicemente, tu in effetti devi verificare che
codice:
a*b<MAX_INT
a*b>MIN_INT
; scritto così naturalmente non va bene, dato che anche in questo caso a*b potrebbe andare in overflow/underflow. Tuttavia le disequazioni equivalenti
codice:
a<MAX_INT/b
a>MIN_INT/b
non presentano problemi di overflow (naturalmente devi controllare prima che b!=0). Tuttavia se b è negativo i segni delle disequazioni vanno invertiti.
Codice di esempio: https://www.securecoding.cert.org/co...Comments=false

Se te la cavi con l'assembly e se l'architettura per cui stai scrivendo il codice fornisce un overflow bit puoi sempre controllarlo; su architettura x86 potresti ad esempio usare l'istruzione JO, ma in questo non ti so aiutare.