关于将系统定义的参数标志用于系统功能的Polyspace警报

时间:2018-11-19 16:33:48

标签: c static-analysis misra

我正在与Polyspace Code Prover和Bug Finder一起对用C语言编写的Linux应用程序执行静态分析。

我们收到有关该呼叫的“ man”页面所定义的标志的使用的若干警报。在open(),write()或syslog()之类的函数手册页中,我们可以看到它们具有一个参数,我们可以将其作为接口定义的多个标志的OR进行传递,如以下示例所示:

fd_value = shm_open(shm_key, O_CREAT | O_RDWR | O_EXCL , S_IRWXU);

Polyspace抱怨在上面的示例中,标志O_CREATO_RDWRO_EXCL具有不同的基本类型(有些是无符号的,有些是带符号的),因此,这种OR操作不推荐。根据MISRA的10.1指南,这是正确的,但是如果这是系统定义其API和其值的方式,我该怎么办?在我看来,仅仅为了使工具满意而铸造值是有风险的。

除了证明这些违法行为合理之外,还有其他解决方法吗?

谢谢你,最诚挚的问候!

1 个答案:

答案 0 :(得分:0)

用不同的signess定义这些值有点奇怪。最好添加一个平台隔离层,以便将这些常量重新定义为模块特定的常量,以执行必要的强制转换并可能处理跨平台差异。

typedef int t_my_shm_open_flags;

#if(defined(PLATFORM1))
#define MY_SHM_OPEN_FLAG_CREATE     ((t_my_shm_open_flags) O_CREAT)
#define MY_SHM_OPEN_FLAG_READ_WRITE ((t_my_shm_open_flags) O_RDWR)
#define MY_SHM_OPEN_FLAG_EXCLUSIVE  ((t_my_shm_open_flags) O_EXCL)
#else
/* error for unsupported platform */
#endif

#define MY_SHM_OPEN_DEFAULT_FLAGS (MY_SHM_OPEN_FLAG_CREATE | MY_SHM_OPEN_FLAG_READ_WRITE | MY_SHM_OPEN_FLAG_EXCLUSIVE)