Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[gcc] option pour prevenir les ecritures memoire interdites ?

8 réponses
Avatar
Erwann
Imaginons que j'aie du code qui ressemble a ca :

char *data ;
data = "Bonjour" ;

En general, ca va marcher vu la tres faible quantite d'octets
necessaires. Le probleme c'est que lorsqu'on commence a travailler
avec des mallocs, il arrive qu'on se plante et que le programme
aussi d'ailleurs, en faisant une erreur de segmentation.

Le probleme qui arrive alors est de localiser la source de
l'erreur, qui n'apparait pas forcement lors de l'execution la ou
le code est defaillant.

Existe-t-il quelque chose (peut-etre une option dans gcc) qui
stoperait le programme (comme une erreur de segmentation) mais
immediatement, des lors que le programme veut ecrire dans une zone
non reservee par le malloc, meme si en pratique cette zone n'est
pas affectee (et que ca peut donc marcher des fois) ? La localisation
de l'erreur en serait plus facile.

--
Erwann

8 réponses

Avatar
Emmanuel Delahaye
Erwann a formulé la demande :
Imaginons que j'aie du code qui ressemble a ca :

char *data ;
data = "Bonjour" ;


Dangereux. Je recommande :

char const *data ;
data = "Bonjour" ;

car une chaine litéralle n'est pas modifiable (pour être simple).

En general, ca va marcher vu la tres faible quantite d'octets
necessaires. Le probleme c'est que lorsqu'on commence a travailler
avec des mallocs, il arrive qu'on se plante et que le programme
aussi d'ailleurs, en faisant une erreur de segmentation.


C'est pas normal. Le programme est buggé, il faut le corriger. C'est
tout.

Le probleme qui arrive alors est de localiser la source de
l'erreur, qui n'apparait pas forcement lors de l'execution la ou
le code est defaillant.


Ben oui. Faut débugger, tracer, tester, vérifier... C'est un métier. On
appelle ça 'programmeur'.

Existe-t-il quelque chose (peut-etre une option dans gcc) qui
stoperait le programme (comme une erreur de segmentation) mais
immediatement, des lors que le programme veut ecrire dans une zone
non reservee par le malloc, meme si en pratique cette zone n'est
pas affectee (et que ca peut donc marcher des fois) ? La localisation
de l'erreur en serait plus facile.


En gros, tu écris du code buggé, et tu comptes sur le compilateur pour
t'indiquer où sont les bugs? T'es payé pour faire quoi au juste ?

Pourquoi ne pas écrire du code non buggé tout de suite ? Le code est-il
suffisament modulaire pour qu'on puisse le tester par modules (tests
unitaires).

Les principales causes de bug sont

- Utilisation d'un pointeur non initialisé ou NULL
- Débordement de tableau.

Il faut travailler là-dessus.

--


Emmanuel

Avatar
gdm
Emmanuel Delahaye wrote:
Erwann a formulé la demande :
Imaginons que j'aie du code qui ressemble a ca :

char *data ;
data = "Bonjour" ;


Dangereux. Je recommande :

char const *data ;
data = "Bonjour" ;

car une chaine litéralle n'est pas modifiable (pour être simple).


si ce meme programmme est lancé deux fois simultanément, "Bonjour" sera-t-il
une seul fois en mémoire ou bien deux fois?

--
gdm
sites liberaux et sites libertariens:
http://www.liberalia.com
http://www.catallaxia.org


Avatar
Emmanuel Delahaye
gdm a formulé la demande :
char const *data ;
data = "Bonjour" ;

si ce meme programmme est lancé deux fois simultanément,



Rien de tel en C standard. Pour du vrai simultané, il faut au moins 2
processeurs et le système qui va avec. Pour du pseudo simultané
(multithread mono-processeur), il faut le système qui va bien. Rien à
voir avec le langage C.

"Bonjour" sera-t-il
une seul fois en mémoire ou bien deux fois?


Oui, non, peut être... Ca dépend totalement du système.

--


Emmanuel


Avatar
Antoine Leca
En 40fe571d$0$307$, gdm va escriure:
si ce meme programmme est lancé deux fois simultanément, "Bonjour"
sera-t-il une seul fois en mémoire ou bien deux fois?


Impossible à dire. En fait, tu peux même avoir des implémentations où il
sera présent une seule fois... jusqu'au moment (où on écrit dans la chaîne)
où il deviendra présent deux fois !

Et pour être encore plus caustique, avec les objets partagés "à la SunOS",
tu peux même avoir trois copies en mémoire (une copie "originale", protégée
en lecture, et deux copies de travail).


Antoine

Avatar
Alexandre Bacquart
Erwann wrote:

Imaginons que j'aie du code qui ressemble a ca :

char *data ;
data = "Bonjour" ;

En general, ca va marcher vu la tres faible quantite d'octets
necessaires. Le probleme c'est que lorsqu'on commence a travailler
avec des mallocs, il arrive qu'on se plante et que le programme
aussi d'ailleurs, en faisant une erreur de segmentation.

Le probleme qui arrive alors est de localiser la source de
l'erreur, qui n'apparait pas forcement lors de l'execution la ou
le code est defaillant.


Je te vois venir...

Existe-t-il quelque chose (peut-etre une option dans gcc) qui
stoperait le programme (comme une erreur de segmentation) mais
immediatement, des lors que le programme veut ecrire dans une zone
non reservee par le malloc, meme si en pratique cette zone n'est
pas affectee (et que ca peut donc marcher des fois) ? La localisation
de l'erreur en serait plus facile.


Perso, j'attend toujours une option du compilateur pour qu'il me dise
mon avenir... m'enfin -fbounds-check de gcc et autres Valgrind dont il
est question un peu plus loin dans ce forum devraient t'aider.



--
Tek

Avatar
Erwann
In article <40fe6b4f$0$4208$, Alexandre Bacquart wrote:
de l'erreur en serait plus facile.


Perso, j'attend toujours une option du compilateur pour qu'il me dise
mon avenir... m'enfin -fbounds-check de gcc et autres Valgrind dont il
est question un peu plus loin dans ce forum devraient t'aider.

Merci pour Valgrind, je vais jeter un oeil.



Avatar
Erwann
In article , Emmanuel Delahaye wrote:
Erwann a formulé la demande :
Imaginons que j'aie du code qui ressemble a ca :

char *data ;
data = "Bonjour" ;


Dangereux. Je recommande :

char const *data ;
data = "Bonjour" ;

car une chaine litéralle n'est pas modifiable (pour être simple).

En general, ca va marcher vu la tres faible quantite d'octets
necessaires. Le probleme c'est que lorsqu'on commence a travailler
avec des mallocs, il arrive qu'on se plante et que le programme
aussi d'ailleurs, en faisant une erreur de segmentation.


C'est pas normal. Le programme est buggé, il faut le corriger. C'est
tout.


Ah bon ? Le programme est bugge ? Ca alors, je ne m'en etais pas
apercu dis-donc !

Le probleme qui arrive alors est de localiser la source de
l'erreur, qui n'apparait pas forcement lors de l'execution la ou
le code est defaillant.


Ben oui. Faut débugger, tracer, tester, vérifier... C'est un métier. On
appelle ça 'programmeur'.


Tu m'apprends beaucoup de choses dis-moi.

Existe-t-il quelque chose (peut-etre une option dans gcc) qui
stoperait le programme (comme une erreur de segmentation) mais
immediatement, des lors que le programme veut ecrire dans une zone
non reservee par le malloc, meme si en pratique cette zone n'est
pas affectee (et que ca peut donc marcher des fois) ? La localisation
de l'erreur en serait plus facile.


En gros, tu écris du code buggé, et tu comptes sur le compilateur pour
t'indiquer où sont les bugs? T'es payé pour faire quoi au juste ?


Je parlais _eventuellement_ d'une option du compilateur mais ca peut
tres bien etre autre chose (cf. Valgrind par exemple). Je ne suis pas
paye, je me permets donc de poser des questions debiles.

Pourquoi ne pas écrire du code non buggé tout de suite ? Le code est-il
suffisament modulaire pour qu'on puisse le tester par modules (tests
unitaires).

Les principales causes de bug sont

- Utilisation d'un pointeur non initialisé ou NULL
- Débordement de tableau.

Je sais bien ce qui peut faire bugger un programme, ce n'etait pas ma

question.

--
Erwann


Avatar
Erwann
In article , Erwann wrote:
Imaginons que j'aie du code qui ressemble a ca :

char *data ;
data = "Bonjour" ;
[...]


Apres quelques recherches, je suis egalement tombe sur Electric Fence
qui a l'air de bien correspondre a ce que je cherche. Aux yeux de
certains, je demandais quelque chose d'impossible. Pourtant si
ces outils existent, je prefere m'en servir plutot que de passer
des heures sur un debugger pour une erreur triviale mais noyee
dans le code.

Les gens qui m'ont repondu sont certainement nes en connaissant
deje tout du C, mais ce n'est pas mon cas. Mea culpa aussi, j'aurais
du consulter le thread commence le 30 juin qui parle exactement
de la meme chose. Merci aussi a Alexandre pour les pistes proposees.

--
Erwann