Segfault for invalid long option

823 views Asked by At

I have the following code:

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);
          }
      }
  }

Why is it with an argument of --versio (intentionally misspelled) would cause a segfault but -a (which is also an invalid option) just prints an "invalid option" message to the screen?

1

There are 1 answers

0
Ewan Mellor On BEST ANSWER

You have to terminate the longopts array with an entry that is all zeros, otherwise getopt_long doesn't know when it ends. Your code is crashing because getopt_long is just iterating through random memory at that point because it has fallen off the end of longopts.

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