检查指针为“ NULL”时出现“无法访问代码”警报

时间:2018-11-12 10:42:18

标签: c static-analysis

我正在使用C语言编写的Linux应用程序,该应用程序必须通过Polyspace的Code Prover和Bug Finder。在某些尝试检查指针为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的所有函数都会收到此警报,但由于某些原因,我还有其他函数会以相同的方式检查用户定义的struct指针,并且只能一次获得警报。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

如您所说,“ *端口指针由函数main()提供,该函数依次收集命令行参数的内容,以获取进入“端口”的实际字符串名称。”

因此,显然,代码检查器还检查了如何调用该函数,并确定该函数永远不会使用空端口来调用。这样一来,port == NULL分支之后的所有代码都将无法到达,从而得到消息。

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