主要内容

修复与 Keil 或 IAR 编译器相关的 Polyspace 编译错误

缺失标识符

如果您使用编译器 keiliar,可能会遇到此问题。有关用于编译器设定的 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

    /* 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;
    }
    为确保 Polyspace 在分析您的代码时调用正确的函数,请在预处理后在所有文件中将 $Sub$$ 的所有实例替换为一个空字符串。请参阅要应用于预处理文件的命令/脚本 (-post-preprocessing-command)

  • Polyspace 不支持某些特定于 IAR 编译器的构造。

    有关不支持的构造的列表,请参阅 polyspaceroot\polyspace\verifier\code_prover_desktop 中的 codeprover_limitations.pdf。其中,polyspaceroot 是 MATLAB® 的安装文件夹,例如 C:\Program Files\Polyspace\R2019a