主要内容

编译器 (-compiler)

指定用于编译源代码的编译器

描述

本页列出了静态分析产品 Polyspace® Bug Finder™Polyspace Code Prover™ 支持的编译器。有关 Polyspace Test™ 支持的编译器的信息,请参阅在 Polyspace 平台用户界面中指定用于测试的 C/C++ 编译器 (Polyspace Test)

指定用于编译源代码的编译器。

Polyspace 完全支持最常用于开发嵌入式应用程序的编译器。请参阅以下列表。对于这些编译器,您只需指定编译器和目标处理器即可运行分析。对于其他编译器,请将 generic 指定为编译器名称。如果您遇到编译错误,请显式定义编译器特定的扩展来解决错误。

设置选项

使用以下方法之一设置选项:

为何使用此选项

Polyspace 使用此信息来解释不属于 C/C++ 标准,而是来自其语言扩展的语法。

例如,此选项允许使用附加语言关键字,例如 sfrsbitbit。如果您未指定编译器,则这些附加关键字可能会在 Polyspace 分析期间导致编译错误。

Polyspace 不实际调用您的编译器进行编译。尤其是:

  • 您无法直接在 Polyspace 分析中指定编译器标志。要模拟您的编译器标志,请跟踪您的编译命令或手动指定等效的 Polyspace 分析选项。请参阅指定目标环境和编译器行为

  • Code Prover 具有比常规的编译器更严格的链接策略。例如,如果您的编译器允许声明与特定编译器选项不匹配,则您无法在 Code Prover 中模拟此链接策略。请参阅Troubleshoot Compilation and Linking Errors (Polyspace Code Prover)

设置

默认值:generic

Polyspace 原生支持 GCC、Clang 和 Visual Studio® 编译器。您可以为这些编译器选择任何可用的目标处理器。对于其他受支持的专用编译器,Polyspace 支持特定的目标处理器。请参阅目标处理器类型 (-target)

GCC 编译器

gnu3.4

分析允许 GCC 3.4 语法。

gnu4.6

分析允许 GCC 4.6 语法。

gnu4.7

分析允许 GCC 4.7 语法。

有关不受支持的 GCC 扩展,请参阅限制

gnu4.8

分析允许 GCC 4.8 语法。

有关不受支持的 GCC 扩展,请参阅限制

gnu4.9

分析允许 GCC 4.9 语法。

有关不受支持的 GCC 扩展,请参阅限制

gnu5.x

分析允许 GCC 5.x 语法。有关可用 GCC 5.x 版本的列表,请参阅 GCC 版本

如果您选择 gnu5.x,则可以使用目标处理器类型 (-target) 选项仅指定基于 GCC 的编译器目标的子集。要指定不属于该子集的其他目标,请使用通用目标选项

有关不受支持的 GCC 扩展,请参阅限制

gnu6.x

分析允许 GCC 6.x 语法。有关可用 GCC 6.x 版本的列表,请参阅 GCC 版本

如果您选择 gnu6.x,则可以使用目标处理器类型 (-target) 选项仅指定基于 GCC 的编译器目标的子集。要指定不属于该子集的其他目标,请使用通用目标选项

有关不受支持的 GCC 扩展,请参阅限制

gnu7.x

分析允许 GCC 7.x 语法。有关可用 GCC 7.x 版本的列表,请参阅 GCC 版本

如果您选择 gnu7.x,则可以使用目标处理器类型 (-target) 选项仅指定基于 GCC 的编译器目标的子集。要指定不属于该子集的其他目标,请使用通用目标选项

有关不受支持的 GCC 扩展,请参阅限制

gnu8.x

分析允许 GCC 8.x 语法。有关可用 GCC 8.x 版本的列表,请参阅 GCC 版本

如果您选择 gnu8.x,则可以使用目标处理器类型 (-target) 选项仅指定基于 GCC 的编译器目标的子集。要指定不属于该子集的其他目标,请使用通用目标选项

有关不受支持的 GCC 扩展,请参阅限制

gnu9.x

分析允许 GCC 9.x 语法。有关可用 GCC 9.x 版本的列表,请参阅 GCC 版本

如果您选择 gnu9.x,则可以使用目标处理器类型 (-target) 选项仅指定基于 GCC 的编译器目标的子集。要指定不属于该子集的其他目标,请使用通用目标选项

有关不受支持的 GCC 扩展,请参阅限制

gnu10.x

分析允许 GCC 10.x 语法。有关可用 GCC 10.x 版本的列表,请参阅 GCC 版本

如果您选择 gnu10.x,则可以使用目标处理器类型 (-target) 选项仅指定基于 GCC 的编译器目标的子集。要指定不属于该子集的其他目标,请使用通用目标选项

有关不受支持的 GCC 扩展,请参阅限制

gnu11.x

分析允许 GCC 11.x 语法。有关可用 GCC 11.x 版本的列表,请参阅 GCC 版本

如果您选择 gnu11.x,则可以使用目标处理器类型 (-target) 选项仅指定基于 GCC 的编译器目标的子集。要指定不属于该子集的其他目标,请使用通用目标选项

有关不受支持的 GCC 扩展,请参阅限制

gnu12.x

分析允许 GCC 12.x 语法。有关可用 GCC 12.x 版本的列表,请参阅 GCC 版本

如果您选择 gnu12.x,则可以使用目标处理器类型 (-target) 选项仅指定基于 GCC 的编译器目标的子集。要指定不属于该子集的其他目标,请使用通用目标选项

有关不受支持的 GCC 扩展,请参阅限制

gnu13.x

分析允许 GCC 13.x 语法。有关可用 GCC 13.x 版本的列表,请参阅 GCC 版本

如果您选择 gnu13.x,则可以使用目标处理器类型 (-target) 选项仅指定基于 GCC 的编译器目标的子集。要指定不属于该子集的其他目标,请使用通用目标选项

有关不受支持的 GCC 扩展,请参阅限制

Clang 编译器

clang3.x

对于以下版本,分析允许 Clang 语法:

  • 3.5.0、3.5.1 和 3.5.2

  • 3.6.0、3.6.1 和 3.6.2

  • 3.7.0 和 3.7.1

  • 3.8.0 和 3.8.1

  • 3.9.0 和 3.9.1

clang4.x

分析允许 Clang 4.0.0 和 4.0.1 语法。

clang5.x

分析允许 Clang 5.0.0、5.0.1 和 5.0.2 语法。

clang6.x

分析允许 Clang 6.0.0 和 6.0.1 语法。

clang7.x

分析允许 Clang 7.0.0、7.0.1 和 7.1.0 语法。

clang8.x

分析允许 Clang 8.0.0 和 8.0.1 语法。

clang9.x

分析允许 Clang 9.0.0 和 9.0.1 语法。

clang10.x

分析允许 Clang 10.0.0 和 10.0.1 语法。

clang11.x

分析允许 Clang 11.0.0、11.0.1 和 11.1.0 语法。

clang12.x

分析允许 Clang 12.0.0 和 12.0.1 语法。

clang13.x

分析允许 Clang 13.0.0 和 13.0.1 语法。

clang14.x

分析允许 Clang 14 语法。

clang15.x

分析允许 Clang 15 语法。

clang16.x

分析允许 Clang 16 语法。

Visual Studio 编译器

visual9.0

分析允许 Microsoft® Visual C++® 2008 语法。

visual10.0

分析允许 Microsoft Visual C++ 2010 语法。

visual11.0

分析允许 Microsoft Visual C++ 2012 语法。

visual12.0

分析允许 Microsoft Visual C++ 2013 语法。

visual14.0

分许允许 Microsoft Visual C++ 2015 语法(支持 Microsoft Visual Studio Update 2)。

visual15.x

分析允许 Microsoft Visual C++ 2017 语法。有关可用 Microsoft Visual Studio 2017 版本的列表,请参阅 Visual Studio 2017 发行说明历史记录

visual16.x

分析允许 Microsoft Visual C++ 2019 语法。有关可用 Microsoft Visual Studio 2019 版本的列表,请参阅 Visual Studio 2019 发行说明历史记录

visual17.x

分析允许 Microsoft Visual C++ 2022 语法。有关可用 Microsoft Visual Studio 2022 版本的列表,请参阅 Visual Studio 2022 发行说明历史记录

其他编译器

armcc

分析允许与 ARM® v5 编译器关联的非 ANSI® C 语法和语义。

如果您选择 armcc,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 ARM v5 编译器允许的目标。

请参阅 ARM v5 编译器 (-compiler armcc)

armclang

分析允许与 ARM v6 编译器关联的非 ANSI C 语法和语义。

如果您选择 armclang,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 ARM v6 编译器允许的目标。

请参阅 ARM v6 编译器 (-compiler armclang)

codewarrior

分析允许与 NXP CodeWarrior® 编译器关联的非 ANSI C 语法和语义。

如果您选择 codewarrior,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 NXP CodeWarrior 编译器允许的目标。

请参阅 NXP CodeWarrior 编译器 (-compiler codewarrior)

cosmic

分析允许与 Cosmic 编译器关联的非 ANSI C 语法和语义。

如果您选择 cosmic,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 Comic 编译器允许的目标。

请参阅 Cosmic 编译器 (-compiler cosmic)

diab

分析允许与 Wind River® Diab 编译器关联的非 ANSI C 语法和语义。

如果您选择 diab,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 Wind River Diab 编译器允许的目标。

注意

如果您使用的是 Diab 编译器版本 7.x,请将 -compiler 指定为 clang15.x

请参阅 Diab 编译器 (-compiler diab)

generic

分析仅允许标准语法。

语言标准取决于您针对以下选项的选择:

如果您未显式指定标准,则标准取决于您选择的编译器。

greenhills

分析允许与 Green Hills® 编译器关联的非 ANSI C 语法和语义。

如果您选择 greenhills,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 Green Hills 编译器允许的目标。

请参阅 Green Hills 编译器 (-compiler greenhills)

iar

分析允许与来自 IAR Systems (www.iar.com) 的编译器关联的非 ANSI C 语法和语义。

iar-ew

分析允许与 IAR Embedded Workbench 编译器关联的非 ANSI C 语法和语义。

如果您选择 iar-ew,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 IAR Embedded Workbench 编译器允许的目标。

请参阅 IAR Embedded Workbench 编译器 (-compiler iar-ew)

intel

分析允许与 Intel® C++ Compiler Classic (icc/icl) 编译器关联的非 ANSI C 语法和语义。

如果您选择 intel,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 Intel C++ Compiler Classic (icc/icl) 编译器允许的目标。

请参阅 Intel C++ Compiler Classic (icc/icl) (-compiler intel)

keil

分析允许与来自 ARM (www.keil.com) 的 Keil™ 产品关联的非 ANSI C 语法和语义。

microchip

分析允许与 MPLAB XC8 C 编译器关联的非 ANSI C 语法和语义。

如果您选择 microchip,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 MPLAB XC8 C 编译器允许的目标。

请参阅 MPLAB XC8 C 编译器 (-compiler microchip)

renesas

分析允许与 Renesas® 编译器关联的非 ANSI C 语法和语义。

如果您选择 renesas,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 Renesas 编译器允许的目标。

请参阅 Renesas 编译器 (-compiler renesas)

tasking

分析允许与 TASKING 编译器关联的非 ANSI C 语法和语义。

如果您选择 tasking,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 TASKING 编译器允许的目标。

请参阅 TASKING 编译器 (-compiler tasking)

ti

分析允许与 Texas Instruments® 编译器关联的非 ANSI C 语法和语义。

如果您选择 ti,则在 Polyspace 桌面端产品的用户界面中,目标处理器类型 (-target) 选项仅显示 Texas Instruments 编译器允许的目标。

请参阅 Texas Instruments 编译器 (-compiler ti)

提示

  • 您的编译器设定决定了许多编译器特定的宏的值。如果要了解 Polyspace 如何定义特定宏,请使用 -dump-preprocessing-info 选项。

  • 如果您使用 Visual Studio 编译器,则必须使用将 long long 设置为 64 位的目标处理器类型 (-target) 选项。兼容的目标包括:long long 设置为 64(命令行中为 -long-long-is-64bits)的 i386sparcm68kpowerpctms320c3xsharc21x61mpc5xxx86_64mcpu

  • 如果您使用检查 JSF AV C++ 规则 (-jsf-coding-rules) 选项,请选择 generic 编译器。如果您使用其他编译器,则 Polyspace 无法检查需要遵守 ISO 标准的 JSF® 编码规则。例如,AV Rule 8:“所有代码必须遵守 ISO/IEC 14882:2002(E) 标准 C++。”

  • Polyspace 支持使用以下关键字、pragma 和属性来定义弱符号:

    • 关键字

      __weak

      __weak__

    • Pragma

      #pragma weak symbol

      #pragma WEAK symbol

      #pragma WEAK(symbol)

      #pragma weak "symbol

      #pragma weak symbol=default

    • GNU 属性

      __attribute__((weak))

      __attribute__ ((weak, alias("default")))

  • 分析从将设备供应商 (Simulink)指定为 Texas Instruments 的 Simulink® 模型生成的代码时,Polyspace 将 -compiler 选项设置为泛型

限制

GNU 编译器

Polyspace 不支持 GNU 编译器的某些功能:

  • GNU® 编译器版本 4.7 及更高版本:

    • 嵌套函数。

      例如,在函数 foo 中嵌套函数 bar

      int foo (int a, int b)
      {
        int bar (int c) { return c * c; }
      
        return bar (a) + bar (b);
      }

    • 对向量类型执行的二元运算,其中一个操作数使用了简化形式表示等值向量。

      例如,在加法运算 2+a 中,2 用作 {2,2,2,2} 的简化形式。

      typedef int v4si __attribute__ ((vector_size (16)));
      v4si res, a = {1,2,3,4};
      
      res = 2 + a;  /* means {2,2,2,2} + a  */

    • 函数参数的前向声明。

      例如,对参数 len 进行前向声明:

      void func (int len; char data[len][len], int len)
      {
        /* … */
      }

    • 复整数数据类型。

      但是,支持复杂的浮点数据类型。

    • 使用初始化列表初始化具有灵活数组成员的结构体。

      例如,结构 S 具有一个灵活数组成员 tab。直接使用初始化列表初始化 S 类型的变量。

      struct S {
          int x;
          int tab[];            /* flexible array member - not supported */
      };
      struct S s = { 0, 1, 2} ;
      分析过程中您会看到一条警告,解引用时会在结果中看到红色检查,例如 s.tab[1]

    • 128 位变量。

      Polyspace 无法从语义方面分析此数据类型。Bug Finder 允许使用 128 位数据类型,但是如果您使用此种数据类型(例如 GCC 扩展 __float128),则 Code Prover 会显示编译错误。

  • GNU 编译器版本 7.x:

    • 语义上不支持类型名称 _FloatN_FloatNx。分析会将它们视为 floatdoublelong double 类型。

    • 不支持 _FloatN_FloatNx 类型且带有后缀 fNFNfNx 的常量,例如 1.2f1232.3F64x

Visual Studio 编译器

Polyspace 不支持 Visual Studio 编译器的某些功能:

  • C++ 加速大规模并行计算 (AMP)。

    C++ AMP 是 Visual Studio 的一项功能,可根据特定目标上某些类型的数据并行硬件来提升 C++ 代码执行速度。您通常使用 restrict 关键字来启用此功能。

    void Buffer() restrict(amp) 
    {
      ... 
    }

  • __assume 语句。

    通常将 __assume 与一个 false 条件一起使用。该语句表明优化器此后必须假定条件为 true。Code Prover 无法调和这一矛盾。您会收到以下错误:

    Asked for compulsory presence of absent entity : assert

  • C++(.NET Framework 所必需)或其后继 C++/CLI(C++ 针对通用语言基础架构进行了修改)的托管扩展

  • __declspec 关键字包含除 noreturnnothrowselectanythread 之外的属性。

其他编译器

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

    例如,根本不支持以下构造。使用这些构造可能会导致错误。

    • 半精度浮点数据类型,例如 _Float16

    • 小数定点数据类型,例如 __sfract__fract__accum__laccum

  • Polyspace 不支持 Embarcadero C++ 编译器。

Polyspace 系统头文件

如果您未指定编译器头文件的路径,则 Polyspace 将使用自己的系统头文件,且即使此编译器可用于编码该代码,您的工程也可能无法编译。

要确保 Polyspace 使用您的编译器头文件,请运行 polyspace-configure 或手动指定您的编译器头文件的路径。请参阅为 Polyspace 分析提供标准库头文件

命令行信息

参数和值

参数:-compiler
值 (GCC):gnu3.4 | gnu4.6 | gnu4.7 | gnu4.8 | gnu4.9 | gnu5.x | gnu6.x | gnu7.x | gnu8.x | gnu9.x | gnu10.x | gnu11.x | gnu12.x
值 (Clang):clang3.x | clang4.x | clang5.x | clang6.x | clang7.x | clang8.x | clang9.x | clang10.x | clang11.x | clang12.x | clang13.x
值 (Visual Studio):visual9.0 | visual10.0 | visual11.0 | visual12.0 | visual14.0 | visual15.x | visual16.x | visual17.x
值(其他):armcc | armclang | codewarrior | cosmic | diab | generic | greenhills | iar | iar-ew | intel | keil | microchip | renesas | tasking | ti
默认值:generic

示例

示例 1 (Bug Finder):polyspace-bug-finder -lang c -sources "file1.c,file2.c" -compiler gnu4.6
示例 2 (Bug Finder):polyspace-bug-finder -lang cpp -sources "file1.cpp,file2.cpp" -compiler visual9.0
示例 1 (Code Prover):polyspace-code-prover -lang c -sources "file1.c,file2.c" -lang c -compiler gnu4.6
示例 2 (Code Prover):polyspace-code-prover -lang cpp -sources "file1.cpp,file2.cpp" -compiler visual9.0
示例 1 (Bug Finder Server):polyspace-bug-finder-server -lang c -sources "file1.c,file2.c" -compiler gnu4.6
示例 2 (Bug Finder Server):polyspace-bug-finder-server -lang cpp -sources "file1.cpp,file2.cpp" -compiler visual9.0
示例 1 (Code Prover Server):polyspace-code-prover-server -lang c -sources "file1.c,file2.c" -lang c -compiler gnu4.6
示例 2 (Code Prover Server):polyspace-code-prover-server -lang cpp -sources "file1.cpp,file2.cpp" -compiler visual9.0