optimisation vs securite
  Home FAQ Contact Sign in
fr.comp.lang.c only
 
Advanced search
POPULAR GROUPS

more...

fr.comp.lang.c Profile…
 Up
optimisation vs securite         


Author: Thierry B.
Date: May 7, 2008 04:09

Bonjour les codeurz...

En me promenant dans le grand ouèbe mondial, je suis tombé sur
cet article: http://lwn.net/Articles/278137/ qui évoque des
problèmes de potentiels buffer-overflow quand Gcc (et d'autres)
optimisent un peu trop sur certaines condition/tests.

Certains commentaires sont assez bons :)

tTh.

--
Une cinquième astuce pour pas passer pour une imbécile sur usenet : Ne
jamais hésiter à donner dans l'auto-dérision.
--{ SC, in fr.misc.divers }--
18 Comments
Re: optimisation vs securite         


Author: Xavier Roche
Date: May 7, 2008 05:00

Thierry B. a écrit :
> problèmes de potentiels buffer-overflow quand Gcc (et d'autres)
> optimisent un peu trop sur certaines condition/tests.

De toute manière, c'est le test + l'extérieur> qui est potentiellement dangereux.

C'est le cas classique dans beaucoup (trop) de "parseurs" d'objets
structurés (fichiers GIF, PNG, documents divers, etc.) qui ont souvent
une structure du genre:
Show full article (1.31Kb)
no comments
Re: optimisation vs securite         


Date: May 7, 2008 06:47

Dans l'article <48f8f5-cvo.ln1@prout.stex>,
Thierry B. écrit:
> En me promenant dans le grand ouèbe mondial, je suis tombé sur
> cet article: http://lwn.net/Articles/278137/ qui évoque des
> problèmes de potentiels buffer-overflow quand Gcc (et d'autres)
> optimisent un peu trop sur certaines condition/tests.

Je ne pense pas que "This behavior is allowed by the C standard,
which states that, in a correct program, pointer addition will not
yield a pointer value outside of the same object." soit correct,
surtout que cette phrase ne précise pas de quel objet il s'agit.
Par exemple, je pense que le programme suivant est correct bien
que l'on sorte de l'objet v.b, puisqu'on est aussi dans l'objet v,
qui peut être assimilé à un tableau de caractères:

#include

int main (void)
{
struct { char a[8], b[8]; } v;
char *p;
Show full article (1.36Kb)
no comments
Re: optimisation vs securite         


Author: Marc Espie
Date: May 8, 2008 02:35

In article <48f8f5-cvo.ln1@prout.stex>,
Thierry B. wrote:
>Bonjour les codeurz...
>
>En me promenant dans le grand ouèbe mondial, je suis tombé sur
>cet article: http://lwn.net/Articles/278137/ qui évoque des
>problèmes de potentiels buffer-overflow quand Gcc (et d'autres)
>optimisent un peu trop sur certaines condition/tests.

Ca fait un moment que le zele des constructeurs de compilateurs a faire
des trucs qui vont le plus vite possible aux benchmarks posent quelques
problemes aux programmes reels.

Le chiendent, c'est que certains tests et certaines instructions, rajoutees
pour securiser du code, ne font pas forcement partie des `defined behavior'.

C, initialement, c'est cense etre un assembleur portable. Ca veut entre
autres dire qu'il y a des bouts qui sont censes etre dependants de
l'architecture. Lorsque GCC cesse de fournir des constructions supplementaires
propres pour traiter ces cas en plus, ou ne possede pas une representation
fiable de l'archi en question, ca commence a merder.
Show full article (2.07Kb)
no comments
Re: optimisation vs securite         


Author: Thierry B.
Date: May 8, 2008 03:25

--{ Vincent Lefevre a plopé ceci: }--
> Par exemple, je pense que le programme suivant est correct bien
> que l'on sorte de l'objet v.b, puisqu'on est aussi dans l'objet v,
> qui peut être assimilé à un tableau de caractères:

C'est un peu capillotracté, ton raisonnement...
> #include
>
> int main (void)
> {
> struct { char a[8], b[8]; } v;
> char *p;
>
> p = &v.b[0];
> printf ("%%p\n", (void *) p);
> p--;

Je n'aime pas trop cette décrémentation. Un bon compilo/lint
arriverait-il à la détecter ?
Show full article (0.68Kb)
no comments
Re: optimisation vs securite         


Date: May 8, 2008 04:58

Dans l'article ,
Thierry B. écrit:
> --{ Vincent Lefevre a plopé ceci: }--
>> Par exemple, je pense que le programme suivant est correct bien
>> que l'on sorte de l'objet v.b, puisqu'on est aussi dans l'objet v,
>> qui peut être assimilé à un tableau de caractères:
> C'est un peu capillotracté, ton raisonnement...

Pourtant les fonctions du style memcpy font ce genre de chose.

--
Vincent Lefèvre vinc17.org> - Web: <http://www.vinc17.org/>
100%% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
no comments
Re: optimisation vs securite         


Date: May 8, 2008 05:22

Dans l'article biggoron.nerim.net>,
Marc Espie écrit:
> Ca fait un moment que le zele des constructeurs de compilateurs a faire
> des trucs qui vont le plus vite possible aux benchmarks posent quelques
> problemes aux programmes reels.

Il n'y a pas que les benchmarks, il y a aussi des programmes réels.
Même si certaines optimisations peuvent sembler inutiles pour certains
programmes, elles peuvent être importantes pour d'autres.
> Le chiendent, c'est que certains tests et certaines instructions, rajoutees
> pour securiser du code, ne font pas forcement partie des `defined behavior'.

Dans la mesure où un programme se base sur un undefined behavior,
il ne peut y avoir aucune sécurité. Un compilateur peut toujours
décrire comment ça se comporte ou avoir des options du style -fwrap,
mais alors ce n'est plus portable.

Note: j'ai déjà vu du code supposer que toutes les variables (y compris
automatiques) étaient initialisées à 0. Ça risque de poser des problèmes
de performance si GCC doit supposer cela.
Show full article (2.21Kb)
no comments
Re: optimisation vs securite         


Author: Pierre Maurette
Date: May 8, 2008 09:46

Vincent Lefevre, le 08/05/2008 a écrit :

[...]
> Est-ce qu'avec des casts avec volatile seulement dans certains cas,
> cela serait une solution acceptable?

Dans une implémentation raisonnable de volatile [cui cui] que peut-on
attendre de:

#include
#include

int main(void)
{
int a, b, c, test; /* non volatile data*/
(volatile void)test;
(volatile void)(a = 0);
(volatile void)(b = 5);
(volatile void)(c = 10);
(volatile void)(a = b + c);
printf("%%d\n", a);
return EXIT_SUCCESS;
}
Show full article (0.82Kb)
no comments
Re: optimisation vs securite         


Author: Marc Espie
Date: May 8, 2008 15:58

In article ,
Pierre Maurette wrote:
>
>En fait le C est portable et justement ne peut être un "assembleur
>portable".

Sauf que, historiquement, le C est d'abord un assembleur portable.
C'est bien de mettre des regles dans la norme, mais lorsque le compilateur
devient trop agressif, le code C historique ne marche plus.

Et vous pourrez toujours dire `oui, mais c'est pas propre', il y a des
coins du systeme ou c'est un sacre casse-tete a corriger...
no comments
Re: optimisation vs securite         


Date: May 8, 2008 16:44

Dans l'article ,
Pierre Maurette écrit:
> int main(void)
> {
> int a, b, c, test; /* non volatile data*/
> (volatile void)test;

(volatile void), ça a un sens? J'aurais plutôt écrit:

(void) (volatile int) test;
> (volatile void)(a = 0);

Et là j'aurais écrit:

* (volatile int *) &a = 0;

et ainsi de suite.

Maintenant, concernant le code suivant:
Show full article (1.49Kb)
no comments

RELATED THREADS
SubjectArticles qty Group
[fr.comp.securite] [Annonce] Changement de fonctionnement de la moderation du forum fr.comp.securitealt.fr.securite.panoplie ·
1 2