首页 > 解决方案 > Polyspace 发出关于系统函数使用系统定义参数标志的警报

问题描述

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

我们收到了几个关于使用上述调用的“手册”页定义的标志的警报。在 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 及其值的方式,我能做些什么呢?在我看来,仅仅为了让工具快乐而铸造价值是有风险的。

除了为这些违规行为辩护之外,还有其他方法可以解决这个问题吗?

谢谢您最好的问候!

标签: cstatic-analysismisra

解决方案


这些值是用不同的符号定义的,这有点奇怪。添加一个平台隔离层可能是个好主意,它将这些常量重新定义为特定于模块的常量,执行必要的转换并可能处理跨平台差异。

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)

推荐阅读