Je veux sécuriser une macro qui initialise une variable, représentant un entier signé, dont la taille (en octets) est connue. Elle s'invoque de la manière suivante :
Code : Tout sélectionner
#DEFINE CMPT_TailleVar .4
CMPT_InitS2 test1, <valeur>
La valeur 4 est pour l'exemple.
Je voulais que l'assembleur sorte en erreur si l'appelant entrait une valeur supérieure à 2147483647 (0x7fffffff) qui est le plus grand entier représentable sur 4 octets.
Pour ce faire j'écris le code suivant :
Code : Tout sélectionner
; calcule le plus grand entier représentable sur
; CMPT_TailleVar octets
VV set .127
c set CMPT_TailleVar-1
while c != 0
VV set (VV<<.8)+ .255
c set c-1
endw
if X > VV
messg " "
error "paramètre trop grand"
messg " "
#UNDEFINE CMPT_TailleVar
exitm
endif
Si je donne à <valeur> cette valeur, tout se passe bien.
Mais si je donne la valeur 2147483648, la variable test1 est initialisée à 0x800000 !
La traduction en hexa du nombre donné est correcte (en unsigned) mais dans le test X>VV, MPASM semble gérer des signés et donc bien sûr, le test n'est pas vérifié.
Remarquons que ces constantes numériques sont gérées comme des entiers signés de 32 bits mais que MPASM ne sourcille pas si on lui donne une constante de 36 bits 0x800000001 par exemple, une erreur de frappe étant vite venue avec tous ces 0. Il se contente de garder les 8 chiffres de bas poids, en silence . Dans le cas qui nous préoccupe, il ne serait pas difficile à MPASM de voir si le nombre écrit est ou non précédé d'un signe "-" et donc, s'il ne l'est pas et que sa traduction est négative, c'est qu'il y a problème
Conséquence, je ne sais pas sécuriser cette macro. Si quelqu'un a une idée, je suis preneur.