Polyspace错误发现者忽略#如果检查宏的值。

10视图(30天)
我运行一个Polyspace Bug仪分析一些CPP代码,用下面的宏定义(通过配置- >宏):
CPU_FAMILY = I80X86
从图书馆我使用头文件有以下:
#如果CPU_FAMILY = = MC680X0
#包括<拱/ mc68k / excMc68kLib.h >
#endif / * CPU_FAMILY = = MC680X0 * /
分析的时候,我得到了警告:
警告:找不到包含文件“拱/ Mc68kLIb.h”
它是正确的,我没有这个头文件,但不应该被解析,由于#如果。
请谁能告诉我我做错了什么吗?
谢谢。
马丁

接受的答案

Anirban
Anirban 2021年11月24日
编辑:Anirban 2021年11月24日
有两个事情:
  1. MC680X0和I80X86 Polyspace提供的代码中定义。你可能缺少一些编译器头文件路径Polyspace项目。
  2. CPU_FAMILY是# define-d MC680X0 Polyspace提供的代码。
我在下面详细解释情况。
案例1:MC680X0 I80X86并不是定义
让我给你举个例子。如果你确认这个代码:
#如果CPU_FAMILY = = MC680X0
#包括<拱/ mc68k / excMc68kLib.h >
#endif
无效main () {
intj = 1;
intj k =;
}
用宏定义CPU_FAMILY = I80X86,您将看到替换发生的结果,也就是说,您将看到类似: 如果I80X86 = = MC680X0 #。 但是, # include 不是预处理。这是因为代码验证没有的知识 I80X86和MC680X0 是这样的。 #如果 本质上是整数的比较,所以除非吗 I80X86和MC680X0 定义、代码验证将无法做比较。你可以检查这通过更改代码来定义这两个宏。像下图:
#定义MC680X01
#定义I80X862
#如果CPU_FAMILY = = MC680X0
#包括<拱/ mc68k / excMc68kLib.h >
#endif
无效main () {
intj = 1;
intj k =;
}
你会发现#如果比较现在和工作 # include 预处理。
某个地方,在你的编译器头,宏 I80X86和MC680X0 必须定义(#如果s将如何工作)。不知何故,在你设置Polyspace项目中,这些编译器头没有得到提供。因此,对于Polyspace, I80X86和MC680X0 是两个不透明的东西。
案例2:CPU_FAMILY在头文件中定义
如果CPU_FAMILY MC680X0头文件中定义,它会覆盖你的宏定义的配置。要检查这一点,您可以验证这段代码通过设置CPU_FAMILY = I80X86:
#定义MC680X01
#定义I80X862
#定义CPU_FAMILYMC680X0
#如果CPU_FAMILY = = MC680X0
#包括<拱/ mc68k / excMc68kLib.h >
#endif
无效main () {
intj = 1;
intj k =;
}
您将看到宏 CPU_FAMILY 需要在代码中定义的值,而不是在配置。
1评论
马丁•沃克
马丁•沃克 2021年12月10日
嗨Anirban,
谢谢你的详细的回答。抱歉为延迟回到你。
使用案例1的修改,问题消失,表明我必须错过这些定义。我将试图找到在图书馆的某个地方,并确保他们都包括在内。我将接受一个你的答案。再次感谢。
马丁

登录置评。

更多的答案(0)