3 votes

Comment corriger "cette condition a des branches identiques" dans GCC?

https://godbolt.org/z/YK5PPvz7d

#include 

struct file_format_a_header 
{
    int i;
};

struct file_format_b_header 
{
    int i;
};

int main()
{
    int type = 1;
    size_t len = 0;

    if (1 == type)
    {
        len = sizeof(struct file_format_a_header ); // sizeof file_format_a_header and file_format_b_header  is SAME but they are different structures
    }
    else
    {
        len = sizeof(struct file_format_b_header );
    }

    printf("len = %zu\n", len);
    return 0;
}

: Dans la fonction 'main':
:18:8: erreur: cette condition a des branches identiques [-Werror=duplicated-branches]
   18 |     if (1 == type)
      |        ^
cc1: tous les avertissements sont traités comme des erreurs
Génération d'ASM par le compilateur renvoyée : 1
: Dans la fonction 'main':
:18:8: erreur: cette condition a des branches identiques [-Werror=duplicated-branches]
   18 |     if (1 == type)
      |        ^
cc1: tous les avertissements sont traités comme des erreurs
Execution build par le compilateur renvoyée : 1

GCC switches:

-std=gnu11
-Wall
-Werror
-Wextra
-Wduplicated-branches

Question> Est-ce qu'il y a un moyen de corriger cet avertissement GCC ?

3voto

dbush Points 8590

Gcc génère probablement un avertissement ici car le résultat de l'opérateur sizeof est une constante de temps de compilation (à moins que son opérande ne soit un tableau de longueur variable).

Donc en effet, il voit ceci:

    if (1 == type)
    {
        len = 4;
    }
    else
    {
        len = 4;
    }

Cela se produit même si les deux structures en question ont des membres de nom différent, des types de membres différents ou un nombre de membres différent, tant que les tailles sont les mêmes.

Vous pouvez contourner ce problème en ajoutant pragma pour ignorer cet avertissement spécifique dans un scope particulier:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wduplicated-branches"
    if (1 == type)
    {
        len = sizeof(struct ABC);
    }
    else
    {
        len = sizeof(struct abc);
    }
#pragma GCC diagnostic pop

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