编译器 (-compiler)
指定用于编译源代码的编译器
描述
本页列出了静态分析产品 Polyspace® Bug Finder™ 和 Polyspace Code Prover™ 支持的编译器。有关 Polyspace Test™ 支持的编译器的信息,请参阅在 Polyspace 平台用户界面中指定用于测试的 C/C++ 编译器 (Polyspace Test)。
指定用于编译源代码的编译器。
Polyspace 完全支持最常用于开发嵌入式应用程序的编译器。请参阅以下列表。对于这些编译器,您只需指定编译器和目标处理器即可运行分析。对于其他编译器,请将 generic 指定为编译器名称。如果您遇到编译错误,请显式定义编译器特定的扩展来解决错误。
设置选项
使用以下方法之一设置选项:
Polyspace 用户界面(仅限桌面端产品)- 在您的工程配置中,选择目标和编译器节点,然后为此选项选择一个值。
Polyspace 平台用户界面(仅限桌面端产品)- 请参阅
编译工具链(静态分析)。
为何使用此选项
Polyspace 使用此信息来解释不属于 C/C++ 标准,而是来自其语言扩展的语法。
例如,此选项允许使用附加语言关键字,例如 sfr、sbit 和 bit。如果您未指定编译器,则这些附加关键字可能会在 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 编译器允许的目标。- armclang
分析允许与 ARM v6 编译器关联的非 ANSI C 语法和语义。
如果您选择 armclang,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 ARM v6 编译器允许的目标。- codewarrior
分析允许与 NXP CodeWarrior® 编译器关联的非 ANSI C 语法和语义。
如果您选择 codewarrior,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 NXP CodeWarrior 编译器允许的目标。- cosmic
分析允许与 Cosmic 编译器关联的非 ANSI C 语法和语义。
如果您选择 cosmic,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 Comic 编译器允许的目标。- diab
分析允许与 Wind River® Diab 编译器关联的非 ANSI C 语法和语义。
如果您选择 diab,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 Wind River Diab 编译器允许的目标。注意
如果您使用的是 Diab 编译器版本
7.x,请将-compiler指定为clang15.x。- generic
分析仅允许标准语法。
语言标准取决于您针对以下选项的选择:
如果您未显式指定标准,则标准取决于您选择的编译器。
- greenhills
分析允许与 Green Hills® 编译器关联的非 ANSI C 语法和语义。
如果您选择 greenhills,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 Green Hills 编译器允许的目标。- iar
分析允许与来自 IAR Systems (www.iar.com) 的编译器关联的非 ANSI C 语法和语义。
- iar-ew
分析允许与 IAR Embedded Workbench 编译器关联的非 ANSI C 语法和语义。
如果您选择 iar-ew,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 IAR Embedded Workbench 编译器允许的目标。- intel
分析允许与 Intel® C++ Compiler Classic (icc/icl) 编译器关联的非 ANSI C 语法和语义。
如果您选择 intel,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 Intel C++ Compiler Classic (icc/icl) 编译器允许的目标。- keil
分析允许与来自 ARM (www.keil.com) 的 Keil™ 产品关联的非 ANSI C 语法和语义。
- microchip
分析允许与 MPLAB XC8 C 编译器关联的非 ANSI C 语法和语义。
如果您选择 microchip,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 MPLAB XC8 C 编译器允许的目标。- renesas
分析允许与 Renesas® 编译器关联的非 ANSI C 语法和语义。
如果您选择 renesas,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 Renesas 编译器允许的目标。- tasking
分析允许与 TASKING 编译器关联的非 ANSI C 语法和语义。
如果您选择 tasking,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 TASKING 编译器允许的目标。- ti
分析允许与 Texas Instruments® 编译器关联的非 ANSI C 语法和语义。
如果您选择 ti,则在 Polyspace 桌面端产品的用户界面中,
目标处理器类型 (-target)选项仅显示 Texas Instruments 编译器允许的目标。
提示
您的编译器设定决定了许多编译器特定的宏的值。如果要了解 Polyspace 如何定义特定宏,请使用
-dump-preprocessing-info选项。要覆盖宏定义,请使用
预处理器定义 (-D)选项。要取消定义某个宏,请使用
已禁用的预处理器定义 (-U)选项。
如果您使用 Visual Studio 编译器,则必须使用将
long long设置为 64 位的目标处理器类型 (-target)选项。兼容的目标包括:long long设置为 64(命令行中为-long-long-is-64bits)的 i386、sparc、m68k、powerpc、tms320c3x、sharc21x61、mpc5xx、x86_64 或 mcpu。如果您使用
检查 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=defaultGNU 属性
__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。分析会将它们视为float、double或long double类型。不支持
_FloatN或_FloatNx类型且带有后缀fN、FN或fNx的常量,例如1.2f123或2.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关键字包含除noreturn、nothrow、selectany或thread之外的属性。
其他编译器
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 |
示例 2 (Bug Finder):polyspace-bug-finder -lang cpp -sources |
示例 1 (Code Prover):polyspace-code-prover -lang c -sources |
示例 2 (Code Prover):polyspace-code-prover -lang cpp -sources |
示例 1 (Bug Finder Server):polyspace-bug-finder-server -lang c -sources |
示例 2 (Bug Finder Server):polyspace-bug-finder-server -lang cpp -sources |
示例 1 (Code Prover Server):polyspace-code-prover-server -lang c -sources |
示例 2 (Code Prover Server):polyspace-code-prover-server -lang cpp -sources |