Segfault для недопустимой длинной опции

У меня есть следующий код:

struct option longopts[] =
  {
    {"version", no_argument, 0, 'v'}
  };

if (argc > 1)
  {
    int c;
    int longindex;
    while ((c = getopt_long (argc, argv, "v", longopts, &longindex)) != -1)
      {
        switch (c)
          {
          case 'v':
            puts (VERSION_INFO);
            exit (0);

          case '?':
            exit (1);
          }
      }
  }

Почему аргумент --versio (преднамеренно написанный с ошибкой) вызовет segfault, а -a (который также является недопустимым параметром) просто выводит на экран сообщение «недопустимый параметр»?


person 2mac    schedule 20.06.2015    source источник


Ответы (1)


Вы должны завершить массив longopts записью, состоящей только из нулей, иначе getopt_long не знает, когда он заканчивается. Ваш код дает сбой, потому что getopt_long просто перебирает случайную память в этот момент, потому что он упал с конца longopts.

struct option longopts[] =
  {
    {"version", no_argument, NULL, 'v'},
    {NULL, 0, NULL, 0}
  };
person Ewan Mellor    schedule 20.06.2015