c - Why does popt segfault when a string is too short? -
why popt segfaulting when argdescrip
string isn't long enough?
take following example:
#include <popt.h> struct poptoption options[] = { popt_autohelp { .longname = "color", .shortname = '\0', .arginfo = popt_arg_string | popt_argflag_optional | popt_argflag_show_default, .arg = (void*) "auto", .val = 1, .descrip = "whether or not use colored output", .argdescrip = "always|never|auto (checks if tty)" }, popt_tableend }; int main(int argc, const char** argv) { // popt context poptcontext ctx = poptgetcontext( "program", argc, argv, options, popt_context_posixmeharder); // parse poptgetnextopt(ctx); return 0; }
the above segfaults:
/tmp$ ./a.out --help usage: a.out [option...] [1] 47468 segmentation fault ./a.out --help
although changing .argdescrip
to
.argdescrip = "always|never|auto (checks if tty) " "........................................."
popt happily accepts , displays output:
/tmp$ ./a.out --help usage: a.out [option...] --color[=always|never|auto (checks if tty) .........................................] whether or not use colored output options: -?, --help show message --usage display brief usage message
what gives? missing in c spec? popt man pages don't specify required length. bug?
your problem else. have set arg
member constant string while have needed set pointer such (the man page says, arg should initialized pointer char *
). program dies while trying dereference pointer isn't one.
try this:
char *garg = "auto"; struct poptoption options[] = { popt_autohelp { .longname = "color", .shortname = '\0', .arginfo = popt_arg_string | popt_argflag_optional | popt_argflag_show_default, .arg = &garg, .val = 1, .descrip = "whether or not use colored output", .argdescrip = "always|never|auto (checks if tty)" }, popt_tableend };