7 votes

Cette fonction de détection des dépassements d'addition d'entiers fonctionne-t-elle réellement ?

En lisant les commentaires pour cette question je suis tombé sur un lien vers le FAQ comp.lang.c qui montre une "fonction d'addition prudente" qui est censée détecter un dépassement d'entier :

int
chkadd(int a, int b)
{
    if (INT_MAX - b < a) {
        fputs("int overflow\n", stderr);
        return INT_MAX;
    }
    return a + b;
}

Comment cela ne déborde-t-il pas si b == -1 ? Si l'hypothèse est que a y b sont toutes deux positives, pourquoi les rendre int plutôt que unsigned int en premier lieu ?

4voto

chux Points 13185

L'OP a identifié que INT_MAX - b peut déborder, rendant le code restant invalide pour une détection correcte du débordement. Cela ne fonctionne pas.

if (INT_MAX - b < a) {  // Invalid overflow detection

Voici une méthode pour détecter un débordement sans UB :

int is_undefined_add1(int a, int b) {
  return (a < 0) ? (b < INT_MIN - a) : (b > INT_MAX - a);
}

pourquoi les faire int plutôt que unsigned int en premier lieu ?

Changer pour unsigned ne résout pas le problème en général . La gamme de unsigned: [0...UINT_MAX] pourrait être la moitié de celle de int: [INT_MIN...INT_MAX] . IOWs : INT_MAX == UINT_MAX . De tels systèmes sont rares de nos jours. IAC, le changement de type n'est pas nécessaire car codé avec is_undefined_add1() .

1voto

Probablement qu'ils l'ont juste négligé. Liens supplémentaires sur la page FAQ semblent fournir un code plus correct.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X