Otras respuestas han citado el estándar C y muestran que argv[0]
y pueden ser NULL
o pueden ser la cadena vacía (""
). Debe escribir su programa con la suposición de que esto puede suceder, porque de lo contrario está creando un (pequeño) riesgo de seguridad. Es fácil invocar su programa y establecer argv
a cualquier cosa que desee un atacante. Como prueba, considere los siguientes dos programas. La primera de ellas, echoargv.c
imprime el contenido de argv
:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int i;
for (i = 0; i < argc; ++i)
printf("argv[%d] = \"%s\"\n", i, argv[i]);
exit(0);
}
El segundo, argv0
, invoca a cualquier otro programa y permite al usuario especificar la otra argv del programa:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
(void) execv(argv[1], argv+2);
perror("execv");
exit(1);
}
(Esta es una .-ambientes POSIX específica versión no estándar pueden necesitar cambios)
Aquí es cómo usarlos:.
$ gcc -o echoargv echoargv.c
$ gcc -o argv0 argv0.c
$ ./argv0 ./echoargv
$ ./argv0 ./echoargv ''
argv[0] = ""
$ ./argv0 ./echoargv 'this is fun' 'it is fun indeed'
argv[0] = "this is fun"
argv[1] = "it is fun indeed"
$
La primera ejecución de argv0
establece que echoargv
's argv[0]
es NULO. La segunda ejecución hace que sea la cadena vacía. La tercera ejecución es simplemente por diversión: tenga en cuenta que argv[0]
no necesita tener nada que ver con el nombre real del programa.
¿Cómo te puede morder?Si, por ejemplo, que a ciegas imprimir el nombre de su programa en un mensaje de uso:
printf("usage: %s [options] [FILE]...\n", argv[0]);
Mejor:
const char *program_name = "some default name"; /* (global) variable */
if (argv[0] && argv[0][0])
program_name = argv[0];
printf("usage: %s [options] [FILE]...\n", program_name);
Si no hace esto, un atacante puede hacer que su programa para segfault a voluntad, o puede hacer que su programa informe cosas completamente incorrectas al usuario.
¿Por qué no diseñar su programa para que funcione independientemente? O use una afirmación de tiempo de ejecución. – tangrs
Mejor llamarlo una cadena vacía; cadena nula se puede confundir fácilmente con un puntero nulo. –
@JonathanLeffler: Editado –