GNT sans publicité, site mobile, fonctionnalitées exclusives...

[gcc] option pour prevenir les ecritures memoire interdites ?

Le
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
Lire les 8 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Emmanuel Delahaye
Le #673315
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

gdm
Le #673312
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


Emmanuel Delahaye
Le #673073
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


Antoine Leca
Le #673072
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

Alexandre Bacquart
Le #673067
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

Publicité
Suivre les réponses
Poster une réponse
Anonyme