修复与 Keil 或 IAR 编译器相关的 Polyspace 编译错误
缺失标识符
如果您使用编译器 keil 或 iar,可能会遇到此问题。有关用于编译器设定的 Polyspace® 选项的详细信息,请参阅编译工具链(静态分析)。
问题
分析以错误消息停止(需要一个标识符),就好像缺少标识符一样。但是,在源代码中,您可以看到该标识符。
原因
如果您选择 Keil 或 IAR 作为编译器,该软件会在预处理期间删除某些关键字。如果将这些关键字用作变量名等标识符,则会出现编译错误。
有关删除的关键字列表,请参阅Keil or IAR Language Extensions Supported with Polyspace。
解决方案
指定 Polyspace 在预处理期间不得删除关键字。定义宏 __PST_KEIL_NO_KEYWORDS__ 或 __PST_IAR_NO_KEYWORDS__。
有关详细信息,请参阅预处理器定义 (-D)。
不支持的构造
如果您使用编译器 iar-ew,可能会因缺少对特定语言扩展的支持而遇到问题。有关用于编译器设定的 Polyspace 选项的详细信息,请参阅编译工具链(静态分析)。
Polyspace 不支持使用
$Super$$和$Sub$$来修补符号定义。例如,以下代码会正确编译,但 Polyspace 认为main()调用extern func ($Super$$func)而非调用此代码($Sub$$func)中定义的函数func:为确保 Polyspace 在分析您的代码时调用正确的函数,请在预处理后在所有文件中将/* void func() declared in another file */ extern void $Super$$func(int i); int setup = 0; void setup_func(int i) { setup = i; } /* this function should be called instead of the original extern func() */ void $Sub$$func(int i) { setup_foo(i); /* does some extra setup work */ /* ... */ } int main() { assert(setup = 0); func(1); // Should call $Sub$$func instead of $Super$$func assert(setup = 1); return 0; }$Sub$$的所有实例替换为一个空字符串。请参阅要应用于预处理文件的命令/脚本 (-post-preprocessing-command)。Polyspace 不支持某些特定于 IAR 编译器的构造。
有关不支持的构造的列表,请参阅
中的polyspaceroot\polyspace\verifier\code_prover_desktopcodeprover_limitations.pdf。其中,是 MATLAB® 的安装文件夹,例如polyspacerootC:\Program Files\Polyspace\R2019a。