1

yop,


Voici ce bout de code. Il crée tout simplement un liste de 256 éléments, chacun ayant la valeur de son rang. Une deuxième boucle permet de tester que SkipSpaces n'avance que quand on rencontre SPACE ou HTAB. // // Test 1: cursor musn't advance if next char is not SPACE or HTAB // { unsigned char* p1; unsigned char* p2; unsigned short i; unsigned char chars [256]; for (i = 0; i < 256; i ++) chars [i] = i; for (i = 0; i < 256; i ++) { p1 = p2 = &chars [i]; p1 = pdtlib__SkipSpaces (p2); if ((i == 0x09) || (i == 0x20)) { if (p1 != p2 + 1) FatalError (1); } else { if (p1 != p2) FatalError (2); } } PrintDot (); }
Problèmes :

1. Si je remplace le unsigned short i par un unsigned char i, j'obtiens un programme de 307 octets au lieu de ~700, qui me pond un bra -2 à l'entrée de la fonction, puis une adress error l'instruction d'après (un move.l -(a0),-(a6) qui ne rime à rien ici.

2. De plus, le programme est capable de se lancer sans la présende de la lib dynamique pdtlib.

Avec un unsigned short i, tout fonctionne comme attendu.

Qu'est-ce qui peut provoquer ce comportement pour le moins étrange à votre avis ?

2

Rôh Folco, tu me déçois tongue

Si i est un char (donc 8 bits), i < 256 est toujours vrai par définition, donc ton premier for est une boucle infinie et le reste du programme n'est jamais exécuté. Donc le compilo peut zapper tout le reste.

Par contre ce n'est pas normal que tu obtiennes une adress error.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3

Ah oui, j'ai oublié de dire. J'ai écrit < 256 parce que maintenant c'est un short, et que je trouve ça plus parlant qu'un <= 255. Mais le résultat était le même avec la seconde écriture (en unsigned, encore une fois.

Le problème reste donc entier, celui de l'adress error en particulier. La lib (non-)manquante doit donc venir du fait que la boucle est tout simplement pas compilée, mais pour quelle raison ??


(Zerosquare -> tkt va, je sais qu'un char tient sur 8 bits et est donc < 256 en unsigned grin)


Tant qu'à faire, je reposte le code qui déconne dans sa version originale : // // Test 1: cursor musn't advance if next char is not SPACE or HTAB // { unsigned char* p1; unsigned char* p2; unsigned char i; unsigned char chars [256]; for (i = 0; i <= 255; i ++) chars [i] = i; for (i = 0; i <= 255; i ++) { p1 = p2 = &chars [i]; p1 = pdtlib__SkipSpaces (p2); if ((i == 0x09) || (i == 0x20)) { if (p1 != p2 + 1) FatalError (1); } else { if (p1 != p2) FatalError (2); } } PrintDot (); }

4

Ben écrire (i <= 255) ou (i < 256) c'est pareil, hein : c'est toujours vrai, donc t'as créé une boucle infinie tongue

De plus c'est une boucle infinie sans effet de bord (tes variables ne sont pas volatiles) : le compilo détecte que t'as une boucle infinie qui ne fait qu'écrire en mémoire mais qui ne lit jamais, il te la remplace par une boucle infinie vide, qui a un effet équivalent. Et comme la première boucle est infinie, la deuxième n'est jamais exécutée, donc la dépendance dégage à l'autre lib dégage vu qu'il n'y a plus aucun appel d'une fonction de cette lib.

error, je pense que c'est un bug du compilo. Mais pour le reste, truc: bra trucPour l'address est un résultat valide pour le source que tu fournis ^^
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

5

Merde xD Trop con ^^ C'est ça d'être dans l'optique d'un dbra, qui forcément finit, là c'est sûr que ça risque pas de changer quelque chose tritop

Bon, reste juste le problème de l'address error quoi. Pas grave en somme. Merci. J'espère que ma connerie ne sera pas inscrite à mon casier judiciaire, parce que là, c'est presque de la mise en danger de la vie d'autrui tsss

6

Allez, tu nous diras 2 ou 3 chapitres de K&R et ça ira, mon fils embarrassed
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

7

Oui, monsieur l'abbé C.

8

grin
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

9

L'instruction après le 0: bra 0b n'est soit pas du code, soit le code de la prochaine fonction (Le compilateur sait qu'il est inutile de mettre un rts à cet endroit.), donc c'est normal que si tu sautes là-dedans, ça ne marche pas. En l'occurrence, %a0 et %a6 n'ont probablement pas été initialisés correctement, donc si au moins une de ces adresses est impaire, Address Error.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

10

a0 était impair, pas a6.

D'ailleur a6 me fait penser que je compile avec ça :
tigcc	-std=c99 -Wall -W -v -O2 -ffunction-sections -fdata-sections \
		-mno-bss --remove-unused --optimize-relocs \
		--optimize-code --cut-ranges --reorder-sections 

Faut que je lui dise aussi de dégager le link-unlink qu'il s'amuse toujours à fourrer ici et là.

11

J'avais un doute pour l'effet de bra -2 (j'ai pas l'habitude de mettre des offsets en dur comme ça tongue). C'est bien une boucle infinie ? Si tel est le cas (et que tu as donc eu l'Address Error en sautant l'instruction manuellement), c'est "normal" à cause de ce que décrit Kevin.

(reste que plus de 300 octets, c'est pas très optimal pour une boucle infinie embarrassed)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

12

-fomit-frame-pointer est déjà par défaut dans -O2 (et -Os) dans TIGCC. Parfois, GCC met quand-même un frame pointer parce que c'est plus efficace (ou que GCC croit que c'est plus efficace grin) ou parce que la fonction utilise des fonctionnalités que GCC ne sait pas compiler sans frame pointer.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13

Zerosquare (./11) :
C'est bien une boucle infinie ?
Il ne me semble pas, c'est plutôt un bra.s 0 ou un truc du genre.
Pas le souvenir qu'il faille mettre un offset.

14

Kevin Kofler (./12) :
la fonction utilise des fonctionnalités que GCC ne sait pas compiler sans frame pointer.

Ca doit être ce genre de truc qui se passe alors, ok.ko<a href='javascript:;' onclick='getPost(event,157940,12)'>./13</a>

15

Folco (./14) :
ok.ko
#pointpenpen#

16

Pen^2 (./13) :
Zerosquare (./11) :
C'est bien une boucle infinie ?
Il ne me semble pas, c'est plutôt un bra.s 0 ou un truc du genre.
Pas le souvenir qu'il faille mettre un offset.

Si, parce que PC pointe sur l'instruction suivant celle en cours d'exécution.

Amha c'est parce que quand l'instruction est exécutée, c'est qu'elle est décodée et que sa taille est donc connue. Et si l'instruction doit utiliser pc ou le pusher (bsr/jsr), il n'y a qu'à lire le registre, au lieu de calculer ce qu'il faut pousser. Une boucle infinie de base est donc un bra.s -2 (aliasée en bra . sous gas, ou bra * sous A68k).

17

Pen^2 (./15) :
Folco (./14) :
ok.ko
#pointpenpen#

trigni

18

Folco (./16) :
bra * sous A68k
ah oué, voilà !

19

Folco : OK, donc c'est pareil que sur x86.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

20

et que sur ARM, et probablement beaucoup d'autres grin

21

(même PIC ?)
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

22