forumti.gif
@_ö
(21:07)  Bienvenue ! - Inscrivez vous pour poster ! -
Boo, Orion_, nitro, Damdam, 57 inconnu(s), 28 bot(s)

Login :  Mot de passe :      Se souvenir de moi.  Mot de passe perdu ?
/!\:: Cliquez ici pour vous inscrire et poster, créer des sujets ou des forums ! ::/!\
 « - 1/3 - Suivant » :: Pages
 Index » Forum Ti 89, Titanium / 92+ / Voyage 200 et TI-Nspire » Prog C TI (74r) » Test case qui renvoie "Corrupted program"
./Post de départ - Test case qui renvoie "Corrupted program"
18.06.2001 - 27286
00:39  Folco - Posté : 30-12-2009  M
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 ?
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./Publicité AdSense
./1
30.06.2001 - 35981
00:42  @Ximoon - Posté : 30-12-2009  M
Tu peux mettre la source que ça donne après la modification qui casse tout ?
avatarQue 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.
./2
18.06.2001 - 27286
00:49  Folco - Posté : 30-12-2009  M
machin.c 

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

+ const char* HelpText;

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

Sans le '+' évidemment.
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./3
30.06.2001 - 35981
00:52  @Ximoon - Posté : 30-12-2009  M
C'est marrant ça grin
avatarQue 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.
./4
16.06.2001 - 61438
01:58  squalyl - Posté : 30-12-2009  M
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#
./5
18.06.2001 - 27286
02:04  Folco - Posté : 30-12-2009  M
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#
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./6
27.04.2006 - 40026
02:11  @Zerosquare - Posté : 30-12-2009  @_ö
Folco (./5) :
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
« Sur Atari tout le hardware tu trouvera, le driver toi même tu le codera » — GT Turbo
./7
06.02.2003 - 7268
02:31  geogeo - Posté : 30-12-2009  M
En effet printf(HelpText) représente une belle faille de sécurité. ^^
avatarla 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.
./8
18.06.2001 - 27286
02:34  Folco - Posté : 30-12-2009  M
Sauf si HelpText est codé par moi en dur tongue
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./9
16.06.2001 - 61438
02:59  squalyl - Posté : 30-12-2009  M
ça change rien, suffit de changer l'adresse de ta variable embarrassed

et dans ce cas tu l'écris directement en plusembarrassed
./10
18.06.2001 - 27286
03:11  Folco - Posté : 30-12-2009  M
Et ça change rien à mon problème de type et de warnings du ./5 que je comprends toujours pas sad
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./11
16.06.2001 - 61438
03:15  squalyl - Posté : 30-12-2009  M
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.
Edité par squalyl le 30-12-2009 à 03:20:56.
./12
18.06.2001 - 27286
03:19  Folco - Posté : 30-12-2009  M
han, HelpText doit donc être un const char** alors ?
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./13
16.06.2001 - 61438
03:20  squalyl - Posté : 30-12-2009  M
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
Edité par squalyl le 30-12-2009 à 03:29:26.
./14
18.06.2001 - 27286
03:28  Folco - Posté : 30-12-2009  M
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
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./15
06.02.2003 - 7268
03:30  geogeo - Posté : 30-12-2009  M
Tu supprimes le flag -W. ^^
avatarla 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.
./16
16.06.2001 - 61438
03:31  squalyl - Posté : 30-12-2009  M
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#
./17
06.02.2003 - 7268
03:35  geogeo - Posté : 30-12-2009  M
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).
avatarla 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.
./18
16.06.2001 - 61438
03:37  squalyl - Posté : 30-12-2009  M
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


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

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
./19
18.06.2001 - 27286
03:43  Folco - Posté : 30-12-2009  M
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#
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./20
16.06.2001 - 61438
03:43  squalyl - Posté : 30-12-2009  M
compilé sans optim, et cross posté la version -O3 ^^
./21
18.06.2001 - 27286
03:49  Folco - Posté : 30-12-2009  M
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"
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./22
16.06.2001 - 61438
07:58  squalyl - Posté : 30-12-2009  M
c'est bien pour ça que j'ai écrit

const char * InvalidCall = "invalid call";

et pas

const char InvalidCall[] = "truc";
./23
18.06.2001 - 27286
10:00  Folco - Posté : 30-12-2009  M
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 #trioui##trifouet#

edit -> c'est bien ça, j'ai toujours de l'assembleur invalide à la sortie #trioui#
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./24
16.06.2001 - 61438
10:47  squalyl - Posté : 30-12-2009  M
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!!
./25
18.06.2001 - 27286
10:53  Folco - Posté : 30-12-2009  M
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
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./26
18.06.2001 - 27286
10:54  Folco - Posté : 30-12-2009  M
Ben quand j'exécute ça, j'ai un "Corrupted program", pourtant mon code a bien changé depuis hier soir. smile
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./27
18.06.2001 - 27286
11:18  Folco - Posté : 30-12-2009  M
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
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./28
18.06.2001 - 27286
11:48  Folco - Posté : 30-12-2009  M
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
avatarFolco'sandbox : 2014-11-26
<<< Kernel Extremist©®™ >>> WIP : r14 - 2014-12-02

- xdef directive now updates the cursor
- include directive remove its file from the fileslist when parsed
- added dc directive, binary size verification, relocation table handling
./29
16.06.2001 - 61438
12:24  squalyl - Posté : 30-12-2009  M
essaye sur ams ou vti si possible.
./Publicité AdSense
 « - 1/3 - Suivant » :: Pages
 Index » Forum Ti 89, Titanium / 92+ / Voyage 200 et TI-Nspire » Prog C TI (74r) » Test case qui renvoie "Corrupted program"

./Poster un nouveau message. - Ouvrir dans une nouvelle fenêtre
Login : Mot de passe :

url - image - media  
spoiler - pre - fixed
quote - box - hr
poll - code





Smileys
Smileys perso
Pièce jointe
     Flood control (?) :    
Les messages postés sont la propriété de leurs auteurs. Nous ne sommes pas responsables de leurs contenus.

» yN ©1624 - Aide / Charte / Crédits
53ms | Statistiques