Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé

La librairie <stdckdint.h> (C23)

La librairie stdbool.h La librairie stddef.h


Accès rapide :
Présentation de l'entête <stdckdint.h>
Entête à inclure
Macros arithmétiques vérifiées
Exemple de code
Macro __STDC_VERSION_STDCKDINT_H__
Sujets connexes

Présentation de l'entête <stdckdint.h>

La librairie <stdckdint.h>, introduite avec C23, propose quelques macros permettant de réaliser des opérations arithmétiques entières tout en détectant les dépassements de capacité. Elle fournit une addition, une soustraction et une multiplication vérifiées.

Ces opérations sont utiles dès qu'un calcul doit produire une valeur fiable avant d'être utilisée comme taille, indice, compteur ou borne. En C, un dépassement sur un entier signé peut produire un comportement indéfini : l'intérêt de ces macros est donc de tester le calcul avant d'exploiter le résultat.

POSIX n'ajoute pas d'élément propre à cette librairie. Les macros présentées ici relèvent du standard C ISO.

Entête à inclure

#include <stdckdint.h>

Macros arithmétiques vérifiées

Une présentation simplifiée de cette librairie consiste à considérer les trois macros suivantes comme des fonctions génériques. En pratique, elles sont bien définies comme des macros, ce qui permet au compilateur de choisir les types adaptés aux opérandes fournis.

bool ckd_add( type1 * result, type2 a, type3 b );
bool ckd_sub( type1 * result, type2 a, type3 b );
bool ckd_mul( type1 * result, type2 a, type3 b );

Le pointeur result fixe le type du résultat attendu. Les deux opérandes peuvent avoir d'autres types entiers : le test porte bien sur la possibilité de représenter le résultat dans le type pointé par result.

La macro retourne false si le résultat exact est représentable. Elle retourne true si un dépassement est détecté. Dans ce second cas, la valeur stockée dans *result ne doit pas être exploitée comme un résultat valide.

Exemple de code

L'exemple suivant déclenche volontairement trois dépassements de capacité pour montrer les tests à effectuer.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
#include <limits.h>
#include <stdckdint.h>
#include <stdio.h>
#include <stdlib.h>

int main() {

    int sum;
    unsigned int stock;
    int product;

    if ( ckd_add( &sum, INT_MAX, 1 ) ) {
        puts( "Addition impossible." );
    }

    if ( ckd_sub( &stock, 3u, 5u ) ) {
        puts( "Soustraction impossible." );
    }

    if ( ckd_mul( &product, INT_MAX / 2 + 1, 3 ) ) {
        puts( "Multiplication impossible." );
    }

    return EXIT_SUCCESS;
}
Utilisation des macros de stdckdint.h

Cet exemple produit l'affichage suivant.

Addition impossible.
Soustraction impossible.
Multiplication impossible.

Macro __STDC_VERSION_STDCKDINT_H__

La macro __STDC_VERSION_STDCKDINT_H__ permet de connaître la version de l'entête <stdckdint.h> fournie par l'implémentation. Elle a été ajoutée en C23.

Sujets connexes

La librairie limits.h
La librairie stdbool.h
La librairie stdint.h


La librairie stdbool.h La librairie stddef.h




Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé