当我写一段代码时,请说出这样的话:
int i_flag;
char *s;
while ((c = getopt (argc, argv, "i::o:")) != -1) // I know "i::" is a GNU extension
switch (c) {
case 'i':
i_flag = 1;
if (optarg != NULL)
str-i = optarg;
break;
case 'o':
id = strtol (optarg, &s, 0);
if (id < 0 || id > 5 || *s) {
fprintf(stderr, "Invalid ID: %s\n", optarg);
print_usage(); // this function exit()'s the program
}
break;
default:
print_usage();
}
我的问题是我知道optarg
在'i'
情况下'o'
可以为NULL,但在if (optarg != NULL)
情况下它是否为NULL?我认为它根本不应该是NULL,但在POSIX中似乎没有保证。
我有这个问题,因为一个非常智能的静态分析器会查看optarg
并说“哦,所以case 'o'
可以为NULL而你没有在int i-flag;
中检查它。” p>
更新:修复{{1}}。
答案 0 :(得分:0)
是的,optarg
将为非空。如果对于需要参数的选项省略参数,getopt
将返回'?'
。