Maison > développement back-end > C++ > Pourquoi l'utilisation de chaînes de format incorrectes dans `printf` a-t-elle un comportement non défini ?

Pourquoi l'utilisation de chaînes de format incorrectes dans `printf` a-t-elle un comportement non défini ?

Susan Sarandon
Libérer: 2024-11-17 22:03:02
original
588 Les gens l'ont consulté

Why is Using Incorrect Format Strings in `printf` Undefined Behavior?

Comportement inattendu dans printf avec des chaînes de format incorrectes

En programmation C, la fonction printf est un outil puissant pour imprimer une sortie formatée. Cependant, une utilisation incorrecte des chaînes de format peut entraîner des conséquences imprévisibles.

Considérez les lignes de code suivantes :

#include <iostream>
#include <cstdio>

int main() {
    std::cout << sizeof(int) << std::endl
              << sizeof(long) << std::endl;

    long a = 10;
    long b = 20;
    std::printf("%d, %d\n", a, b);

    return 0;
}
Copier après la connexion

Bien que ce programme produise généralement le résultat attendu, son comportement est en réalité indéfini lorsque appelé avec des chaînes de format incorrectes. Comme l'indique la norme C99 (7.19.6.1:9) :

Si une spécification de conversion n'est pas valide, le comportement n'est pas défini. Si un argument n'est pas du type correct pour la spécification de conversion correspondante, le comportement n'est pas défini.

Dans cet exemple, la chaîne de format "%d" attend des arguments entiers, tandis que les arguments fournis sont de type long. Cette inadéquation peut entraîner des résultats erronés, des plantages ou d'autres comportements imprévisibles.

Il est important de noter qu'un comportement non défini ne se limite pas aux cas où les arguments sont incorrects. Même si les arguments sont du type correct, l’utilisation d’une chaîne de format non valide peut toujours avoir des conséquences néfastes. Par exemple, utiliser "%s" (chaîne) pour imprimer un entier pourrait conduire à un comportement indéfini.

Par conséquent, il est crucial de vérifier soigneusement les chaînes de format avant d'utiliser printf et de s'assurer qu'elles correspondent aux types des arguments en cours. passé. Ne pas le faire peut entraîner un comportement inattendu et peu fiable du programme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal