2011-07-18 13 views
13

Estoy intentando usar getopt_long_only para analizar una línea de comando. Mi aplicación lee un puñado de opciones de línea de comandos.falla de segmentación getopt_long_only

E.g. "app --alpha = 1 --beta = 2 --cecil = 3"

getopt_long_only funciona bien como se espera siempre que se pasen los parámetros válidos de la línea de comando. Pero si invoca la aplicación con un "solo discontinuo" no válido "opción al final y en otros lugares inapropiados, se produce un bloqueo de fallo seg. ¿Que está pasando aqui? Parece que getopt_long_only no está siendo resistente a los argumentos mal escritos. ¿O estoy invocando la función incorrecta?

Ejemplo:

Código
> ./app --beta=1 -? 
starting 
index = 1 ret=0 optarg=1 
Segmentation fault 

abajo (C++: app.cc)

#include <stdio.h> 
#include <getopt.h> 

void ProcessCommandLineArgs(int argc, char** argv) 
{ 

    option longopts[] = { 
     {"alpha", optional_argument, 0, 0}, 
     {"beta", optional_argument, 0, 0}, 
     {"cecil", optional_argument, 0, 0} 
    }; 

    int index; 
    int ret; 
    bool fParseError = false; 

    while (true) 
    { 
     ret = ::getopt_long_only(argc, argv, "", longopts, &index); 

     if (ret < 0) 
     { 
      break; 
     } 

     if ((ret == '?') || (ret == ':')) 
     { 
      fParseError = true; 
      break; 
     } 

     printf("index = %d ret=%d optarg=%s\n", index, ret, optarg?optarg:"<null>"); 
    } 
} 

int main(int argc, char** argv) 
{ 
    printf("starting\n"); 
    ProcessCommandLineArgs(argc, argv); 
    printf("exiting\n"); 
    return 0; 
} 
+1

¿Todavía se cuelga si cambia 'int index;' a 'int index = 0' ;? – OneOfOne

+0

Gracias 1of1. De hecho, dejó de estrellarse cuando lo hice. Lo cual no tiene sentido ... así que hice una inmersión más profunda en la página del manual. Eso me llevó a descubrir que me estaba olvidando de cancelar correctamente la última fila del conjunto. – selbie

Respuesta

17

I encontrado el problema.

Olvidé tener una "fila cero" al final de mi declaración de conjunto de opciones.

option longopts[] = { 
    {"alpha", optional_argument, 0, 0}, 
    {"beta", optional_argument, 0, 0}, 
    {"cecil", optional_argument, 0, 0}, 
    {NULL, 0, 0, 0} 
}; 
Cuestiones relacionadas