Posté le 19/07/2013 à 20:15 Membre depuis le 18/06/2001, -26077 message
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 ?
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 19/07/2013 à 20:22 Membre depuis le 27/04/2006, 60483 messages
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.
avatarZeroblog

« 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
Posté le 19/07/2013 à 20:31 Membre depuis le 18/06/2001, -26077 message
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 ();
	}
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 19/07/2013 à 20:50 Membre depuis le 27/04/2006, 60483 messages
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 ^^
avatarZeroblog

« 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
Posté le 19/07/2013 à 21:15 Membre depuis le 18/06/2001, -26077 message
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
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 19/07/2013 à 21:54 Membre depuis le 27/04/2006, 60483 messages
Allez, tu nous diras 2 ou 3 chapitres de K&R et ça ira, mon fils embarrassed
avatarZeroblog

« 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
Posté le 19/07/2013 à 22:15 Membre depuis le 18/06/2001, -26077 message
Oui, monsieur l'abbé C.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 19/07/2013 à 22:17 Membre depuis le 27/04/2006, 60483 messages
grin
avatarZeroblog

« 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
Posté le 19/07/2013 à 22:20 Membre depuis le 10/06/2001, 40275 messages
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.
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
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é
Posté le 19/07/2013 à 22:51Edité par Folco le 19/07/2013 à 23:57 Membre depuis le 18/06/2001, -26077 message
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à.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 19/07/2013 à 23:40 Membre depuis le 27/04/2006, 60483 messages
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)
avatarZeroblog

« 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
Posté le 19/07/2013 à 23:52 Membre depuis le 10/06/2001, 40275 messages
-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.
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
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é
Posté le 19/07/2013 à 23:58 Membre depuis le 10/06/2001, 45115 messages
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.
Posté le 20/07/2013 à 00:00 Membre depuis le 18/06/2001, -26077 message
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>
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 20/07/2013 à 00:00 Membre depuis le 10/06/2001, 45115 messages
Folco (./14) :
ok.ko
#pointpenpen#
Posté le 20/07/2013 à 00:02 Membre depuis le 18/06/2001, -26077 message
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).
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 20/07/2013 à 00:03 Membre depuis le 18/06/2001, -26077 message
Pen^2 (./15) :
Folco (./14) :
ok.ko
#pointpenpen#

trigni
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 20/07/2013 à 00:05 Membre depuis le 10/06/2001, 45115 messages
Folco (./16) :
bra * sous A68k
ah oué, voilà !
Posté le 20/07/2013 à 00:06 Membre depuis le 27/04/2006, 60483 messages
Folco : OK, donc c'est pareil que sur x86.
avatarZeroblog

« 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
Posté le 20/07/2013 à 12:10 Membre depuis le 16/06/2001, 69786 messages
et que sur ARM, et probablement beaucoup d'autres grin
Posté le 20/07/2013 à 15:28 Membre depuis le 11/11/2001, 116498 messages
(même PIC ?)
avatarWebmaster 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
Posté le 20/07/2013 à 16:58 Membre depuis le 16/06/2001, 69786 messages
ouep.