Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/05/2009, à 08:44

Nozh4ck

Erreur de compilation avec Gcc

Bonjour tout le monde, j'apprend a programmer
et j'ai une erreur de compilation bizarre sur la compilation d'un programme "simple" en C.

gcc -g test.c
test.c: In function ‘main’:
test.c:8: attention : le format n'est pas une chaîne littérale et pas d'argument de format

Le programme en lui meme fait 9 ligne.

#include <stdio.h>
#include <string.h>
int main()
{
char str_a[20];
strcpy(str_a, "Hello, world !\n");
printf(str_a);
}

J'utilise la 8.10 d'ubuntu en 64 bits.

#2 Le 22/05/2009, à 08:55

nicolas.sitbon

Re : Erreur de compilation avec Gcc

remplace ton printf() par

fputs(str_a, stdout);

Hors ligne

#3 Le 22/05/2009, à 09:00

geenux

Re : Erreur de compilation avec Gcc

#include <stdio.h>
#include <string.h>
int main()
{
    char str_a[20];
    strcpy(str_a, "Hello, world !\n");
    printf("%s",str_a);
}

Hors ligne

#4 Le 22/05/2009, à 09:08

nicolas.sitbon

Re : Erreur de compilation avec Gcc

geenux a écrit :
#include <stdio.h>
#include <string.h>
int main()
{
    char str_a[20];
    strcpy(str_a, "Hello, world !\n");
    printf("%s",str_a);
}

L'usage d'une fonction d'entrée/sortie formatée, avec une chaîne non formaté est injustifié.

Hors ligne

#5 Le 22/05/2009, à 09:18

nozh4ck

Re : Erreur de compilation avec Gcc

cool, merci tout les 2.
ca marche !

ouai logique pour la chaine de caractère '%s', c'est vrai qu'il manquait un truc :s

et j'aurais découvert une fonction en c++ que je connaissais pas,

sympa, bonne journée.

#6 Le 22/05/2009, à 09:34

nozh4ck

Re : Erreur de compilation avec Gcc

dsl du double post et des conneries écrites a ma derniere réponse, je fait des recherche google en meme temps tongue.

L'usage d'une fonction d'entrée/sortie formatée, avec une chaîne non formaté est injustifié.

hmm, y a pas une autre methode "plus justifier" en restant sur la fonction "printf"?

#7 Le 22/05/2009, à 09:39

nicolas.sitbon

Re : Erreur de compilation avec Gcc

nozh4ck a écrit :

dsl du double post et des conneries écrites a ma derniere réponse, je fait des recherche google en meme temps tongue.

L'usage d'une fonction d'entrée/sortie formatée, avec une chaîne non formaté est injustifié.

hmm, y a pas une autre methode "plus justifier" en restant sur la fonction "printf"?

Pourquoi veux tu absolument utiliser printf()?

Hors ligne

#8 Le 22/05/2009, à 17:58

n0z

Re : Erreur de compilation avec Gcc

Je souhaite conserver la fonction printf(), car j'apprend a programmer a partir d'un livre,
ou je devrais debugger le programme a partir de gdb pour observer le déroulement du programme.

Je pourrais certe me passer de la fonction printf() pour fputs(x, stdout), mais bon...
en faite, durant tout le livre (490page ^^), il n'y a aucune référence a fputs, et ca changerais une bonne partie des programme du bouquin.

Le problème en faite, c'est qu'avec feisty (7.04), la compilation du programme ne pose aucun problème, est-ce-que ca ne serait pas un problème de lib manquante ou une faille corrigée?

#9 Le 22/05/2009, à 18:01

Link31

Re : Erreur de compilation avec Gcc

test.c:8: attention : le format n'est pas une chaîne littérale et pas d'argument de format

Je ne savais pas que GCC produisait ce genre d'avertissement, mais c'est une très bonne chose. printf(variable) est généralement une faille de sécurité monumentale.

Hors ligne

#10 Le 22/05/2009, à 18:44

n0z

Re : Erreur de compilation avec Gcc

Link31 a écrit :

test.c:8: attention : le format n'est pas une chaîne littérale et pas d'argument de format

Je ne savais pas que GCC produisait ce genre d'avertissement, mais c'est une très bonne chose. printf(variable) est généralement une faille de sécurité monumentale.

en quoi 'printf(variable)' est-il une faille de securité, j'aime bien comprendre le pourquoi du comment et adorerais profité de tes lumières^^ meme si aparemment, ce souci n'est plus a jour.

Est-ce que ca permettrais l'affichage de l'adresse memoire contenant 'Hello, world !' grace a un pointeur, et de pouvoir être modifiable a partir du language ASM? ou de pouvoir y injecter du shell ou? ou encore une faille face a un débordement de tampon? (ou, ou, ou tongue) (ou un HS de novice?).

et en quoi fputs(x, stdout) est t-il + sécurisable?

PS: dsl si il y a trop de HS (et que ca brule les yeux de certains), j'essaie simplement de comprendre...

#11 Le 22/05/2009, à 18:56

Link31

Re : Erreur de compilation avec Gcc

Si l'utilisateur a la possibilité de mettre des chaînes de format dans "variable", printf() va aller chercher sur la pile des paramètres qui n'existent pas. Bref, l'utilisateur pourra explorer la pile et même modifier comme il le veut le comportement du programme en écrasant les adresses de retour (avec %n notamment). À moins d'être absolument certain que la variable ne pourra pas être influencée par l'utilisateur, c'est une faille de sécurité.
D'ailleurs, c'est indiqué dans "man 3 printf".

Hors ligne

#12 Le 18/02/2012, à 13:08

Troumad

Re : Erreur de compilation avec Gcc

Une petite remarque...
C'est une spécificité Ubuntu ! Je viens de découvrir ce bug en testant sous ubuntu mon programme qui ne faisait pas ce warning sous Mageia 2 !
http://troumad.org/Mes_regles/perso_ubuntu.zip (avec gtk3 pour ADD1 ou ADD2).


Amicalement vOOotre
A visiter sur http://troumad.org ou http://troumad.developpez.com

Hors ligne

#13 Le 18/02/2012, à 21:21

grim7reaper

Re : Erreur de compilation avec Gcc

Ce n’est pas un bug !
C’est un avertissement du compilateur qui indique une potentielle faille grosse comme une maison.

Hors ligne

#14 Le 18/02/2012, à 21:40

Troumad

Re : Erreur de compilation avec Gcc

Je pensais plutôt à un bug de mon programme !
Je n'avais pas remarqué dans les propriétés des fonctions que j'utilise que les derniers arguments sont comme un printf.
Donc si la chaîne contient un formateur, la fonction peut donner des résultats renversants qui peuvent mettre sans dessus-dessous le programme.


Amicalement vOOotre
A visiter sur http://troumad.org ou http://troumad.developpez.com

Hors ligne

#15 Le 27/02/2012, à 18:16

Haleth

Re : Erreur de compilation avec Gcc

#include <stdio.h>
#include <string.h>
int main(void)[b]{[/b]
    char str_a[20];
    strcpy(str_a, "Hello, world !");
    fprintf(stdout, "%s\n", str_a);
    [b]return(EXIT_SUCCESS);[/b]
}

Moi je verai plutôt un code comme ceci.


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#16 Le 27/02/2012, à 18:48

Troumad

Re : Erreur de compilation avec Gcc

Pou mieux comprendre l'intérêt d'un "%s", autant prendre un code comme ça :

strcpy(str_a,"Un joli pour-cent c saut de ligne : %%c\\n");

Dernière modification par Troumad (Le 27/02/2012, à 18:48)


Amicalement vOOotre
A visiter sur http://troumad.org ou http://troumad.developpez.com

Hors ligne