【问题标题】:Why am I getting a Missing sentinel warning?为什么我会收到缺少哨兵警告?
【发布时间】:2012-12-16 09:47:55
【问题描述】:

基本代码:

        char *args[3] = {NULL};
        args[0] = "ls";
        args[1] = "-l";
        args[2] = NULL;

为什么会:

        int execution = execlp("ls", args[0], args[1], NULL);

导致没有警告,并且:

        int execution = execlp("ls", args[0], args[1], args[2]);

导致警告:函数调用中缺少标记?

注意:我知道两者是相同的,但我只是好奇为什么一个会导致警告而不是另一个。

【问题讨论】:

    标签: c++ operating-system exec fork


    【解决方案1】:

    因为The list of arguments must be terminated by a NULL pointer。即使 args[2] 在您的情况下恰好是 NULL,编译器也没有这种洞察力(如果您问我,也不应该)。

    如果有人出现并将args[2] 更改为其他内容,却不知道它被用作哨兵怎么办?

    【讨论】:

    • “如果有人过来将 args[2] 更改为其他东西,却不知道它被用作哨兵怎么办?” - 这就是静态分析的用途,如果你问我的话。
    • @H2CO3 也许,但我见过很多警告都被忽略的情况。我宁愿安全行事,但这只是我。诊断是否有用是主观的,我个人认为有用。
    • 是的,这里的编译器是对的,但这是误报。够奇怪了。
    【解决方案2】:

    因为编译器不智能。

    它期望标记为文字0NULL(实际上只是0(void *)0),其他任何内容都会生成警告。如果编译器更智能并且对代码执行更多静态分析,它可能会得出结论args[2] 确实是一个常量 0,因此不需要警告,但显然它不能。

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多