具有C open()函数的Polyspace运行时检查警报

时间:2018-11-15 15:20:41

标签: c runtime-error static-analysis misra fcntl

首先,请考虑以下代码(从main()调用一次的静态函数):

#define SYSFS_GPIO_DIR                          "/sys/class/gpio"
#define MAX_BUF                                 ((UI_8)64)

typedef uint8_t UI_8
typedef int32_t SI_32
typedef char CHAR_8

static SI_32 ImuGpioFdOpen(UI_8 gpio)
{
    SI_32 fd_gpio_open = -1;
    SI_32 byte_count = -1;
    CHAR_8 aux_buf[MAX_BUF] = {'\0'};

    byte_count = snprintf(aux_buf, sizeof(aux_buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
    if((byte_count > 0) && (byte_count < sizeof(aux_buf))){
        fd_gpio_open = open(aux_buf, O_RDONLY | O_NONBLOCK );
        if(fd_gpio_open < 0){
            syslog (LOG_ERR,"gpio/fd_open");
            fd_gpio_open = ERROR;
        }
    }

    return fd_gpio_open;
}/*ImuGpioFdOpen*/

在调用open()时,使用Polyspace Code Prover进行静态分析会引发有关MISRA的“ Dir 4.1运行时故障应降至最低”的警报。警报说:“第一个参数(文件路径)可能不是有效的字符串”

我们似乎不太了解该指令,因为我们为解决此类警报而做出的所有努力(我们有几个类似的警报)都没有产生结果。我的意思是,我们显然不能正确地构建字符串,但是由于程序可以正确地编译和运行,所以我们很茫然。

我们缺少哪种运行时检查?

谢谢!

编辑:我忘了提及传递字符串文字似乎对Polyspace有效,但是如果我们尝试传递在运行时生成的字符串(如代码中),则无效。可能是因为open()的原型声明第一个参数是const char *,而Polyspace对此却过于重视吗?

1 个答案:

答案 0 :(得分:0)

该问题已被判定为误报。警报应据此合理。

谢谢!