Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que l'on
doit concatener plus de deux chaines... En gros je cherche un equivalent
a ce que l'on trouve sur java ou c++, un truc simple du style
"char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que l'on
doit concatener plus de deux chaines... En gros je cherche un equivalent
a ce que l'on trouve sur java ou c++, un truc simple du style
"char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que l'on
doit concatener plus de deux chaines... En gros je cherche un equivalent
a ce que l'on trouve sur java ou c++, un truc simple du style
"char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que
l'on doit concatener plus de deux chaines... En gros je cherche un
equivalent a ce que l'on trouve sur java ou c++, un truc simple du
style "char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que
l'on doit concatener plus de deux chaines... En gros je cherche un
equivalent a ce que l'on trouve sur java ou c++, un truc simple du
style "char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que
l'on doit concatener plus de deux chaines... En gros je cherche un
equivalent a ce que l'on trouve sur java ou c++, un truc simple du
style "char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que
l'on doit concatener plus de deux chaines... En gros je cherche un
equivalent a ce que l'on trouve sur java ou c++, un truc simple du
style "char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que
l'on doit concatener plus de deux chaines... En gros je cherche un
equivalent a ce que l'on trouve sur java ou c++, un truc simple du
style "char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que
l'on doit concatener plus de deux chaines... En gros je cherche un
equivalent a ce que l'on trouve sur java ou c++, un truc simple du
style "char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que
l'on doit concatener plus de deux chaines... En gros je cherche un
equivalent a ce que l'on trouve sur java ou c++, un truc simple du
style "char1"+"char2"+char3" -> "char1char2char3".
char* concat = malloc(CONCATMAX);
snprintf(concat, CONCATMAX, "%s %s %s %s", chaine1, chaine2, chaine3,
chaine4);
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que
l'on doit concatener plus de deux chaines... En gros je cherche un
equivalent a ce que l'on trouve sur java ou c++, un truc simple du
style "char1"+"char2"+char3" -> "char1char2char3".
char* concat = malloc(CONCATMAX);
snprintf(concat, CONCATMAX, "%s %s %s %s", chaine1, chaine2, chaine3,
chaine4);
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que
l'on doit concatener plus de deux chaines... En gros je cherche un
equivalent a ce que l'on trouve sur java ou c++, un truc simple du
style "char1"+"char2"+char3" -> "char1char2char3".
char* concat = malloc(CONCATMAX);
snprintf(concat, CONCATMAX, "%s %s %s %s", chaine1, chaine2, chaine3,
chaine4);
Enfin, il y a la solution utilise asprintf (libc GNU) ou
g_strdup_printf (GLib) qui fonctionne comme snprintf mais alloue
automatiquement la taille nécessaire.
Enfin, il y a la solution utilise asprintf (libc GNU) ou
g_strdup_printf (GLib) qui fonctionne comme snprintf mais alloue
automatiquement la taille nécessaire.
Enfin, il y a la solution utilise asprintf (libc GNU) ou
g_strdup_printf (GLib) qui fonctionne comme snprintf mais alloue
automatiquement la taille nécessaire.
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que l'on
doit concatener plus de deux chaines... En gros je cherche un equivalent
a ce que l'on trouve sur java ou c++, un truc simple du style
"char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que l'on
doit concatener plus de deux chaines... En gros je cherche un equivalent
a ce que l'on trouve sur java ou c++, un truc simple du style
"char1"+"char2"+char3" -> "char1char2char3".
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que l'on
doit concatener plus de deux chaines... En gros je cherche un equivalent
a ce que l'on trouve sur java ou c++, un truc simple du style
"char1"+"char2"+char3" -> "char1char2char3".
Enfin, il y a la solution utilise asprintf (libc GNU) ou
g_strdup_printf (GLib) qui fonctionne comme snprintf mais alloue
automatiquement la taille nécessaire.
Ce serait pas mal d'essayer d'éviter de donner de mauvaises habitudes en
conseillant l'utilisation de fonctions (vraiment) non-standards. Je sais
bien que ces fonctions sont pratiques mais vu qu'elles n'existent
souvent que sur une plateforme unique (Linux et GNU), ce n'est pas
l'idéal.
Enfin, il y a la solution utilise asprintf (libc GNU) ou
g_strdup_printf (GLib) qui fonctionne comme snprintf mais alloue
automatiquement la taille nécessaire.
Ce serait pas mal d'essayer d'éviter de donner de mauvaises habitudes en
conseillant l'utilisation de fonctions (vraiment) non-standards. Je sais
bien que ces fonctions sont pratiques mais vu qu'elles n'existent
souvent que sur une plateforme unique (Linux et GNU), ce n'est pas
l'idéal.
Enfin, il y a la solution utilise asprintf (libc GNU) ou
g_strdup_printf (GLib) qui fonctionne comme snprintf mais alloue
automatiquement la taille nécessaire.
Ce serait pas mal d'essayer d'éviter de donner de mauvaises habitudes en
conseillant l'utilisation de fonctions (vraiment) non-standards. Je sais
bien que ces fonctions sont pratiques mais vu qu'elles n'existent
souvent que sur une plateforme unique (Linux et GNU), ce n'est pas
l'idéal.
Lorsque les fonctions sont ddans une bibliothèque diffusé sous une
license libre, et que tu comptes diffuser le programme sous une
license compatibel, tu peux reprendre le code déjà fait, testé, validé
et optimisé de la libc GNU ou de la GLib, plutôt que de réinventer la
roue à chaque fois.
La mauvaise habitude c'est de toujours tout refaire au lieu de
réutiliser ce qui a déjà été fait. Utiliser une fonction de la libc
GNU, cela implique uniquement de l'inclure dans le programme si on
veut le porter.
Et une autre mauvaise habitude consiste à travailler avec des buffers
de taille fixe (pire, des char buf[SIZE] et bonjour l'exploit au
moindre bug) qui sont la plupart du temps du gachis de mémoire (buffer
trop grand) et le reste du temps des limitations (buffer trop petit).
Prendre l'habitude d'utiliser des fonctions propres (comme celle de
libc GNU), quitte à les inclure ensuite dans le programme c'est
beaucoup plus positif. (et je rappelle à tout le monde que, par
exemple, un nom de fichier ou une URL n'ont _pas_ de taille limite,
pas 512, pas 4096, pas PATHMAX, pas même fpathconf).
Lorsque les fonctions sont ddans une bibliothèque diffusé sous une
license libre, et que tu comptes diffuser le programme sous une
license compatibel, tu peux reprendre le code déjà fait, testé, validé
et optimisé de la libc GNU ou de la GLib, plutôt que de réinventer la
roue à chaque fois.
La mauvaise habitude c'est de toujours tout refaire au lieu de
réutiliser ce qui a déjà été fait. Utiliser une fonction de la libc
GNU, cela implique uniquement de l'inclure dans le programme si on
veut le porter.
Et une autre mauvaise habitude consiste à travailler avec des buffers
de taille fixe (pire, des char buf[SIZE] et bonjour l'exploit au
moindre bug) qui sont la plupart du temps du gachis de mémoire (buffer
trop grand) et le reste du temps des limitations (buffer trop petit).
Prendre l'habitude d'utiliser des fonctions propres (comme celle de
libc GNU), quitte à les inclure ensuite dans le programme c'est
beaucoup plus positif. (et je rappelle à tout le monde que, par
exemple, un nom de fichier ou une URL n'ont _pas_ de taille limite,
pas 512, pas 4096, pas PATHMAX, pas même fpathconf).
Lorsque les fonctions sont ddans une bibliothèque diffusé sous une
license libre, et que tu comptes diffuser le programme sous une
license compatibel, tu peux reprendre le code déjà fait, testé, validé
et optimisé de la libc GNU ou de la GLib, plutôt que de réinventer la
roue à chaque fois.
La mauvaise habitude c'est de toujours tout refaire au lieu de
réutiliser ce qui a déjà été fait. Utiliser une fonction de la libc
GNU, cela implique uniquement de l'inclure dans le programme si on
veut le porter.
Et une autre mauvaise habitude consiste à travailler avec des buffers
de taille fixe (pire, des char buf[SIZE] et bonjour l'exploit au
moindre bug) qui sont la plupart du temps du gachis de mémoire (buffer
trop grand) et le reste du temps des limitations (buffer trop petit).
Prendre l'habitude d'utiliser des fonctions propres (comme celle de
libc GNU), quitte à les inclure ensuite dans le programme c'est
beaucoup plus positif. (et je rappelle à tout le monde que, par
exemple, un nom de fichier ou une URL n'ont _pas_ de taille limite,
pas 512, pas 4096, pas PATHMAX, pas même fpathconf).
char * copier_nom(char * nom)
{
static char * buffer = NULL;
if (buffer == NULL)
buffer = strdup(nom);
else
strcpy(buffer, nom);
return buffer;
}
Bref, il y a une façon assez évidente de faire planter ce code.
char * copier_nom(char * nom)
{
static char * buffer = NULL;
if (buffer == NULL)
buffer = strdup(nom);
else
strcpy(buffer, nom);
return buffer;
}
Bref, il y a une façon assez évidente de faire planter ce code.
char * copier_nom(char * nom)
{
static char * buffer = NULL;
if (buffer == NULL)
buffer = strdup(nom);
else
strcpy(buffer, nom);
return buffer;
}
Bref, il y a une façon assez évidente de faire planter ce code.
Lorsque les fonctions sont ddans une bibliothèque diffusé sous une
license libre, et que tu comptes diffuser le programme sous une
license compatibel, tu peux reprendre le code déjà fait, testé, validé
et optimisé de la libc GNU ou de la GLib, plutôt que de réinventer la
roue à chaque fois.
enfin vu qu'ici, des solutions _standards_ ont déjà été données.
La mauvaise habitude c'est de toujours tout refaire au lieu de
réutiliser ce qui a déjà été fait. Utiliser une fonction de la libc
GNU, cela implique uniquement de l'inclure dans le programme si on
veut le porter.
Effectivement, mais tu m'expliqueras sans doute un jour comment extraire
le code d'une fonction de la GNU libc sans extraire la GNU libc
intégralement.
Et une autre mauvaise habitude consiste à travailler avec des buffers
de taille fixe (pire, des char buf[SIZE] et bonjour l'exploit au
moindre bug) qui sont la plupart du temps du gachis de mémoire (buffer
trop grand) et le reste du temps des limitations (buffer trop petit).
Prendre l'habitude d'utiliser des fonctions propres (comme celle de
libc GNU), quitte à les inclure ensuite dans le programme c'est
beaucoup plus positif. (et je rappelle à tout le monde que, par
exemple, un nom de fichier ou une URL n'ont _pas_ de taille limite,
pas 512, pas 4096, pas PATHMAX, pas même fpathconf).
Hum ... il faut aussi savoir qu'on peut, tout comme pour les buffers de
taille fixe, avoir des problèmes d'exploit sur les buffers de taille
variable : par exemple (de très mauvaise foi) :
char * copier_nom(char * nom)
{
static char * buffer = NULL;
if (buffer == NULL)
buffer = strdup(nom);
else
strcpy(buffer, nom);
return buffer;
}
Bref, il y a une façon assez évidente de faire planter ce code.
En ce qui concerne les limites de taille de nom de fichier définies
par POSIX, elle est réellement PATH_MAX. Allez, un petit peu de
documentation pour aider : (il suffit de s'inscrire pour accéder
aux standards POSIX)
http://www.unix-systems.org/single_unix_specification/
Un 3ème point est qu'accumuler des allocations mémoires pour obtenir une
"meilleure" "sécurité" ne fait qu'aggraver les performances de ton
programmes. Et oui, la présence de malloc() tout le long de l'exécution
n'est pas signe de performance.
Par exemple, en embarqué, ils ne travaillent que sur des données
allouées statiquement, devine pourquoi ? (des indices ont été
données dans la première partie de ce paragraphe).
Le problème du buffer overflow n'est pas que le buffer soit fixe, c'est
savoir comment utiliser judicieusement le buffer qu'on a prévu (par
exemple buffer de taille PATH_MAX fixe) en tenant compte des paramètres
du système (PATH_MAX par exemple).
Au final, si on veut obtenir de la sécurité, il vaut mieux
s'attacher à faire les choses soigneusement (vérifier les codes de
retour des appels susceptibles d'être en faute, par exemple,
malloc(), fopen()) qu'utiliser des faux biais de "sécurité" comme
ceux que tu viens de citer.
Lorsque les fonctions sont ddans une bibliothèque diffusé sous une
license libre, et que tu comptes diffuser le programme sous une
license compatibel, tu peux reprendre le code déjà fait, testé, validé
et optimisé de la libc GNU ou de la GLib, plutôt que de réinventer la
roue à chaque fois.
enfin vu qu'ici, des solutions _standards_ ont déjà été données.
La mauvaise habitude c'est de toujours tout refaire au lieu de
réutiliser ce qui a déjà été fait. Utiliser une fonction de la libc
GNU, cela implique uniquement de l'inclure dans le programme si on
veut le porter.
Effectivement, mais tu m'expliqueras sans doute un jour comment extraire
le code d'une fonction de la GNU libc sans extraire la GNU libc
intégralement.
Et une autre mauvaise habitude consiste à travailler avec des buffers
de taille fixe (pire, des char buf[SIZE] et bonjour l'exploit au
moindre bug) qui sont la plupart du temps du gachis de mémoire (buffer
trop grand) et le reste du temps des limitations (buffer trop petit).
Prendre l'habitude d'utiliser des fonctions propres (comme celle de
libc GNU), quitte à les inclure ensuite dans le programme c'est
beaucoup plus positif. (et je rappelle à tout le monde que, par
exemple, un nom de fichier ou une URL n'ont _pas_ de taille limite,
pas 512, pas 4096, pas PATHMAX, pas même fpathconf).
Hum ... il faut aussi savoir qu'on peut, tout comme pour les buffers de
taille fixe, avoir des problèmes d'exploit sur les buffers de taille
variable : par exemple (de très mauvaise foi) :
char * copier_nom(char * nom)
{
static char * buffer = NULL;
if (buffer == NULL)
buffer = strdup(nom);
else
strcpy(buffer, nom);
return buffer;
}
Bref, il y a une façon assez évidente de faire planter ce code.
En ce qui concerne les limites de taille de nom de fichier définies
par POSIX, elle est réellement PATH_MAX. Allez, un petit peu de
documentation pour aider : (il suffit de s'inscrire pour accéder
aux standards POSIX)
http://www.unix-systems.org/single_unix_specification/
Un 3ème point est qu'accumuler des allocations mémoires pour obtenir une
"meilleure" "sécurité" ne fait qu'aggraver les performances de ton
programmes. Et oui, la présence de malloc() tout le long de l'exécution
n'est pas signe de performance.
Par exemple, en embarqué, ils ne travaillent que sur des données
allouées statiquement, devine pourquoi ? (des indices ont été
données dans la première partie de ce paragraphe).
Le problème du buffer overflow n'est pas que le buffer soit fixe, c'est
savoir comment utiliser judicieusement le buffer qu'on a prévu (par
exemple buffer de taille PATH_MAX fixe) en tenant compte des paramètres
du système (PATH_MAX par exemple).
Au final, si on veut obtenir de la sécurité, il vaut mieux
s'attacher à faire les choses soigneusement (vérifier les codes de
retour des appels susceptibles d'être en faute, par exemple,
malloc(), fopen()) qu'utiliser des faux biais de "sécurité" comme
ceux que tu viens de citer.
Lorsque les fonctions sont ddans une bibliothèque diffusé sous une
license libre, et que tu comptes diffuser le programme sous une
license compatibel, tu peux reprendre le code déjà fait, testé, validé
et optimisé de la libc GNU ou de la GLib, plutôt que de réinventer la
roue à chaque fois.
enfin vu qu'ici, des solutions _standards_ ont déjà été données.
La mauvaise habitude c'est de toujours tout refaire au lieu de
réutiliser ce qui a déjà été fait. Utiliser une fonction de la libc
GNU, cela implique uniquement de l'inclure dans le programme si on
veut le porter.
Effectivement, mais tu m'expliqueras sans doute un jour comment extraire
le code d'une fonction de la GNU libc sans extraire la GNU libc
intégralement.
Et une autre mauvaise habitude consiste à travailler avec des buffers
de taille fixe (pire, des char buf[SIZE] et bonjour l'exploit au
moindre bug) qui sont la plupart du temps du gachis de mémoire (buffer
trop grand) et le reste du temps des limitations (buffer trop petit).
Prendre l'habitude d'utiliser des fonctions propres (comme celle de
libc GNU), quitte à les inclure ensuite dans le programme c'est
beaucoup plus positif. (et je rappelle à tout le monde que, par
exemple, un nom de fichier ou une URL n'ont _pas_ de taille limite,
pas 512, pas 4096, pas PATHMAX, pas même fpathconf).
Hum ... il faut aussi savoir qu'on peut, tout comme pour les buffers de
taille fixe, avoir des problèmes d'exploit sur les buffers de taille
variable : par exemple (de très mauvaise foi) :
char * copier_nom(char * nom)
{
static char * buffer = NULL;
if (buffer == NULL)
buffer = strdup(nom);
else
strcpy(buffer, nom);
return buffer;
}
Bref, il y a une façon assez évidente de faire planter ce code.
En ce qui concerne les limites de taille de nom de fichier définies
par POSIX, elle est réellement PATH_MAX. Allez, un petit peu de
documentation pour aider : (il suffit de s'inscrire pour accéder
aux standards POSIX)
http://www.unix-systems.org/single_unix_specification/
Un 3ème point est qu'accumuler des allocations mémoires pour obtenir une
"meilleure" "sécurité" ne fait qu'aggraver les performances de ton
programmes. Et oui, la présence de malloc() tout le long de l'exécution
n'est pas signe de performance.
Par exemple, en embarqué, ils ne travaillent que sur des données
allouées statiquement, devine pourquoi ? (des indices ont été
données dans la première partie de ce paragraphe).
Le problème du buffer overflow n'est pas que le buffer soit fixe, c'est
savoir comment utiliser judicieusement le buffer qu'on a prévu (par
exemple buffer de taille PATH_MAX fixe) en tenant compte des paramètres
du système (PATH_MAX par exemple).
Au final, si on veut obtenir de la sécurité, il vaut mieux
s'attacher à faire les choses soigneusement (vérifier les codes de
retour des appels susceptibles d'être en faute, par exemple,
malloc(), fopen()) qu'utiliser des faux biais de "sécurité" comme
ceux que tu viens de citer.