1
Posté le 30/12/2009 à 00:39 Membre depuis le 18/06/2001, -27227 message
yop,

Sous AMS 2.09, le dernier PreOS, un programme compilé avec la denière version de GCC4TI :
build :

tigcc -v -O2 -Wall -W --cut-ranges --optimize-code --remove-unused --optimize-relocs --merge-constants --reorder-section \
  truc.c   \
  machin.c   \
  -o bidule 2>> log

truc.c

#include  "kernel.h"
#include  "funcs.h"

void main(void)
{
  clrscr();
  ESI ArgPtr = top_estack;

  if (*ArgPtr == END_TAG)
  {
    CommandHelp();
    return;
  }
}

machin.c

#include "kernel.h"
#include "funcs.h"
void CommandHelp(void)
{
  printf("abc");
  ngetchx();
}


Dans ce cas là, tout marche bien.
Maintenant, si je rajoute "const char* HelpText" dans machin.c, j'ai un Corrupted program au runtime. Le binaire fait 4 octets de plus, et je ne sais pas ce qui merde.

Mon but étant de passer évidemment HelpText à printf et non "abc", c'est mal emmanché pour le moment. sad

Une idée ?
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
2
Posté le 30/12/2009 à 00:42 Membre depuis le 30/06/2001, 36731 messages
Tu peux mettre la source que ça donne après la modification qui casse tout ?
avatar Que cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
3
Posté le 30/12/2009 à 00:49 Membre depuis le 18/06/2001, -27227 message
machin.c 
 
#include "kernel.h" 
#include "funcs.h" 

+ const char* HelpText;

void CommandHelp(void) 
{ 
  printf("abc"); 
  ngetchx(); 
}

Sans le '+' évidemment.
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
4
Posté le 30/12/2009 à 00:52 Membre depuis le 30/06/2001, 36731 messages
C'est marrant ça grin
avatar Que cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
5
Posté le 30/12/2009 à 01:58 Membre depuis le 16/06/2001, 67443 messages
bon je sais pas si c'est ça mais si tu dis "const char *" c'est qu'on attend que tu mettes des données.

ok ça devrait pas faire planter mais bon.

essaye ça:

machin.c 
 
#include "kernel.h" 
#include "funcs.h" 

const char* HelpText="turlututu";

void CommandHelp(void) 
{ 
  printf("%s",HelpText); 
  ngetchx(); 
}

Sans printf(UneVariable) évidemment oui
6
Posté le 30/12/2009 à 02:04 Membre depuis le 18/06/2001, -27227 message
Merci, je vais essayer.

Tiens, question : pourquoi mets-tu :

printf("%s",HelpText)
et non
printf(HelpText) ?

printf attend un const char*, et HelpText en est un.

Par contre, quand je regarde le code assembleur, si j'écris
printf(HelpText);
il me sort ça :
move.l HelpText,(sp)

Ce qui est évidemment faux, il faut pousser l'adresse et non le contenu de la chaine.

Je mets donc un
printf(&HelpText);
Là ok, il me sort ça :
pea HelpText

Et c'est bien ce que j'attends !

Par contre, il me balance un warning : "Passing argument 1 of printf from incompatible pointer type". Ca peut se comprendre, HelpText est du bon type et donc pas &HelpText, mais c'est pourtant avec ça que le code généré est bon !

Là je coince, je demande une explication hypno
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
7
Posté le 30/12/2009 à 02:11 Membre depuis le 27/04/2006, 55981 messages
Folco (./6) :
printf("%s",HelpText)
et non printf(HelpText) ?
Exercice : que se passe-t-il dans le second cas si la chaîne HelpTest contient un backslash (ou pire, un signe pourcentage) ? smile
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
8
Posté le 30/12/2009 à 02:31 Membre depuis le 06/02/2003, 7215 messages
En effet printf(HelpText) représente une belle faille de sécurité. ^^
avatar la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.
9
Posté le 30/12/2009 à 02:34 Membre depuis le 18/06/2001, -27227 message
Sauf si HelpText est codé par moi en dur tongue
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
10
Posté le 30/12/2009 à 02:59 Membre depuis le 16/06/2001, 67443 messages
ça change rien, suffit de changer l'adresse de ta variable embarrassed

et dans ce cas tu l'écris directement en plusembarrassed
11
Posté le 30/12/2009 à 03:11 Membre depuis le 18/06/2001, -27227 message
Et ça change rien à mon problème de type et de warnings du ./6 que je comprends toujours pas sad
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
12
Posté le 30/12/2009 à 03:15 Edité par squalyl le 30/12/2009 à 03:20 Membre depuis le 16/06/2001, 67443 messages
bah si, printf attend const char* en premier arg, si tu lui files &(Hello) et que hello est un const char*, le résultat est un const char ** donc warning mauvais type.

pour faire mieux faudrait écrire printf( (const char*)(&Hello) ) ce qui forcerait le type et éviterait le ouarningue, mais explique pas pkoi l'asm est mauvais.


mais en fait ça c'est juste:

printf(HelpText);
il me sort ça :
move.l HelpText,(sp)


oublie pas que HelpText est une variable pointeur, donc le contenu de la mémoire à l'adresse HelpText contient l'adresse de la chaine trioui

quand tu fais de l'asm et que t'écris:

Helptext: .ascii "prout"

en fait c'est comme si tu déclarais un tableau de char:

const char Helptext[]="prout";

et quand tu fais lea Helptext, ça fait &(HelpText[0]), parce que lea <ea> est equivalent à &(<ea>)

et que si tu fais move Helptext,%d0, %d0 va contenir *(HelpText)


enfin bref toujours la même magouille et le pb des variables C et des symboles ASM qui correspondent à des adresses en asm, mais a des vraies variables en C, parce que justement le move direct,ea fait un dereferencement de direct.
13
Posté le 30/12/2009 à 03:19 Membre depuis le 18/06/2001, -27227 message
han, HelpText doit donc être un const char** alors ?
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
14
Posté le 30/12/2009 à 03:20 Edité par squalyl le 30/12/2009 à 03:29 Membre depuis le 16/06/2001, 67443 messages
non non relis moi j'ai crossédité.

la magouille c'est que toutes les variables en C sont en RAM, donc elles sont toutes en accès move direct, ... ou move ..., direct

int a = 3;
int *b = &a;

ça fera en asm
a: .long 3
b: .long a

l'opération int a = 3 ça fait pour un assembleux 3 ->mem[a] (move a,3) et pas 3->a
par contre int *a = 3, ça fait pour un assembleux 3->a, ce qui est pas possible "tel quel" en asm car a est un label/symbole, donc pas changeable
et int b=*a ça fait mem[mem[a]]->mem[b ] (move a, (b) )

du coup on a été obligé d'inventer les variables pointeurs qui puissent contenir l'adresse d'autres variables
15
Posté le 30/12/2009 à 03:28 Membre depuis le 18/06/2001, -27227 message
Ouep, c'est bien beau tout ça, tu as raison c'est chiant.

Mai j'ai toujours pas trouvé la solution académique pour virer ces warnings grin
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
16
Posté le 30/12/2009 à 03:30 Membre depuis le 06/02/2003, 7215 messages
Tu supprimes le flag -W. ^^
avatar la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.
17
Posté le 30/12/2009 à 03:31 Membre depuis le 16/06/2001, 67443 messages
mais il était bon ton code. T'as essayé de l'exécuter? ^^

char *plop = "pwet";
void func() {
  printf("%s",plop);
}

void foobarbaz() {
  printf(plop); // sale mais bon on s'en accomodera
}


geo²: c'est cela, oui trioui
18
Posté le 30/12/2009 à 03:35 Membre depuis le 06/02/2003, 7215 messages
En effet le
printf("%s", plop) est la meilleure solution mais un
printf((const char*)plop); fonctionne tout aussi bien (malgré que cela soit moins propre).
avatar la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.
19
Posté le 30/12/2009 à 03:37 Membre depuis le 16/06/2001, 67443 messages
c'est pas le pb.

Folco: regarde bien ce qui est généré par tigcc
#include <stdio.h>

char *plop = "pwet";

.LC0:
	.ascii "pwet\0"
	.even
plop:
	.long	.LC0
.LC1:
	.ascii "%s\0"
	.text
	.even
	.globl	boo

void boo() {
	printf("%s",plop);
}

boo:
	link.w %fp,#0
	move.l plop,%d0
	move.l %d0,-(%sp)
	pea .LC1
	jbsr printf
	addq.l #8,%sp
	unlk %fp
	rts
	.even
	.globl	far

void far() {
	printf(plop);
}

far:
	link.w %fp,#0
	move.l plop,%d0
	move.l %d0,-(%sp)
	jbsr printf
	addq.l #4,%sp
	unlk %fp
	rts


op: .long .LC0
je fais un zoom:.LC0:
	.ascii "pwet\0"
	.even
pl

toi tu as l'habitude de faire pea .LC0
mais regarde mieux: plop contient l'ADRESSE de .LC0
Du coup il fait pas faire pea plop, mais bien move plop, %d0

c'est cuefdé! grin

PS: on remarque que comme on l'a explicitement demandé, le compilo pisse une variable supplémentaire "plop" qui contient l'adresse de .LC0
Et tu remarques que le "%s" est une valeur "anonyme en C", et là il fait direct pea .LC1 puisqu'il n'a pas besoin de son adresse!

PPS: pareil avec -O3
	.globl	far
far:
	move.l plop,-(%sp)
	jbsr printf
	addq.l #4,%sp
	rts
	.section	.rodata.__unalignedstr,"dmu"
.LC0:
	.ascii "%s\0"
	.text
	.even
	.globl	boo
boo:
	move.l plop,-(%sp)
	pea .LC0
	jbsr printf
	addq.l #8,%sp
	rts
	.globl	plop
	.section	.rodata.__unalignedstr,"dmu"
.LC1:
	.ascii "pwet\0"
	.text
	.even
plop:
	.long	.LC1
20
Posté le 30/12/2009 à 03:43 Membre depuis le 18/06/2001, -27227 message
Ah ok, c'est cool merci bien.

Pas contre, j'avais auto-zoomé sur ça moi :
	move.l plop,%d0 
	move.l %d0,-(%sp) 

trifus
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
21
Posté le 30/12/2009 à 03:43 Membre depuis le 16/06/2001, 67443 messages
compilé sans optim, et cross posté la version -O3 ^^
22
Posté le 30/12/2009 à 03:49 Membre depuis le 18/06/2001, -27227 message
Oué bon, ça génère toujours pas ça chez moi :
const char InvalidCall[] = "Invalid call"
const char* InvalidCall;
	if (ArgCount == 2)
	{
		printf(InvalidCall);
		ngetchx();
		return;
	}

	cmp.w #2,%d0
	jbne .L10
	move.l InvalidCall,-(%sp)
.L11:
	jbsr printf
	jsr _ROM_CALL_51:l

	.globl	InvalidCall
	.section	.rodata.InvalidCall,"d"
InvalidCall:
	.ascii "Invalid call.\0"
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
23
Posté le 30/12/2009 à 07:58 Membre depuis le 16/06/2001, 67443 messages
c'est bien pour ça que j'ai écrit

const char * InvalidCall = "invalid call";

et pas

const char InvalidCall[] = "truc";
24
Posté le 30/12/2009 à 10:00 Membre depuis le 18/06/2001, -27227 message
J'ai changé, c'était écrit const char* avant. Mais je me décourage pas, je réessaye, parce que j'aime me prendre des beignes dans la gueule triouitrifouet

edit -> c'est bien ça, j'ai toujours de l'assembleur invalide à la sortie trioui
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
25
Posté le 30/12/2009 à 10:47 Membre depuis le 16/06/2001, 67443 messages
mais t'as essayé de l'exécuter ou pas trifus

d'après moi il est valide cet asm, j'ai au grand jamais eu de problèmes avec print sur ti68k!!
26
Posté le 30/12/2009 à 10:53 Membre depuis le 18/06/2001, -27227 message
Pas essayé, non. grin Je vois pas pourquoi ça marcherait si l'assembleur est invalide, à moins que j'ai pas vu le patcheur à chaud fourni par GCC4TI tongue
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
27
Posté le 30/12/2009 à 10:54 Membre depuis le 18/06/2001, -27227 message
Ben quand j'exécute ça, j'ai un "Corrupted program", pourtant mon code a bien changé depuis hier soir. smile
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
28
Posté le 30/12/2009 à 11:18 Membre depuis le 18/06/2001, -27227 message
Bon, ben j'ai casté avec un (const char*), j'ai toujours un "corrupted program". J'ai plus qu'à me retrousser les manches direction le code de PedroM pour voir ce qui peut provoquer une telle erreur sad
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
29
Posté le 30/12/2009 à 11:48 Membre depuis le 18/06/2001, -27227 message
Bon, ras le fion, un e-bisou à qui m'aidera à trouver la solution. Je continue à coder, mais c'est chiant de pas comprendre, j'aime pas ça mad
tromb Fichier joint : asti68k_c.7z
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
30
Posté le 30/12/2009 à 12:24 Membre depuis le 16/06/2001, 67443 messages
essaye sur ams ou vti si possible.