Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-10-31 04:22:31337parcourir

 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>
  • 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'));
  • 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);

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));
  • 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*));

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>
  • 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>

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:
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