IPB

Bienvenue invité ( Connexion | Inscription )

> Bus Error en C, Sous OS X dans le terminal
Options
mackintosh
posté 4 Oct 2006, 22:16
Message #1


Adepte de Macbidouille
*

Groupe : Membres
Messages : 121
Inscrit : 2 Jan 2003
Lieu : Moselle - Metz
Membre no 5 405



Bonsoir,

j'utilise depuis peu mon imac pour compiler des sources C pour différents tp ...
les exemples de base, boucles etc ... marchent très bien mais je rencontre un souci avec un petit programme qui est sensé lire puis restituer un fichier sur l'ecran du shell

J'obtiens le message suivant : Bus error ....
voici ci dessous la source du programme, si quelqu'un pourrait m'éclairer un peu sur ce problème ?

CODE
#include <stdio.h>
int main()
{
FILE *f;
char c;
char saisie;

printf("saisissez le fichier a lire");

scanf("%c", &saisie);
f=fopen("saisie", "r");


while (! feof(f))
{
c=fgetc(f);
printf("%c", c);
}


}



"lecture.c" 21L, 211C


Ce message a été modifié par mackintosh - 4 Oct 2006, 22:17.


--------------------
Rien ne sert de courir si l'on est pas sur le bon chemin.
Go to the top of the page
 
+Quote Post
2 Pages V   1 2 >  
Start new topic
Réponse(s) (1 - 29)
Cochonou
posté 4 Oct 2006, 22:20
Message #2


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 3 129
Inscrit : 21 Aug 2005
Membre no 44 239



Salut,
à vue d'oeil, tu alloues des char (c et saisie), soit un (et un seul) caractère à chaque fois. Quand tu vas écrire dessus un mot avec ton scanf, il va y avoir plus d'un caractère de longueur, du dépassement de buffer.... et crash.

Il faut (enfin, une solution est de...) utiliser des appels malloc pour allouer une taille de buffer plus grande.
Par exemple :
CODE

char *saisie = (char*) malloc(32*sizeof(char));
scanf("%c", saisie);

Ou directement avec une allocation sur la pile,
CODE

char saisie[32];
scanf("%c", &saisie);


Ce message a été modifié par Cochonou - 4 Oct 2006, 22:24.


--------------------
Powerbook G4 1.33 Ghz - Mac OS X 10.5
Go to the top of the page
 
+Quote Post
schlum
posté 4 Oct 2006, 22:27
Message #3


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 456
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Yeah ! Buffer overflow smile.gif
Le truc qui est adoré des hackers quand c'est dans un exécutable avec setuid root wink.gif


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
mackintosh
posté 4 Oct 2006, 22:32
Message #4


Adepte de Macbidouille
*

Groupe : Membres
Messages : 121
Inscrit : 2 Jan 2003
Lieu : Moselle - Metz
Membre no 5 405



un Bus Error correspondrait donc à un BufferOverflow ... toujours bon à savoir wink.gif.


Merci pour les pistes smile.gif je regarderais çà dès demain.


--------------------
Rien ne sert de courir si l'on est pas sur le bon chemin.
Go to the top of the page
 
+Quote Post
Cochonou
posté 4 Oct 2006, 23:04
Message #5


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 3 129
Inscrit : 21 Aug 2005
Membre no 44 239



Normalement, quand tu accèdes à une zone mémoire non autorisée, tu t'attends à recevoir une erreur de segmentation (segmentation fault).
Pour les erreurs de bus, c'est un peu plus particulier... c'est en général un accès à une adresse invalide. Et là, il y a une autre erreur dans le programme qui doit causer ça:
CODE

f=fopen("saisie", "r");

à la place de
CODE

f=fopen(saisie, "r");


--------------------
Powerbook G4 1.33 Ghz - Mac OS X 10.5
Go to the top of the page
 
+Quote Post
mackintosh
posté 5 Oct 2006, 16:20
Message #6


Adepte de Macbidouille
*

Groupe : Membres
Messages : 121
Inscrit : 2 Jan 2003
Lieu : Moselle - Metz
Membre no 5 405



J'ai testé les solutions, à priori c'est encore un autre souci ...

actuellement je teste avec le code suivant

CODE

#include <stdio.h>
int main()
{      FILE *f;
        char c;
        char saisie[32];
        
        printf("saissisez le fichier a lire !!!");

        scanf("%c", &saisie);
        f=fopen(saisie, "r");

                while (! feof(f))
                        {
                        c=fgetc(f);
                        printf("%c", c);
                        }
}      


J'ai modifié le code source comme tu me l'as conseillé, avec un tableau saisie[32], et saisie sans les " " ...
toujours un message d'erreur "Bus error"
Puis j'ai tenté avec

CODE

{      FILE *f;
        char c;
        char *saisie = (char*) malloc(32*sizeof(char));

        printf("saissisez le fichier a lire !!!");

        scanf("%c", saisie);

etc ...


Toujours la même erreur..
Si tu as une autre idée ? merci bien.




--------------------
Rien ne sert de courir si l'on est pas sur le bon chemin.
Go to the top of the page
 
+Quote Post
mpergand
posté 5 Oct 2006, 16:28
Message #7


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 198
Inscrit : 8 Oct 2003
Membre no 10 220



http://www.lri.fr/~aze/page_c/aide_c/scanf.html
Go to the top of the page
 
+Quote Post
schlum
posté 5 Oct 2006, 17:09
Message #8


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 456
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



1 - scanf %c c'est pour récupérer 1 caractère
2 - Tu appelles fopen sur une chaîne sans savoir si elle a un "terminateur" '\0'
3 - Tu ne testes pas la validité de ton fichier ouvert

Au moins 3 bonnes raisons d'avoir un giga-plantage !


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
mackintosh
posté 5 Oct 2006, 17:31
Message #9


Adepte de Macbidouille
*

Groupe : Membres
Messages : 121
Inscrit : 2 Jan 2003
Lieu : Moselle - Metz
Membre no 5 405



En effet çà fait pas mal de choses qui peuvent provoquer un énorme plantage ... je vais continuer sur la lancée ... merci pour les conseils smile.gif


--------------------
Rien ne sert de courir si l'on est pas sur le bon chemin.
Go to the top of the page
 
+Quote Post
Doom Hammer
posté 5 Oct 2006, 17:38
Message #10


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 844
Inscrit : 10 Jul 2002
Membre no 2 871



Le programme crash (probablement sur feof ou fgetc) parce que fopen renvoie NULL car le fichier n'est pas trouvé (je crois pas qu'il y ait de buffer overflow possible sur ton premier code vu le "%c").
Dans tous les cas (comme le précise schlum) tu devrais vérifier le retour :
FILE *f = fopen(...

if (f != NULL)
{
/* process file */
}
else
{
/* file was not found */
}

Ce message a été modifié par Doom Hammer - 5 Oct 2006, 21:52.
Go to the top of the page
 
+Quote Post
Cochonou
posté 5 Oct 2006, 21:23
Message #11


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 3 129
Inscrit : 21 Aug 2005
Membre no 44 239



Doom Hammer a certainement raison, parce qu'un copier/coller direct de ton code (après les deux corrections que tu as effectuées) marche chez moi... pour autant que le nom du fichier ait un seul caractère wink.gif.

Donc, en plus des ajouts de Doom Hammer, utilise scanf avec %s pour récupérer une chaîne.

Ce message a été modifié par Cochonou - 5 Oct 2006, 21:27.


--------------------
Powerbook G4 1.33 Ghz - Mac OS X 10.5
Go to the top of the page
 
+Quote Post
mackintosh
posté 6 Oct 2006, 20:35
Message #12


Adepte de Macbidouille
*

Groupe : Membres
Messages : 121
Inscrit : 2 Jan 2003
Lieu : Moselle - Metz
Membre no 5 405



au final c'était tout simplement un problème avec %c ... j'ai remplacé avec %s et tout fonctionne, merci pour votre aide !


--------------------
Rien ne sert de courir si l'on est pas sur le bon chemin.
Go to the top of the page
 
+Quote Post
schlum
posté 6 Oct 2006, 20:54
Message #13


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 456
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



CITATION(mackintosh @ 6 Oct 2006, 21:35) [snapback]1920842[/snapback]

au final c'était tout simplement un problème avec %c ... j'ai remplacé avec %s et tout fonctionne, merci pour votre aide !

Tu ferais quand même mieux de tester l'existence du fichier rolleyes.gif


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
franklinchef
posté 9 Oct 2006, 21:12
Message #14


Adepte de Macbidouille
*

Groupe : Membres
Messages : 41
Inscrit : 28 Apr 2006
Lieu : Montréal
Membre no 60 178



Petite rectification pour tout le monde:

Bus error n'est ni une erreur d'overflow ou fichier manquant, mais bien un accès à un pointeur non valide (non existant ou permission non accordé). On peut le comparer à un segmentation fault sous linux.

Une autre erreur:

CODE

char *saisie = (char*) malloc(32*sizeof(char));
        printf("saissisez le fichier a lire !!!");
        scanf("%c", saisie);


Et si malloc fail? Tu te tappes un autre Bus error! TOUJOURS TOUJOURS TOUJOURS vérifier la valeur de retour de n'importe [mcr]alloc()

Sans oublier que scanf est la fonction à utiliser par excellence si on veut se faire un buffer overflow smile.gif
Cette fonction serait mieux et plus sécuritaire dans ton cas:
http://en.wikipedia.org/wiki/Fgets

Ce message a été modifié par franklinchef - 9 Oct 2006, 21:19.


--------------------
100% packet loss garanti!
Networkdump
Go to the top of the page
 
+Quote Post
noop
posté 10 Oct 2006, 10:07
Message #15


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



CITATION(franklinchef @ 9 Oct 2006, 22:12) [snapback]1925080[/snapback]


Et si malloc fail? Tu te tappes un autre Bus error! TOUJOURS TOUJOURS TOUJOURS vérifier la valeur de retour de n'importe [mcr]alloc()



C'est la grande question: doit t'on vérifier tous les malloc. Dans le cas que tu cite, si le system n'a pas pu t'allouer 32 * sizeof(char) octets, c'est que tu es dans un position délicate. Il y a de forte probabilité que même le test suivant plante car ta machine ne pourra plus rien faire. Et même a supposer que tu arrive a faire le test, tu va devoir générer une erreur (log, message....) qui va nécessiter beaucoup plus de mémoire ce qui va encore planter.

Je penses qu'il faut vérifier que les grosses allocations, le reste il faut s'en passer celà permet une meilleur lisibilité du code et diminue sa complexité
Go to the top of the page
 
+Quote Post
franklinchef
posté 10 Oct 2006, 13:42
Message #16


Adepte de Macbidouille
*

Groupe : Membres
Messages : 41
Inscrit : 28 Apr 2006
Lieu : Montréal
Membre no 60 178



CITATION(noop @ 10 Oct 2006, 05:07) [snapback]1925607[/snapback]

CITATION(franklinchef @ 9 Oct 2006, 22:12) [snapback]1925080[/snapback]


Et si malloc fail? Tu te tappes un autre Bus error! TOUJOURS TOUJOURS TOUJOURS vérifier la valeur de retour de n'importe [mcr]alloc()



C'est la grande question: doit t'on vérifier tous les malloc. Dans le cas que tu cite, si le system n'a pas pu t'allouer 32 * sizeof(char) octets, c'est que tu es dans un position délicate. Il y a de forte probabilité que même le test suivant plante car ta machine ne pourra plus rien faire. Et même a supposer que tu arrive a faire le test, tu va devoir générer une erreur (log, message....) qui va nécessiter beaucoup plus de mémoire ce qui va encore planter.

Je penses qu'il faut vérifier que les grosses allocations, le reste il faut s'en passer celà permet une meilleur lisibilité du code et diminue sa complexité


Je ne suis pas daccord avec toi. Le problème avec les alloc failed, c'est qu'il te retourne un null pointer. Si tu fais un test/acces/modif à ce pointeur, l'OS tue ton process sans aucune chance de sauvegarde de données.

Prenons par exemple un logiciel critique: voir MySQL. Est-ce que tu accepterais de perdre toutes tes données en transaction parce qu'un call d'alloc à échoué? Ceci est tout à fait innacceptable. Peut-être qu'en effet ça diminue la complexité et la lisibilité, mais le but est de garder un programme consistant et efficace.

Il ne faut pas prendre en considération que ta fonction va toujours réussir, c'est une très mauvaise notion de programmation qui amène à des plantages non voulu.Par contre, je t'accorde le fait que ce n'est pas nécessaire pour un petit programme pour apprendre le language. Je ne fais qu'avertir mackintosh aux joies de la famille alloc, vaut mieux ne pas prendre de faux plis dès le départ.

Et pour ce qui est de la complexité... Il suffit de créer son propre call de malloc voir getmem() avec les mêmes params. Cette fonction est un wrap arround de malloc et fait les checks (null pointer?) sinon elle apelle une fonction définie par nous pour flusher les données importants. Tout ça en quittant sans avoir de Bus Error smile.gif


--------------------
100% packet loss garanti!
Networkdump
Go to the top of the page
 
+Quote Post
noop
posté 10 Oct 2006, 13:49
Message #17


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



CITATION(franklinchef @ 10 Oct 2006, 14:42) [snapback]1925894[/snapback]

CITATION(noop @ 10 Oct 2006, 05:07) [snapback]1925607[/snapback]

CITATION(franklinchef @ 9 Oct 2006, 22:12) [snapback]1925080[/snapback]


Et si malloc fail? Tu te tappes un autre Bus error! TOUJOURS TOUJOURS TOUJOURS vérifier la valeur de retour de n'importe [mcr]alloc()



C'est la grande question: doit t'on vérifier tous les malloc. Dans le cas que tu cite, si le system n'a pas pu t'allouer 32 * sizeof(char) octets, c'est que tu es dans un position délicate. Il y a de forte probabilité que même le test suivant plante car ta machine ne pourra plus rien faire. Et même a supposer que tu arrive a faire le test, tu va devoir générer une erreur (log, message....) qui va nécessiter beaucoup plus de mémoire ce qui va encore planter.

Je penses qu'il faut vérifier que les grosses allocations, le reste il faut s'en passer celà permet une meilleur lisibilité du code et diminue sa complexité


Je ne suis pas daccord avec toi. Le problème avec les alloc failed, c'est qu'il te retourne un null pointer. Si tu fais un test/acces/modif à ce pointeur, l'OS tue ton process sans aucune chance de sauvegarde de données.

Prenons par exemple un logiciel critique: voir MySQL. Est-ce que tu accepterais de perdre toutes tes données en transaction parce qu'un call d'alloc à échoué? Ceci est tout à fait innacceptable. Peut-être qu'en effet ça diminue la complexité et la lisibilité, mais le but est de garder un programme consistant et efficace.

Il ne faut pas prendre en considération que ta fonction va toujours réussir, c'est une très mauvaise notion de programmation qui amène à des plantages non voulu.Par contre, je t'accorde le fait que ce n'est pas nécessaire pour un petit programme pour apprendre le language. Je ne fais qu'avertir mackintosh aux joies de la famille alloc, vaut mieux ne pas prendre de faux plis dès le départ.

Et pour ce qui est de la complexité... Il suffit de créer son propre call de malloc voir getmem() avec les mêmes params. Cette fonction est un wrap arround de malloc et fait les checks (null pointer?) sinon elle apelle une fonction définie par nous pour flusher les données importants. Tout ça en quittant sans avoir de Bus Error smile.gif


Dans les conditions limites tu n'es jamais sur de sauver correctement. Si tes données sont importantes, elles sont aussi surement importante en taille. Or tu viens d'avoir une erreur sur un malloc, tout le code qui va suivre va aussi allouer de la mémoire....donc aussi planter.

Ce message a été modifié par noop - 10 Oct 2006, 13:50.
Go to the top of the page
 
+Quote Post
franklinchef
posté 10 Oct 2006, 14:43
Message #18


Adepte de Macbidouille
*

Groupe : Membres
Messages : 41
Inscrit : 28 Apr 2006
Lieu : Montréal
Membre no 60 178



CITATION(noop @ 10 Oct 2006, 08:49) [snapback]1925906[/snapback]

CITATION(franklinchef @ 10 Oct 2006, 14:42) [snapback]1925894[/snapback]

CITATION(noop @ 10 Oct 2006, 05:07) [snapback]1925607[/snapback]

CITATION(franklinchef @ 9 Oct 2006, 22:12) [snapback]1925080[/snapback]


Et si malloc fail? Tu te tappes un autre Bus error! TOUJOURS TOUJOURS TOUJOURS vérifier la valeur de retour de n'importe [mcr]alloc()



C'est la grande question: doit t'on vérifier tous les malloc. Dans le cas que tu cite, si le system n'a pas pu t'allouer 32 * sizeof(char) octets, c'est que tu es dans un position délicate. Il y a de forte probabilité que même le test suivant plante car ta machine ne pourra plus rien faire. Et même a supposer que tu arrive a faire le test, tu va devoir générer une erreur (log, message....) qui va nécessiter beaucoup plus de mémoire ce qui va encore planter.

Je penses qu'il faut vérifier que les grosses allocations, le reste il faut s'en passer celà permet une meilleur lisibilité du code et diminue sa complexité


Je ne suis pas daccord avec toi. Le problème avec les alloc failed, c'est qu'il te retourne un null pointer. Si tu fais un test/acces/modif à ce pointeur, l'OS tue ton process sans aucune chance de sauvegarde de données.

Prenons par exemple un logiciel critique: voir MySQL. Est-ce que tu accepterais de perdre toutes tes données en transaction parce qu'un call d'alloc à échoué? Ceci est tout à fait innacceptable. Peut-être qu'en effet ça diminue la complexité et la lisibilité, mais le but est de garder un programme consistant et efficace.

Il ne faut pas prendre en considération que ta fonction va toujours réussir, c'est une très mauvaise notion de programmation qui amène à des plantages non voulu.Par contre, je t'accorde le fait que ce n'est pas nécessaire pour un petit programme pour apprendre le language. Je ne fais qu'avertir mackintosh aux joies de la famille alloc, vaut mieux ne pas prendre de faux plis dès le départ.

Et pour ce qui est de la complexité... Il suffit de créer son propre call de malloc voir getmem() avec les mêmes params. Cette fonction est un wrap arround de malloc et fait les checks (null pointer?) sinon elle apelle une fonction définie par nous pour flusher les données importants. Tout ça en quittant sans avoir de Bus Error smile.gif


Dans les conditions limites tu n'es jamais sur de sauver correctement. Si tes données sont importantes, elles sont aussi surement importante en taille. Or tu viens d'avoir une erreur sur un malloc, tout le code qui va suivre va aussi allouer de la mémoire....donc aussi planter.


Si tu utilises des buffers static pour dumper ton data, tu t'en sors vainceur parce qu'ils sont déjà alloués smile.gif


--------------------
100% packet loss garanti!
Networkdump
Go to the top of the page
 
+Quote Post
noop
posté 10 Oct 2006, 14:54
Message #19


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



CITATION(franklinchef @ 10 Oct 2006, 15:43) [snapback]1925974[/snapback]


Si tu utilises des buffers static pour dumper ton data, tu t'en sors vainceur parce qu'ils sont déjà alloués smile.gif


Dans ton code oui (bien que des buffers static c'est limite programmation à la sauvage !). Mais tes données tu va les passer à un autre process (base de données par exemple) qui lui va devoir allouer de la mémoire. Que fais tu ? Tu penses que celà va marcher et que miraculeusement de la mémoire va être libérée ?
Go to the top of the page
 
+Quote Post
chombier
posté 10 Oct 2006, 16:01
Message #20


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 584
Inscrit : 20 Mar 2003
Membre no 6 765



CITATION(noop @ 10 Oct 2006, 15:54) [snapback]1925994[/snapback]

CITATION(franklinchef @ 10 Oct 2006, 15:43) [snapback]1925974[/snapback]


Si tu utilises des buffers static pour dumper ton data, tu t'en sors vainceur parce qu'ils sont déjà alloués smile.gif


Dans ton code oui (bien que des buffers static c'est limite programmation à la sauvage !).

Il existe des tas de cas de figure où, si tu veux que ton code s'exécute correctement, les allocations sont faites à l'initialisation, et plus aucune lors de l'exécution. Dans les device drivers en particulier, où toute erreur d'allocation devient vite critique.
CITATION(noop @ 10 Oct 2006, 15:54) [snapback]1925994[/snapback]

Mais tes données tu va les passer à un autre process (base de données par exemple) qui lui va devoir allouer de la mémoire. Que fais tu ? Tu penses que celà va marcher et que miraculeusement de la mémoire va être libérée ?

Tu programmes depuis longtemps noop ?
Les rares fois où j'ai vu un bout de code open-source qui ne vérifiait pas le résultat d'un malloc(), j'ai envoyé un bug report à l'auteur, et la correction ne s'est pas faite attendre.
Comme le dit franklinchef, il faut systématiquement vérifier le résultat d'une allocation mémoire.


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
noop
posté 10 Oct 2006, 16:09
Message #21


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



CITATION(chombier @ 10 Oct 2006, 17:01) [snapback]1926107[/snapback]

Tu programmes depuis longtemps noop ?
Les rares fois où j'ai vu un bout de code open-source qui ne vérifiait pas le résultat d'un malloc(), j'ai envoyé un bug report à l'auteur, et la correction ne s'est pas faite attendre.
Comme le dit franklinchef, il faut systématiquement vérifier le résultat d'une allocation mémoire.


Oui assez +de 20ans. Et je n'ai jamais eu de problèmes dans mes programmes. Les seules vérif que je fais c'est quand j'ai besoin de + de 4K. Et j'ai développé dans toutes sortes de programmes comm, drivers et middleware. Désolé, je n'y crois pas regarde les logiciels middleware et autres, dans les conditions extremes telles que décrites plus haut ils génèrent des dump ou se crash tout bonnement. Quand au code open source linux et autre je veux bien voir comment ils se comportent quand ils ne peuvent pas allouer 32 octets laugh.gif
Go to the top of the page
 
+Quote Post
chombier
posté 10 Oct 2006, 16:32
Message #22


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 584
Inscrit : 20 Mar 2003
Membre no 6 765



CITATION(noop @ 10 Oct 2006, 17:09) [snapback]1926135[/snapback]

Oui assez +de 20ans. Et je n'ai jamais eu de problèmes dans mes programmes. Les seules vérif que je fais c'est quand j'ai besoin de + de 4K. Et j'ai développé dans toutes sortes de programmes comm, drivers et middleware.

Tu as une idée des conséquences d'un accès à un pointeur NULL dans un device driver ? Ça donne un Kernel Panic.
Pour moi, la programmation à la sauvage comme tu l''appelles, c'est bien plutôt de croire qu'aucune allocation de taille inférieure à 4k (plutôt arbitraire d'ailleurs comme valeur) n'échouera. smile.gif
CITATION(noop @ 10 Oct 2006, 17:09) [snapback]1926135[/snapback]

Désolé, je n'y crois pas regarde les logiciels middleware et autres, dans les conditions extremes telles que décrites plus haut ils génèrent des dump ou se crash tout bonnement. Quand au code open source linux et autre je veux bien voir comment ils se comportent quand ils ne peuvent pas allouer 32 octets laugh.gif

Et bien il suffit de lire le code source...


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
noop
posté 11 Oct 2006, 09:14
Message #23


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



CITATION(chombier @ 10 Oct 2006, 17:32) [snapback]1926178[/snapback]

CITATION(noop @ 10 Oct 2006, 17:09) [snapback]1926135[/snapback]

Oui assez +de 20ans. Et je n'ai jamais eu de problèmes dans mes programmes. Les seules vérif que je fais c'est quand j'ai besoin de + de 4K. Et j'ai développé dans toutes sortes de programmes comm, drivers et middleware.

Tu as une idée des conséquences d'un accès à un pointeur NULL dans un device driver ? Ça donne un Kernel Panic.
Pour moi, la programmation à la sauvage comme tu l''appelles, c'est bien plutôt de croire qu'aucune allocation de taille inférieure à 4k (plutôt arbitraire d'ailleurs comme valeur) n'échouera. smile.gif
CITATION(noop @ 10 Oct 2006, 17:09) [snapback]1926135[/snapback]

Désolé, je n'y crois pas regarde les logiciels middleware et autres, dans les conditions extremes telles que décrites plus haut ils génèrent des dump ou se crash tout bonnement. Quand au code open source linux et autre je veux bien voir comment ils se comportent quand ils ne peuvent pas allouer 32 octets laugh.gif

Et bien il suffit de lire le code source...


Ben je suis désolé moi je vois ca tous les jours....a moins que tu sois dans un environnement embarqué ou militaire, on n'est plus au temps du Dos. Compte le nombre de malloc() et autres dans un programme et ajoute au minimum 10 lignes pour traiter l'erreur, ton programme devient illisible et immaintenable.

Quant a ton device driver, s'il rencontre un pointer null,il y a belle lurette que ta machine est a genoux et quelle soit déjà plantée ! alors un crash de plus ou de moins ca change pas grand chose.

D'autre part, tout bon développeur doit aussi maitriser le multi threading. Alors la si tu commence a gérer les problèmes de mémoire pour 32 malheureux octets, je suis curieux de voir la tête de tes programmes. Il y a d'autres techniques pour gérer ce problèmes c'est d'installer des exit routines sur les signaux. La tu peux terminer proprement si le système n'est pas a genoux. Le code est plus lisible, tu ecrit moins de code et tout le monde est content
Go to the top of the page
 
+Quote Post
chombier
posté 11 Oct 2006, 09:48
Message #24


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 584
Inscrit : 20 Mar 2003
Membre no 6 765



CITATION(noop @ 11 Oct 2006, 10:14) [snapback]1927040[/snapback]
Ben je suis désolé moi je vois ca tous les jours....a moins que tu sois dans un environnement embarqué ou militaire,

Comment dans un programme fais tu la différence entre un Linux embarqué et un Linux Desktop ? Comment sais tu, si tu fais une librairie, à quelle utilisation elle sera destinée ? On code proprement ou pas, c'est tout.
CITATION(noop @ 11 Oct 2006, 10:14) [snapback]1927040[/snapback]
on n'est plus au temps du Dos.

Je ne vois pas le rapport avec le schmilblick.
CITATION(noop @ 11 Oct 2006, 10:14) [snapback]1927040[/snapback]
Compte le nombre de malloc() et autres dans un programme et ajoute au minimum 10 lignes pour traiter l'erreur, ton programme devient illisible et immaintenable.

Pfff. Tant qu'à faire, ne teste aucun retour de fonction, ça améliorera encore la lisibilité... rolleyes.gif
CITATION(noop @ 11 Oct 2006, 10:14) [snapback]1927040[/snapback]

Quant a ton device driver, s'il rencontre un pointer null,il y a belle lurette que ta machine est a genoux et quelle soit déjà plantée ! alors un crash de plus ou de moins ca change pas grand chose.

Pure supposition. Ce qui est certain, c'est qu'avec ta méthode, la machine plantera.
CITATION(noop @ 11 Oct 2006, 10:14) [snapback]1927040[/snapback]

D'autre part, tout bon développeur doit aussi maitriser le multi threading. Alors la si tu commence a gérer les problèmes de mémoire pour 32 malheureux octets, je suis curieux de voir la tête de tes programmes. Il y a d'autres techniques pour gérer ce problèmes c'est d'installer des exit routines sur les signaux. La tu peux terminer proprement si le système n'est pas a genoux. Le code est plus lisible, tu ecrit moins de code et tout le monde est content

Quel est le rapport entre des threads et un test d'allocation mémoire ? Tes 'exit routines' ne seront d'aucune utilité si tu plantes ton programme en accèdant à NULL. Et toutes les threads en cours seront plantées.

Tu aurais des noms de logiciels sur lesquels tu as bossé, que j'évite de m'en servir ? tongue.gif


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
noop
posté 11 Oct 2006, 10:29
Message #25


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



CITATION(chombier @ 11 Oct 2006, 10:48) [snapback]1927081[/snapback]


Tu aurais des noms de logiciels sur lesquels tu as bossé, que j'évite de m'en servir ? tongue.gif


emacs ! (non je plaisante), mais voici un petit bout de code trouvé dans emacs (5 minutes de recherche...) et déjà Oh Horreur un malloc non testé !!! laugh.gif

exemple de code:
CODE
  lca = (struct load_command **) malloc (nlc * sizeof (struct load_command *));

  for (i = 0; i < nlc; i++)
    {
      struct load_command lc;
      /* Load commands are variable-size: so read the command type and
     size first and then read the rest.  */
      if (!unexec_read (&lc, sizeof (struct load_command)))
        unexec_error ("cannot read load command");
      lca[i] = (struct load_command *) malloc (lc.cmdsize);


A remarquer, l'utilisation périlleuse de la variable lca
Go to the top of the page
 
+Quote Post
schlum
posté 11 Oct 2006, 10:44
Message #26


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 456
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Vous exagérez quand même tongue.gif
Dans les sources de zsh par exemple, on peut trouver :
CODE
    struct lexstack *ls;

    ls = (struct lexstack *)malloc(sizeof(struct lexstack));

    ls->incmdpos = incmdpos;
    ls->incond = incond;
    ls->incasepat = incasepat;
    ls->dbparens = dbparens;
    ls->isfirstln = isfirstln;
    ls->isfirstch = isfirstch;
    ls->histactive = histactive;
    ls->histdone = histdone;
    ls->stophist = stophist;
    ls->hline = chline;
    ls->hptr = hptr;
    ls->hlinesz = hlinesz;
    ls->cstack = cmdstack;
    ls->csp = cmdsp;


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
chombier
posté 11 Oct 2006, 10:46
Message #27


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 584
Inscrit : 20 Mar 2003
Membre no 6 765



Et ? emacs est sensé être LA référence en matière de programmation, et ne contient aucun bug ?

Etrangement, dans les sources du noyau Linux, toutes les allocations sont testées.
CODE
    struct belkin_sa_private *priv;

    /* allocate the private data structure */
    priv = kmalloc(sizeof(struct belkin_sa_private), GFP_KERNEL);
    if (!priv)
        return (-1); /* error */

    /* Setup private data for serial driver */
    s_priv = kmalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL);
    if (!s_priv) {
        dbg("%s - kmalloc for keyspan_serial_private failed.", __FUNCTION__);
        return -ENOMEM;
    }


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
schlum
posté 11 Oct 2006, 10:55
Message #28


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 456
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Avec "kmalloc", il vaut mieux ph34r.gif (sinon c'est Kernel Panic !)

Mais en général, si le "kmalloc" échoue, le Kernel Panic n'est pas loin de toute manière...


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
noop
posté 11 Oct 2006, 11:09
Message #29


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



CITATION(chombier @ 11 Oct 2006, 11:46) [snapback]1927172[/snapback]

Et ? emacs est sensé être LA référence en matière de programmation, et ne contient aucun bug ?

Etrangement, dans les sources du noyau Linux, toutes les allocations sont testées.



Les sources Linux ne sont pas un modèle de programmation. Les {} sont la plupart du temps omis (je sais, je sais....ca ne sert a rien allez vous me dire !). Sur 1 ligne ou une condition tu trouve deux ou trois affectations/appels de fonction etc...

Quand aux tests oui ils font des test sur les malloc() null, mais après c'est le grand flou, ca remonte des -1 ca fait des traces et puis après ca se vautre gentillment comme des grands ! Essaye de pousser un linux aux limites tu va voir de beaux crash comme tout le monde (y compris MacOSX laugh.gif )
Go to the top of the page
 
+Quote Post
chombier
posté 11 Oct 2006, 11:15
Message #30


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 584
Inscrit : 20 Mar 2003
Membre no 6 765



CITATION(schlum @ 11 Oct 2006, 11:55) [snapback]1927190[/snapback]

Avec "kmalloc", il vaut mieux ph34r.gif (sinon c'est Kernel Panic !)

Mais en général, si le "kmalloc" échoue, le Kernel Panic n'est pas loin de toute manière...

Ce n'est pas parcequ'une allocation échoue à un instant t que toute la machine va planter. Surtout si toutes les allocations sont vérifiées. On libère proprement ce qui a été alloué, et seule la dernière tâche échoue.

C'est un peu comme se dire qu'on ne va pas traiter telle section critique parce que de toutes façons, ça n'arrive qu'une fois sur un million, ça reste exceptionnel wink.gif


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post

2 Pages V   1 2 >
Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 3rd April 2026 - 12:38