Maison > développement back-end > C++ > Votre code C/C fait-il des hypothèses injustifiées ?

Votre code C/C fait-il des hypothèses injustifiées ?

Mary-Kate Olsen
Libérer: 2024-10-31 04:22:31
original
465 Les gens l'ont consulté

 Is Your C/C   Code Making Unwarranted Assumptions?

Démontrer des hypothèses injustifiées en C/C

Comment cet outil pédagogique peut-il être amélioré ?

Pour améliorer l'efficacité de cet outil, tenez compte des suggestions suivantes :

  • Incorporer la compilation conditionnelle : Utilisez la compilation conditionnelle pour tester des hypothèses basées sur des caractéristiques spécifiques de la plate-forme. Par exemple, si votre programme de test s'appuie sur des fonctionnalités spécifiques dépendant de la plate-forme, vous pouvez utiliser #ifdef ou #if __GNUC__ pour adapter les tests à différents environnements de compilateur.
  • Développez les cas de test : Incluez une plus grande variété de cas de test pour couvrir les hypothèses les plus courantes formulées par les programmeurs. Les exemples pourraient inclure :

    • "L'arithmétique à virgule flottante est associative"
    • "La taille d'un vide* est la même que la taille de la plus petite unité adressable"
    • "Le signe d'un nombre négatif est toujours -"
  • Automatisez les tests : Créez un script ou un outil automatisé pour exécuter les tests et collecter les résultats à travers différentes plateformes. Cela rationalisera le processus de test et facilitera la maintenance de la base de données des différences entre les plates-formes.

Quels tests seraient bons et à quoi devraient-ils ressembler ?

1. Hypothèses de caractère :

  • Test : Vérifiez que 'A' == 65 sur toutes les plateformes.
  • Code :

    <code class="c">EXPECT("00 we have ASCII",('A'==65));</code>
    Copier après la connexion
    Copier après la connexion
  • Test : Vérifiez si l'hypothèse selon laquelle 'a' < 'A' est valide.
  • Code :

    <code class="c">EXPECT("02 big letters come before small letters",('A'<'a'));
    Copier après la connexion
  • Test : Test si la taille du caractère est toujours de 8 bits.
  • Code :

    <code class="c">EXPECT("04 a char is 8 bits",CHAR_BIT==8);
    Copier après la connexion

2. Hypothèses sur les entiers :

  • Test : Examinez si l'hypothèse selon laquelle les entiers utilisent la représentation du complément à deux et s'enroulent est valide.
  • Code :

    <code class="c">EXPECT("06 integers are 2-complement and wrap around",(int_max+1)==(int_min));
    Copier après la connexion
  • Test : Vérifiez si l'affirmation selon laquelle la taille d'un int est la même que la taille d'un void* est vrai sur toutes les plateformes.
  • Code :

    <code class="c">EXPECT("05 int has the size of pointers",sizeof(int)==sizeof(void*));
    Copier après la connexion

3 . Hypothèses du pointeur :

  • Test : Vérifiez que sizeof(void*) est toujours supérieur ou égal à sizeof(void(*)()).
  • Code :

    <code class="c">EXPECT("10 void* can store function pointers",sizeof(void*)>=sizeof(void(*)()));</li>
    </ul>
    <p><strong>4. Hypothèses d'exécution :</strong></p>
    <ul>
    <li>
    <strong>Test :</strong> Testez si la pile croît toujours vers le bas.</li>
    <li>
    <p><strong>Code :</strong></p>
    <blockquote><pre class="brush:php;toolbar:false"><code class="c">EXPECT("12 the stack grows downwards",check_grow(5,0)<0);</code>
    Copier après la connexion
  • Test : Examinez l'hypothèse selon laquelle l'évaluation des expressions se fait toujours de gauche à droite.
  • Code :

    <code class="c">EXPECT("00 we have ASCII",('A'==65));</code>
    Copier après la connexion
    Copier après la connexion

Voulez-vous effectuer les tests sur les plateformes sur lesquelles vous pouvez mettre la main et publier les résultats ?

Nous encourager la participation de la communauté pour tester les hypothèses sur différentes plateformes. Veuillez partager vos résultats avec les informations suivantes :

  • Détails de la plateforme (système d'exploitation, version du compilateur, architecture)
  • Toutes différences observées par rapport aux résultats attendus
  • Pourquoi des différences peuvent survenir (par exemple, optimisations du compilateur, implémentation spécifique à la plate-forme)

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!

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