Bienvenue invité ( Connexion | Inscription )
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.
|
|
|
|
![]() |
9 Oct 2006, 21:12
Message
#2
|
|
|
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 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 |
|
|
|
10 Oct 2006, 10:07
Message
#3
|
|
![]() 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é |
|
|
|
10 Oct 2006, 13:42
Message
#4
|
|
|
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 -------------------- 100% packet loss garanti!
Networkdump |
|
|
|
10 Oct 2006, 13:49
Message
#5
|
|
![]() 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 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. |
|
|
|
10 Oct 2006, 14:43
Message
#6
|
|
|
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 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 -------------------- 100% packet loss garanti!
Networkdump |
|
|
|
10 Oct 2006, 14:54
Message
#7
|
|
![]() 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 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 ? |
|
|
|
mackintosh Bus Error en C 4 Oct 2006, 22:16
Cochonou Salut,
à vue d'oeil, tu alloues des char (c e... 4 Oct 2006, 22:20
schlum Yeah ! Buffer overflow
Le truc qui est ador... 4 Oct 2006, 22:27
mackintosh un Bus Error correspondrait donc à un BufferOverf... 4 Oct 2006, 22:32
Cochonou Normalement, quand tu accèdes à une zone mémoir... 4 Oct 2006, 23:04
mackintosh J'ai testé les solutions, à priori c'est... 5 Oct 2006, 16:20
mpergand http://www.lri.fr/~aze/page_c/aide_c/scanf.html 5 Oct 2006, 16:28
schlum 1 - scanf %c c'est pour récupérer 1 caractè... 5 Oct 2006, 17:09
mackintosh En effet çà fait pas mal de choses qui peuvent p... 5 Oct 2006, 17:31
Doom Hammer Le programme crash (probablement sur feof ou fgetc... 5 Oct 2006, 17:38
Cochonou Doom Hammer a certainement raison, parce qu'un... 5 Oct 2006, 21:23
mackintosh au final c'était tout simplement un problème... 6 Oct 2006, 20:35
schlum CITATION(mackintosh @ 6 Oct 2006, 21:35) ... 6 Oct 2006, 20:54

chombier CITATION(noop @ 10 Oct 2006, 15:54) 19259... 10 Oct 2006, 16:01

noop CITATION(chombier @ 10 Oct 2006, 17:01) 1... 10 Oct 2006, 16:09

chombier CITATION(noop @ 10 Oct 2006, 17:09) 19261... 10 Oct 2006, 16:32

noop CITATION(chombier @ 10 Oct 2006, 17:32) 1... 11 Oct 2006, 09:14

chombier CITATION(noop @ 11 Oct 2006, 10:14) 19270... 11 Oct 2006, 09:48

noop CITATION(chombier @ 11 Oct 2006, 10:48) 1... 11 Oct 2006, 10:29
mackintosh CITATION(franklinchef @ 9 Oct 2006, 22:12... 12 Oct 2006, 19:01
chombier CITATION(mackintosh @ 12 Oct 2006, 20:01)... 12 Oct 2006, 19:20
schlum Vous exagérez quand même
Dans les sources de ... 11 Oct 2006, 10:44
chombier Et ? emacs est sensé être LA référence en mati... 11 Oct 2006, 10:46
noop CITATION(chombier @ 11 Oct 2006, 11:46) 1... 11 Oct 2006, 11:09
mpergand CITATION(noop @ 11 Oct 2006, 12:09) 19272... 11 Oct 2006, 13:10
schlum Avec "kmalloc", il vaut mieux (sinon c... 11 Oct 2006, 10:55
chombier CITATION(schlum @ 11 Oct 2006, 11:55) 192... 11 Oct 2006, 11:15
Cochonou CITATION
a moins que tu sois dans un environnement... 12 Oct 2006, 12:26
Fotz CITATION(Cochonou @ 12 Oct 2006, 13:26) 1... 12 Oct 2006, 12:40
noop CITATION(Fotz @ 12 Oct 2006, 13:40) 19289... 12 Oct 2006, 12:52
mackintosh Je vois que le sujet a suscité beaucoup de réact... 12 Oct 2006, 15:40
noop CITATION(mackintosh @ 12 Oct 2006, 16:40)... 12 Oct 2006, 15:45
schlum CODESECURITY CONSIDERATIONS
The gets() f... 12 Oct 2006, 19:21
mackintosh D'accord je comprends mieux maintenant !
m... 12 Oct 2006, 19:30![]() ![]() |
| Nous sommes le : 3rd April 2026 - 15:26 |