je le code suivant:est d'attribuer un nombre trop grand pour être représenté dans un champ de bits comportement non défini
#include <stdio.h>
#include <stdint.h>
enum nums {
ONE,
TWO,
TWENTY = 20
};
struct field {
uint32_t something : 4;
uint32_t rest : 28;
};
int main(void) {
struct field f;
f.something = TWENTY;
return 0;
}
Sur un powerpc 8241 en cours d'exécution RTEMS 4.9.1, compilé avec GCC 3.4.5 MinGW (I connaître son vieux) ce code provoquera un segfault. La raison que j'ai déterminée est que nous mettons un nombre à grand pour être représenté par un champ de bit au champ de bits en question. Puisque nous avons 4 bits, il ne devrait pouvoir représenter que 0 -> 15, et en effet, lorsque nous le configurons avec ces nombres, cela fonctionne très bien. Tout ce qui est au dessus et ça plante. Je suis incapable de reproduire ce comportement here, donc ma question est:
Est-ce un comportement non défini ? Si oui, y a-t-il une référence dans une norme c qui le couvre?
Ou est-ce plus simplement un bogue à cause de notre très ancien compilateur?
Il serait intéressant de compiler avec l'indicateur '-S' pour voir le langage assembleur généré. – lurker
@lurker qui peut probablement être arrangé ... –
Cette question a déjà une réponse ici: http://stackoverflow.com/questions/2151305/gcc-warning-large-integer-implicitly-truncated-to-unsigned-type#2151321 . Si vous ajoutez l'indicateur '-Werror' à GCC, alors la sortie de expectet doit être:' error: grand entier implicitement tronqué au type non signé [-Werror = overflow] f.something = TWENTY; ' – BufferOverflow