我正在使用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如何检查此警报(我的编译器似乎没有识别出任何无法到达的块)。
谢谢。
答案 0 :(得分:1)
port == NULL
检查似乎是有效的,除非,代码检查器还包括该函数的所有调用,并确定绝不使用空端口调用该函数。该函数是静态的,因此所有调用都限于当前的编译单元。
如您所说,“ *端口指针由函数main()提供,该函数依次收集命令行参数的内容,以获取进入“端口”的实际字符串名称。”
因此,显然,代码检查器还检查了如何调用该函数,并确定该函数永远不会使用空端口来调用。这样一来,port == NULL
分支之后的所有代码都将无法到达,从而得到消息。
请注意,如果函数不是静态的,则代码检查器无法做出此确定,因为它不知道如何从其他编译单元调用该函数(同样,除非它在其分析中包括所有模块和库。 ..)