为什么当字符串太短时会出现段错误?
Why does popt segfault when a string is too short?
当 argDescrip
字符串不够长时,为什么 popt 会出现段错误?
举个例子:
#include <popt.h>
struct poptOption options[] = {
POPT_AUTOHELP
{
.longName = "color",
.shortName = '[=10=]',
.argInfo = POPT_ARG_STRING
| POPT_ARGFLAG_OPTIONAL
| POPT_ARGFLAG_SHOW_DEFAULT,
.arg = (void*) "auto",
.val = 1,
.descrip = "Whether or not to use colored output",
.argDescrip = "always|never|auto (checks if TTY)"
},
POPT_TABLEEND
};
int main(int argc, const char** argv) {
// get popt context
poptContext ctx = poptGetContext(
"program",
argc, argv,
options,
POPT_CONTEXT_POSIXMEHARDER);
// parse
poptGetNextOpt(ctx);
return 0;
}
以上段错误:
/tmp$ ./a.out --help
Usage: a.out [OPTION...]
[1] 47468 segmentation fault ./a.out --help
尽管将 .argDescrip
更改为
.argDescrip = "always|never|auto (checks if TTY) "
"........................................."
popt愉快地接受并显示输出:
/tmp$ ./a.out --help
Usage: a.out [OPTION...]
--color[=always|never|auto (checks if TTY) .........................................] Whether or not to use colored output
Help options:
-?, --help
Show this help message
--usage
Display brief usage message
什么给了?我在 C 规范中遗漏了什么吗? popt man pages 没有指定所需的长度。这是一个错误吗?
你的问题是别的。您已将 arg
成员设置为常量字符串,而您需要将其设置为指向此类的指针(手册页说,arg 应使用指向 char *
的指针进行初始化)。您的程序在尝试取消引用不是一个的指针时死机。
这样试试:
char *garg = "auto";
struct poptOption options[] = {
POPT_AUTOHELP
{
.longName = "color",
.shortName = '[=10=]',
.argInfo = POPT_ARG_STRING
| POPT_ARGFLAG_OPTIONAL
| POPT_ARGFLAG_SHOW_DEFAULT,
.arg = &garg,
.val = 1,
.descrip = "Whether or not to use colored output",
.argDescrip = "always|never|auto (checks if TTY)"
},
POPT_TABLEEND
};
当 argDescrip
字符串不够长时,为什么 popt 会出现段错误?
举个例子:
#include <popt.h>
struct poptOption options[] = {
POPT_AUTOHELP
{
.longName = "color",
.shortName = '[=10=]',
.argInfo = POPT_ARG_STRING
| POPT_ARGFLAG_OPTIONAL
| POPT_ARGFLAG_SHOW_DEFAULT,
.arg = (void*) "auto",
.val = 1,
.descrip = "Whether or not to use colored output",
.argDescrip = "always|never|auto (checks if TTY)"
},
POPT_TABLEEND
};
int main(int argc, const char** argv) {
// get popt context
poptContext ctx = poptGetContext(
"program",
argc, argv,
options,
POPT_CONTEXT_POSIXMEHARDER);
// parse
poptGetNextOpt(ctx);
return 0;
}
以上段错误:
/tmp$ ./a.out --help
Usage: a.out [OPTION...]
[1] 47468 segmentation fault ./a.out --help
尽管将 .argDescrip
更改为
.argDescrip = "always|never|auto (checks if TTY) "
"........................................."
popt愉快地接受并显示输出:
/tmp$ ./a.out --help
Usage: a.out [OPTION...]
--color[=always|never|auto (checks if TTY) .........................................] Whether or not to use colored output
Help options:
-?, --help
Show this help message
--usage
Display brief usage message
什么给了?我在 C 规范中遗漏了什么吗? popt man pages 没有指定所需的长度。这是一个错误吗?
你的问题是别的。您已将 arg
成员设置为常量字符串,而您需要将其设置为指向此类的指针(手册页说,arg 应使用指向 char *
的指针进行初始化)。您的程序在尝试取消引用不是一个的指针时死机。
这样试试:
char *garg = "auto";
struct poptOption options[] = {
POPT_AUTOHELP
{
.longName = "color",
.shortName = '[=10=]',
.argInfo = POPT_ARG_STRING
| POPT_ARGFLAG_OPTIONAL
| POPT_ARGFLAG_SHOW_DEFAULT,
.arg = &garg,
.val = 1,
.descrip = "Whether or not to use colored output",
.argDescrip = "always|never|auto (checks if TTY)"
},
POPT_TABLEEND
};