Je ce morceau de code dont le but est de déterminer si le paquet reçu est valide ou non:architecture de code agnostique
size_t offset_to_a, offset_to_b;
u_int32_t file_name_length;
u_int32_t packet_length;
if ((offset_to_a + offset_to_b + file_name_length) > packet_length) {
// Invalid packet
}
size_t
est u_int64_t
être parce que le cpu est un processeur 64 bits.
Maintenant, lorsque file_name_length
a une valeur 0xFFFFFFFF
(qui n'est pas valide), le paquet est considéré comme invalide.
Mais si size_t
devient u_int32_t
en raison de l'architecture sous-jacente, puis pour la même valeur de file_name_length
, la condition échoue parce que la valeur enveloppait autour, et le paquet est réputé valide.
Comment rendre cette condition suffisamment générique pour fonctionner sur les deux architectures 32/64 bits?
Merci!
La valeur 0xFFFFFFFF est l'entier non signé maximal de 32 bits - et ne provoque pas de saut de valeur de 64 bits. En tant que tel, il fonctionnerait de manière identique si 'size_t' est de 32 bits. Peut-être que vous avez mal tapé '0xFFFFFFFFFFFFFFFF' pour la valeur de 64 bits. Avez-vous considéré les types à taille fixe de '' et ''? Ceux-ci sont souvent utilisés dans le code moderne lorsque les tailles sont fixes. (Il existe plusieurs alternatives incompatibles.) Techniquement, elles sont facultatives - certaines plateformes pourraient ne pas supporter 'uint16_t' et dans ce cas, il n'y aurait pas de type' uint16_t'. Cependant, il y a toujours des types 'uint_least16_t'. –
"* Maintenant, quand file_name_length a une valeur 0xFFFFFFFF (qui n'est pas valide), *" Alors pourquoi ne pas simplement faire un simple "if (file_name_length> = 0xffffffff) {// paquet invalide}'? – alk
@alk: Votre suggestion est valide et nous l'avons incorporé. Je vous remercie! – Maddy