getopt():如果optstring包含类似“a:”的内容,optarg是否保证为非NULL?

时间:2013-12-18 01:19:11

标签: c getopt

当我写一段代码时,请说出这样的话:

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}}。

1 个答案:

答案 0 :(得分:0)

是的,optarg将为非空。如果对于需要参数的选项省略参数,getopt将返回'?'