我正在与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_CREAT
,O_RDWR
和O_EXCL
具有不同的基本类型(有些是无符号的,有些是带符号的),因此,这种OR操作不推荐。根据MISRA的10.1指南,这是正确的,但是如果这是系统定义其API和其值的方式,我该怎么办?在我看来,仅仅为了使工具满意而铸造值是有风险的。
除了证明这些违法行为合理之外,还有其他解决方法吗?
谢谢你,最诚挚的问候!
答案 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)