[C][Windows] comportement etrange

comportement etrange [C][Windows] - C++ - Programmation

Marsh Posté le 29-10-2002 à 14:31:42    

Bon, j'ai un programme en C, sans trucs hors norme.
Je compile avec gcc et les options -Wall -pedantic, aucun warning, aucune erreur.
 
Sous linux, le programme marche.
Sous windows, en double cliquant sur le programme, il marche.
Sous windows, en lancant le programme via command.com, il plante avec un 'le programme Toto a provoqué une erreur dans le module TOTO.EXE blablabla'.
 
Y'a une explication rationnelle ?

Reply

Marsh Posté le 29-10-2002 à 14:31:42   

Reply

Marsh Posté le 29-10-2002 à 15:23:47    

lorill a écrit a écrit :

Bon, j'ai un programme en C, sans trucs hors norme.
Je compile avec gcc et les options -Wall -pedantic, aucun warning, aucune erreur.
 
Sous linux, le programme marche.
Sous windows, en double cliquant sur le programme, il marche.
Sous windows, en lancant le programme via command.com, il plante avec un 'le programme Toto a provoqué une erreur dans le module TOTO.EXE blablabla'.
 
Y'a une explication rationnelle ?




Kel windows un a noyau NT ou un noyau dos?precise stp

Reply

Marsh Posté le 29-10-2002 à 15:35:14    

J'ai le même symptôme avec des programmes écrits en C et aussi avec ceux en Perl
 
Sur une machine NT 2000, il arrive que ça plante si je lance le programme en mode commande Ms-Dos.
 
Ca n'arrive pas systématiquement mais ça arrive. Par contre, sur le même OS à la maison, jamais je n'ai le moindre problème avec un prog Perl, les progs C compilés, pratiquement tout le temps.


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 29-10-2002 à 15:54:38    

nicolasm a écrit a écrit :

 
Kel windows un a noyau NT ou un noyau dos?precise stp




aucun nt, je teste avec millenium.

Reply

Marsh Posté le 29-10-2002 à 16:28:24    

C'est intéressant comme probleme ca! Il fait quoi ton programme?

Reply

Marsh Posté le 29-10-2002 à 16:31:43    

Ace17 a écrit a écrit :

C'est intéressant comme probleme ca! Il fait quoi ton programme?




Rien d'extraordinaire, il initialise pas mal de structures, et ca plante relativement vite. Seul truc notable, je fais plein de malloc et pas de free (vu que je vais virer les mallocs dans pas longtemps) mais ca m'étonnerais que ca joue, vu que si j'avais mis des free ca aurait planté avant.
 
Edit: ca aide probablement pas, mais je vois pas comment détailler sans filer tout le source, vu que tout s'imbrique.


Message édité par lorill le 29-10-2002 à 16:36:11
Reply

Marsh Posté le 29-10-2002 à 16:35:45    

Non ca doit pas venir des mallocs, sauf peut etre si tu ne vérifies pas si ils ont tous réussi

Reply

Marsh Posté le 29-10-2002 à 16:45:38    

bon, en fait ca plante la dedans :

Code :
  1. LuObject * LuStringTable_get(LuStringTable * self, LuString * key)
  2. {
  3.   int i;
  4.   printf("LuStringTable_get: %s\n", key->str);
  5.   printf("self = %p\n", self);
  6.   printf("self->size = %d\n", self->size);
  7.   for(i=0;i<self->size;i++)
  8.   {
  9.     if(LuString_compare(self->keys[i], key) == LuTRUE)
  10.     {
  11.       return self->values[i];
  12.     }
  13.   }
  14.   printf("fin\n" );
  15.   return LuNULL;
  16. }


 
self n'est pas null, mais quand j'accède a l'attribut size, ca plante (fin pas a chaque fois que je passe dans cette methode, mais a chaque fois que j'y passe avec les mêmes parametres). Faut que je verifie si j'ai pas un cast malheureux, mais ca m'étonnerais, vu que ca marche sous linux, et sous win en passant par devc++ et en doublecliquant sur le fichier.

Reply

Marsh Posté le 29-10-2002 à 16:58:01    

bon, ben j'ai trouvé la cause, même si j'ai pas compris pourquoi ca marchait du coup.
 
En fait le premier parametre de la méthode précédente était initialisé en cas de besoin :
 

Code :
  1. void LuObject_setAttribute(LuObject * self, LuObject * permission, LuObject * type, LuString * name, LuObject * value)
  2. {
  3.   LuAttribute * attr;
  4.   /* first attribute, create the attribute table */
  5.   if(self->attributes == 0)
  6.     self->attributes = (LuObject *)LuStringTable_create();
  7.   /* check if the attribute is already existant and writeable */
  8.   attr = (LuAttribute *)LuStringTable_get((LuStringTable *)self->attributes, name);
  9.  
  10.   //snip
  11. }


 
le probleme, c'est que je mettais bien self->attributes a 0 dans le constructeur d'object, mais pas dans celui de string, ce qui fait que j'utilisait un truc non initialisé.
 
reste a comprendre pourquoi il était a 0 sous linux et en le lancant via l'explorer.

Reply

Marsh Posté le 29-10-2002 à 20:27:43    

D'un autre côté c'est peut être la faute de Windows Meuh.
 
Ceci n'est pas un troll.

Reply

Marsh Posté le 29-10-2002 à 20:27:43   

Reply

Marsh Posté le 29-10-2002 à 20:41:04    

Cherrytree a écrit a écrit :

D'un autre côté c'est peut être la faute de Windows Meuh.
 
Ceci n'est pas un troll.




A la base y'a quand même une erreur que je me suis empressé de corriger. Maintenant ca explique pas pourquoi windows met la mémoire allouée a 0 quand on lance un programme a partir de la gui et la laisse dans un état non prévisible quand lance le même programme a partir de la ligne de commande.

Reply

Marsh Posté le 29-10-2002 à 21:29:57    

Cherrytree a écrit a écrit :

D'un autre côté c'est peut être la faute de Windows Meuh.
 
Ceci n'est pas un troll.




 
Si le programme comporte une erreur, je préfere que l'OS ne me la corrige pas! Comment la repérer sinon?

Reply

Marsh Posté le 29-10-2002 à 21:34:48    

Ace17 a écrit a écrit :

 
Si le programme comporte une erreur, je préfere que l'OS ne me la corrige pas! Comment la repérer sinon?




 
certes, mais comment expliquer que le comportement est différent selon la manière de lancer le programme ?

Reply

Marsh Posté le 29-10-2002 à 21:37:57    

Il faudrait se pencher du coté des parametres qu'on donne a CreateProcess. C'est a ce niveau la que ca doit différer

Reply

Marsh Posté le 29-10-2002 à 21:42:56    

Ace17 a écrit a écrit :

Il faudrait se pencher du coté des parametres qu'on donne a CreateProcess. C'est a ce niveau la que ca doit différer




euh j'ai pas acces au sources de windows, moi... j'aurais du mal a voir ce qu'il appelle.

Reply

Marsh Posté le 29-10-2002 à 21:45:42    

lol moi non plus!
Mais peut etre ca serait plus évident que l'on pense une fois qu'on aurait les parametres possibles sous les yeux!

Reply

Marsh Posté le 29-10-2002 à 21:46:25    

Remarque, il suffit de désassembler command.com non?
 
edit : si je trouve une invocation a CreateProcess dans command.com je suis vraiment tres fort!!! :lol:


Message édité par Ace17 le 29-10-2002 à 21:47:20
Reply

Marsh Posté le 29-10-2002 à 21:48:16    

"The CreateProcess function creates a new process and its primary thread. The new process runs the specified executable file in the security context of the calling process"
 
Apparament command.com a moins de droits que explorer.
 
edit : mais je commence a me poser des questions moi, comment windows intercepte-il le lancement d'un programme a partir du command.com?


Message édité par Ace17 le 29-10-2002 à 21:50:15
Reply

Marsh Posté le 29-10-2002 à 21:48:52    

Ace17 a écrit a écrit :

Remarque, il suffit de désassembler command.com non?




Heu... juste pour situer le contexte, je suis déja content que mon truc compile sous win, a la base c'était même pas prévu.  
 
Alors perdre mon temps a décompiler un interpréteur de commandes dos, on va oublier...

Reply

Marsh Posté le 29-10-2002 à 21:49:56    

Ace17 a écrit a écrit :

 
Apparament command.com a moins de droits que explorer.




 
ben la mon probleme je pense pas que ce soit lié aux droits, mais plus que dans un cas malloc initialise la mémoire a 0, alors que dans l'autre cas non.

Reply

Marsh Posté le 29-10-2002 à 21:51:23    

lorill a écrit a écrit :

 
 
ben la mon probleme je pense pas que ce soit lié aux droits, mais plus que dans un cas malloc initialise la mémoire a 0, alors que dans l'autre cas non.




 
MDR j'aurais peut etre du lire le topic en entier, honte sur moi! :lol:
Ouais bon ben c'est pas la peine de chercher plus loin!

Reply

Marsh Posté le 29-10-2002 à 21:54:47    

Ace17 a écrit a écrit :

 
MDR j'aurais peut etre du lire le topic en entier, honte sur moi! :lol:
Ouais bon ben c'est pas la peine de chercher plus loin!  




 
Ben si, la question est différente, mais n'a pas de réponse. C'est une erreur de supposer que malloc place la mémoire allouée a 0, mais ca n'explique pas pourquoi il le fait dans un cas et pas dans l'autre.
 
Ceci dit, la recherche de la solution est plus un defi inutile qu'autre chose, vu que le code mettant en avant cette différence est erroné.

Reply

Marsh Posté le 29-10-2002 à 21:58:41    

Moi je pense que c'est tout betement que suivant les cas le programme n'est pas chargé au meme endroit; Coup de bol, dans un cas il est chargé dans un endroit qui contient des zeros, mais dans l'autre, il y a n'importe quoi.

Reply

Marsh Posté le 31-10-2002 à 02:50:08    

lorill a écrit a écrit :

Sous windows...
 
Y'a une explication rationnelle ?



Non-sens detecté !


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 31-10-2002 à 09:10:02    

Musaran a écrit a écrit :

 
Non-sens detecté !




MDR :lol:
[:xp1700]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed