[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux] Re: [devel] Petit soucis avec C.
- To: linux@lists.linuxbe.org
- Subject: [linux] Re: [devel] Petit soucis avec C.
- From: Damien Diederen <dash@linuxbe.org>
- Date: Tue, 3 Jul 2001 13:43:53 +0200
- In-reply-to: <>; from pablo@mandrakesoft.com on Sun, Jul 01, 2001 at 08:13:31PM +0200
- References: <> <01070108491101.01305@cable-195-162-223-181> <20010701093149.A174@ced> <> <>
- Reply-to: Damien Diederen <dash@linuxbe.org>
- User-agent: Mutt/1.2.5i
Hello !
On Sun, Jul 01, 2001 at 08:13:31PM +0200, Pablo Saratxaga wrote:
> On Sun, Jul 01, 2001 at 10:45:00AM +0200, CHARLIER Philippe wrote:
>
> > char p_char[] = "Ceci est un test";
> > *(p_char + 2) = 'l';
> > Ca marche, par contre, comme suit :
>
> > *p_char = "Ceci est un test";
> > *(p_char + 2) = 'l';
> > Donne une Segmentation Fault ???
>
> oui. Je crois que dans le 2e cas c'est de la mémoire non accessible en
> écriture.
> Dites-moi si je me trompe, mais le premier cas c'est comme si on
> avait:
>
> char *a = "Ceci est un test";
> char p_char[17];
>
> strcpy(p_char,a);
>
> ou
>
> char *a = "Ceci est un test";
> char *p_char;
>
> p_char = malloc(17);
> strcpy(p_char,a);
>
> non ?
C'est l'interprétation la plus correcte jusqu'ici, mais c'est encore un
peu flou. En réalité, on a une variable globale « cachée » qui ressemble
à :
static char __hidden_constant[] __attribute__ ((section
(".rodata"))) = "Ceci est un test";
La spécification __attribute__ ((section (".rodata"))) indique à gcc
(c'est une notation qui lui est propre, chaque compilateur possède la
sienne) que la variable doit être placée dans une section du programme
qui sera chargée par le kernel dans un espace mémoire _protégé contre
l'écriture_.
Le premier cas devient alors :
char p_char [17];
memcpy (p_char, __hidden_constant, 17);
Tandis que le deuxième donne :
char* p_char = __hidden_constant;
Étant donné que p_char pointe maintenant à l'intérieur d'une section que
le kernel a défini en lecture seule, il est bien sûr incorrect de faire
*p_char = '?' sous peine de segmentation fault immédiate et définitive.
Bien que cela reste incorrect d'après ANSI C, ce genre de construction
marche cependant sous des « OS » comme DOS ou MacOS qui ne possèdent pas
de gestion de la protection mémoire.
Il faut cependant remarquer que ce problème n'a rien à voir avec celui
de Philippe, qui ne modifie aucune chaîne dans son programme, mais
utilise un pointeur p_char qui est non initialisé et obtient donc un
résultat indéfini.
> Ki ça vos våye bén,
> Pablo Saratxaga
[.../...]
Cu,
Dash.
--
For every complex problem there is an answer that is clear, simple, and
wrong.
-- H. L. Mencken
--
Damien Diederen
dash@linuxbe.org
http://users.swing.be/diederen/
[ Soyez précis dans vos sujets svp afin de déterminer directement ]
[ le type de demande... ]
[ Pour vous (dés)inscrire, aller sur http://linuxbe.org/ml.php ]
[ http://LinuxBe.org Contact: listmaster@linuxbe.org ]