Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

MPASM : constantes numériques, méfiance
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » lun. 30 mars 2020 17:41

Bonjour à tous,
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 :furieux: . 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 :furieux:
Conséquence, je ne sais pas sécuriser cette macro. Si quelqu'un a une idée, je suis preneur.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

MPASM : constantes numériques, méfiance
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » lun. 30 mars 2020 19:07

bonsoir JJE,


je ne vois pas comment tu peux faire , puisque la notion de Signé ou Non signé est arbitrairement
dépendant du choix du programmeur .

en C c'est plus clair puisque la definition de la variable specifie si le bit de poids fort est considéré comme le signe ou pas
signed long k; // - 2147483648 à + 2147483647
unsigned long k; // 0 à 4294967295
et c'est bien le programmeur qui en decide ..
pas le compilateur
Aide toi, le ciel ou FantasPic t'aidera

MPASM : constantes numériques, méfiance
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#3 Message par satinas » lun. 30 mars 2020 19:30

bonsoir,
jusqu'à 32 bits tu peux faire,
if (X & 0x80000000) || (X > VV)
Au dessus de 32 bits, l'assembleur tronque en loucedé, et je vois pas.
Ah si, quand on fait de l'assembleur, on fait jamais de faute de frappe :)

MPASM : constantes numériques, méfiance
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#4 Message par JJE » mar. 31 mars 2020 06:42

Bonjour à tous les deux, merci de vos réponses rapides.
Je les ai bien lues hier soir, mais c'était l'heure de l'apéro :-)
paulfjujo a écrit :Source du message et c'est bien le programmeur qui en decide ..

j'en suis bien d'accord avec toi, et c'est pareil en assembleur sauf que dans un cas le programmeur peut informer le compilateur, dans l'autre pas.
satinas a écrit :Source du message if (X & 0x80000000) || (X > VV)

Le problème est que je veux pouvoir utiliser des compteurs signés, d'usage moins fréquent que les non signés mais ... . Ce test, pour des variables signées va déclarer "trop grandes toutes les valeurs négatives. :sifflotte:
Au final, je crois que le problème est entièrement dans les mains de MPASM qui considère toute constante numérique comme un entier signé 32 bits sans signaler les dépassements de capacité :furieux:
Sans réfléchir plus avant, ça pose probablement d'autre problèmes, il me semble que MPASM devrait accepter -0x80000000 et le prendre comme 0x80000000 et refuser 0x80000000 qui est plus grand que le plus grand entier représentable sur 32 bits
Je n'ai certainement pas lu toute la doc, mais je n'ai pas vu passer d'info sur l'interprétation de ces constantes numériques par MPASM. Ce n'est pas la première lacune de cette doc.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

MPASM : constantes numériques, méfiance
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#5 Message par satinas » mar. 31 mars 2020 09:05

Bonjour,
Comme tu l'as dit, l'assembleur tronque tout ce qui dépasse 32 bits, et il saisit les constantes négatives en 32 bits complément à 2. L'information du signe est donc perdue dès le depart. Pour les comparaisons il travaille arbitrairement en signé.
Il faudrait pouvoir faire soi-même une analyse syntaxique des constantes, ce qui ne paraît pas possible, à moins de faire un préprocesseur externe.

MPASM : constantes numériques, méfiance
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#6 Message par JJE » mar. 31 mars 2020 12:02

entièrement d'accord avec satinas, c'est dommage pour MPASM, surtout que c'est mal documenté et qu'il ne signale pas les erreurs.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 50 invités