Pages : 1
#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
#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 .
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
dsl du double post et des conneries écrites a ma derniere réponse, je fait des recherche google en meme temps .
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
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 ) (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