13.7.1 Un semplice programma in C (gcc
)
Un semplice esempio di compilazione di example.c
, con una libreria
libm
in un eseguibile run_example
:
$ cat > example.c << EOF
#include <stdio.h>
#include <math.h>
#include <string.h>
int main(int argc, char **argv, char **envp){
double x;
char y[11];
x=sqrt(argc+7.5);
strncpy(y, argv[0], 10); /* prevent buffer overflow */
y[10] = '\0'; /* fill to make sure string ends with '\0' */
printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]);
return 0;
}
EOF
$ gcc -Wall -g -o run_example example.c -lm
$ ./run_example
1, 2.915, ./run_exam, (null)
$ ./run_example 1234567890qwerty
2, 3.082, ./run_exam, 1234567890qwerty
Qui, -lm � necessario per il collegamento della
libreria libm per sqrt()
. La
libreria vera � in /lib
con il nome libm.so.6
,
collegamento simbolico a libm-2.1.3.so
.
Guardate l'ultimo parametro nel testo risultante. Ci sono pi� di 10 caratteri,
anche se viene specificato %10s.
L'uso di puntatori di funzioni che richiedano operazioni in memoria senza
controlli sui loro "confini", tipo sprintf
e
strcpy
, non � considerato sufficiente a prevenire gli effetti di
exploit tipo buffer overflow, che annullano gli effetti di overrun.
Utilizzate, invece, snprintf
e strncpy
.