"Unreachable code" 检查 "NULL" 的指针时发出警报

"Unreachable code" alert when checking a pointer for "NULL"

我正在开发一个用 C 语言编写的 Linux 应用程序,该应用程序必须通过 Polyspace 的 Code Prover 和 Bug Finder。我在某些函数中收到了一些 "grey" 警报,我在这些函数中尝试检查 NULL 指针。

这是获取警报的函数之一的示例:

int soc = 0;

static int OpenPort(const char *port)
{
    int ret_status_code = 0;
    struct sockaddr_can sock_addr;
    can_err_mask_t err_mask = (CAN_ERR_TX_TIMEOUT | CAN_ERR_LOSTARB |
        CAN_ERR_CRTL | CAN_ERR_PROT | CAN_ERR_TRX | CAN_ERR_ACK |
        CAN_ERR_BUSOFF | CAN_ERR_BUSERROR | CAN_ERR_RESTARTED);

    soc = socket(AF_CAN, SOCK_RAW | SOCK_NONBLOCK, CAN_RAW);

    if(port == NULL){ /* Grey alert triggers for this line */
        syslog(LOG_ERR | LOG_USER, "NULL pointer passed to function");
        ret_status_code = -1;
    }
    else if(soc < 0){
        syslog(LOG_ERR | LOG_USER, "Can't open socket");
        ret_status_code = -1;

    }else{
        /* Proceed if everything was OK */
    }

    return ret_status_code;
}/*OpenPort*/

我拥有的所有检查 const char *pointer 的函数都会收到此警报,但出于某种原因,还有其他函数我会以相同的方式检查用户定义的结构指针,并且只会在一个函数中收到警报。

我想知道的第一件事是是否有人可以向我解释 Polyspace 如何检查此警报(我的编译器似乎没有识别任何无法访问的块)。

谢谢。

port == NULL 检查似乎有效,除非 代码检查器还包括该函数的所有调用并确定它永远不会使用空端口调用。该函数是静态的,因此所有调用都限于当前编译单元。

如你所说,"the *port pointer is provided by the function main(), which in turn collects the contents of a command-line argument to get the actual string name that goes into "端口"。"

显然,代码检查器还检查了该函数的调用方式,并确定它从未使用空端口调用。那么 port == NULL 分支之后的所有代码都不会到达,因此消息。

请注意,如果该函数不是静态的,则代码检查器无法做出此决定,因为它不知道如何从其他编译单元调用该函数(同样,除非它将所有模块和库包含在它的分析...)