Stack overflow

Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005 - 9 déc. 2003 à 14:49
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 9 déc. 2003 à 17:40
Bonjour,
Mon programme provoque une exception stack overflow, et je ne vois vraiment pas comment réduire l'importance des objets utilisés. J'ai pu isoler la portion de code à l'origine de l'erreur, il s'agit justement du remplissage d'une chaine de caractères de 2000 octets, à l'aide de strcpy et strcat.
Si qqun sait comment alléger la mémoire dans ces cas la... je l'en remercie d'avance.

Vaughn018, Siaïeï handler...

11 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 déc. 2003 à 15:09
vérifie que la chaine que tu copies se termine bien par un '\0' terminal; ce ne sont 2000 petits octets qui vont provoquer une telle exception
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 déc. 2003 à 15:19
2000 octets pourraient provoquer un stack overflow selon ou en est ta stack. strcpy et strcat n'en provoquent jamais si comme le dit vecchio56 ta chaine finit bien par un 0.
BruNews, ciao...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
9 déc. 2003 à 15:27
Oui ma stack doit pas etre vide déjà d'une part, et puis meme en rajoutant les '\0' manquants, toujours rien. J'ai vraiment l'impression de soulager la pile en enlevant des portions par ci par la, auquel cas je pense que j'arrive vraiment à saturation... ce qui me paraît bizarre (la mémoire du logiciel dans lequel s'intègre mon module est peut etre limitante).

Vaughn018, Siaïeï handler...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
9 déc. 2003 à 15:31
Je réecris pour etre plus clair concernant une des solutions : ya-t-il un moyen de modifier la mémoire allouée par ce logiciel?
Merci bcp de votre aide.

Vaughn018, Siaïeï handler...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 déc. 2003 à 15:39
alors la je ne comprends pas ta question.
BruNews, ciao...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
9 déc. 2003 à 15:45
Le programme est un module externe pour un logiciel déjà existant. Je veux dire par la que ce logiciel m'impose peut etre ses restrictions de mémoire? ou alors je me trompe et la pile a rien a voir la dedans...

Vaughn018, Siaïeï handler...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 déc. 2003 à 15:51
Si tu ecris une dll tu possedes ta propre stack sinon tu utilises celle du prog. Par contre l'espace memoire est toujours celui du prog, donc +- 2 Go accessibles quand tout va bien.
Faut verifier la valeur de ESP en entree de prog.
Valeur en entree dans ton module.
Valeur en entree dans ta fonction critique.
Tu verras ainsi combien est consomme sur la stack.
BruNews, ciao...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
9 déc. 2003 à 16:05
peux tu stp me décrire comment récupérer Esp qui se trouve apparemment dans une structure contexte dans winnt.h?
merci

Vaughn018, Siaïeï handler...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 déc. 2003 à 16:12
void DireESP(HWND howner)
{
DWORD dwEsp;
char szlocal[12];
__asm mov dwEsp, esp
ultoa(dwEsp, szlocal, 10);
MessageBox(howner, szlocal, "ESP", 0);
}

Appelle cela a differents endroits et tu verras les valeurs prises.
BruNews, ciao...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
9 déc. 2003 à 16:21
Ok, merci pour ton aide et ta disponibilité! :)
Vaughn018, Siaïeï handler...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 déc. 2003 à 17:40
La meme en ASM complet:
__declspec(naked) void __stdcall DireEsp(HWND howner)
{
__asm {
lea eax, [esp-28]
mov edx, esp
mov dword ptr[eax+24], 505345h
lea ecx, [eax+12]
mov esp, eax
mov dword ptr[eax+8], 10
mov dword ptr[eax+4], ecx
mov dword ptr[eax], edx
call _ultoa ; no ret 12
lea eax, [esp-4]
lea ecx, [eax+28]
mov esp, eax
mov edx, [eax+36]
mov dword ptr[eax+12], 0
mov dword ptr[eax+8], ecx
mov dword ptr[eax], edx
lea eax, [eax+16]
mov [esp+4], eax
call dword ptr MessageBox
add esp, 16
ret 4
}
}

BruNews, ciao...
0
Rejoignez-nous