Est le uid_t type signé ou non signé?
Je sais que la norme ne dit rien sur la ce paramètre de uid_t
ou gid_t
.
Incohérence:
Page http://www.gnu.org/software/libc/manual/html_node/Reading-Persona.html dit:
Dans la Bibliothèque C de GNU, c'est un alias pour unsigned int.
Mais man setreuid
dit:
En fournissant une valeur de -1, soit le réel ou effectif de l'ID d'utilisateur force le système à quitter cet ID inchangé.
Questions:
-
Donc, est
uid_t
signé ou non signé dans la GNU Library? -
Comment puis-je fournir
-1
siuid_t
etgid_t
ne sont pas signés (-1
seront convertis en0xFFFFFFFF
)?
Pas la même question, mais le vôtre est répondu ici.
OriginalL'auteur user2431763 | 2014-01-26
Vous devez vous connecter pour publier un commentaire.
uid_t
est (après quelques typedefs/définit comme__U32_TYPE
qui est définie commeunsigned int
(qui est sur mon système Gentoo Linux).Cependant, juste parce que
-1
a un sens particulier, cela ne signifie pas que les Uid sont limités à l'un des numéros qui s'inscrivent dans un signéint
. Il signifie simplement que la valeur la plus élevée (c'est à dire(unsigned int)-1
) n'est pas valide UID. Le code de lasetreuid
utilise probablement l'inverse de la forme de la distribution ((signed int)ruid
) à comparer à-1
proprement bien qu'il accepte unuid_t
.uid_t
est un typedef de__uid_t
, qui est spécifique au système en raison de la non-standard.Correct, j'ai suivi la chaîne de typedefs/définit un peu plus.
Mais il pourrait être sur un système différent, et ont des typedefs et définit. Aussi, je suis trop paresseux pour trouver ce que le mien est 😛
OriginalL'auteur ThiefMaster
POSIX dit explicitement que
pid_t
est un nombre entier signé de type utilisé pour représenter les processus et les processus d'Id de groupe.Il est dit que
ino_t
est un entier non signé de type utilisé pour le fichier de numéros de série.Pour les deux
uid_t
etgid_t
, il est dit que le type est un type entier (pas de mention de signé ou non signé) utilisé pour l'Id utilisateur et ID de groupe.Ainsi, la norme stipule clairement que le type de
uid_t
etgid_t
peuvent être signés ou non en fonction de la plate-forme. Il est très raisonnable de supposer que cette indétermination se pose parce que les implémentations réelles utilisé à la fois les entiers signés et non signés, et la norme a été conçu pour ne pas invalider les implémentations existantes.int
juste être supposé être signée par défaut, sauf disposition contraire? De l'aidec99
etc11
, j'ai remarqué que le compilateur puisse se plaindre à chaque fois à l'aide de toute autre valeur (j'ai l'habitude d'essayer d'utiliser des lignes directrices strictes lors de la compilation).c'est "toujours" un type signé — sauf si vous êtes curage autour de avec la peu-champs, c'est toujours un type signé. Mais je ne suis pas sûr de comment ça se rapportant à la Q&A, donc je pense que je vais manquer de ce que vous êtes en train de demander.
En fonction de votre réponse et de la source, il est défini comme un nombre entier qui en C est un
int
. Il est par défaut à assumer unsigned
valeur. Vous pourriez déclarer explicitement commesigned int
ouunsigned int
comme superflu, comme cela peut être. Autres que les bits des champs, je ne peux pas penser à une autre instance dans laquelle il serait affecté. C'était plus une question explicite de la clarté; en plus d'être implicite. Siuid_t
est une valeur entière, qu'il serait logique que ce serait uneint
et pasunsigned int
sauftypedef
oudefine
défini/alias comme un autre "type" ou de la valeur.Lorsque j'utilise "strict" dans
gcc
et comparezint
àunsigned
, le compilateur généralement se plaint de la comparaison. Pour moi, cela implique en outre queuid_t
est de typeint
. Alors, quand il est défini dans l'en-tête commeuid_t
il est défini comme quelque chose. Je n'ai pas regardé la source, mais c'est ce que je suppose.Vous semblez méconnaître le terme de "un type entier'. Il y a une différence entre
int
, 'un entier signé de type', 'unsigned integer', et 'un entier de type". Alors queint
est un type entier, il est très loin d'être le seul type entier. Certains types d'entiers signés (etint
est l'un de ces type integer); certains types d'entiers non signés (maisint
n'est pas un de ces types d'entiers). Lorsque les normes d'utiliser le terme d'un entier de type', il signifie "certains type entier, qui pourrait être signé ou non signé", (mais il exclut explicitement les types à virgule flottante, ou des tableaux ou des structures ou des pointeurs, etc.).OriginalL'auteur Jonathan Leffler