主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

内联 (-inline)

指定必须要为对其的每次调用在内部创建克隆的函数

描述

此选项仅影响 Polyspace® Code Prover™ 分析。

指定验证操作必须要为对其的每次调用在内部创建克隆的函数。

设置选项

用户界面(仅限在桌面端产品中):在您的工程配置中,-inline 选项位于缩放节点上。

用户界面(仅限 Polyspace 平台、桌面端产品):在您的工程配置中,此选项位于运行时错误 > 精确度节点的静态分析选项卡上。

命令行和选项文件:请使用 -inline 选项。请参阅命令行信息

为何使用此选项

使用 -inline 可以在函数调用时,在内部对此函数创建克隆。这样做可能会降低 Polyspace Code Prover 的分析复杂度。请参考以下代码:

void foo(int* p);
void bar(){
	int* intP, intP2;
	foo(intP);
	foo(intP2)
}
在此代码中,Polyspace 分析函数 foo()bar()。未指定 -inline 选项时,分析操作将跟踪三个对象:指针 intPintP2 和参数 p。如果指定了 -inline 选项,则 Polyspace 会在每个函数调用时在内部克隆 foo。代码实际上变为:
void foo_clone1(int* p);
void foo_clone2(int* p);
void bar(){
	int* intP, intP2;
	foo_clone1(intP);
	foo_clone2(intP2)
}
分析 foo_clone1() 函数仅需要 Polyspace 跟踪 intPp 这两个对象而不是三个对象。对于函数 foo_clone2() 也是如此。通过使用 -inline,您降低了分析复杂度并增加了要分析的代码量。

使用 -inline 可能会降低分析复杂度,同时也会增加要分析的代码量。此选项可能有助于解决特定情况下的规模问题。对于某些函数,技术支持可能会要求您使用此选项。使用此选项会更改 Polyspace Code Prover 检查结果的颜色的含义。请参阅设置

请避免使用此选项来区分对同一函数的不同调用中 Code Prover 检查结果的颜色。应该改用敏感度上下文 (-context-sensitivity) 选项。

设置

无默认值

输入函数名称或从列表中进行选择。

  • 点击 可添加一个字段并输入函数名称。

  • 点击 可列出代码中的函数。从列表中选择函数。

验证操作会在每个调用时在内部克隆该函数。例如,如果您指定将函数 func 内联并两次调用 func,则软件会在内部创建 func 的两个副本用于验证。

不过,对于函数体中的每个运行时检查,您在验证结果中只会看到一种颜色。检查结果颜色的语义与正常指定时的语义不同。

检查类型不使用 -inline 选项时的结果颜色使用 -inline 选项时的结果颜色
橙色检查 如果一个函数被调用两次,并且某个运算在其中一次调用中导致了确定的错误,则检查颜色为橙色。如果一个函数被调用两次,并且某个运算在其中一次调用中导致了确定的错误,则检查颜色为暗橙色。此检查在结果列表中显示有一个橙色感叹号。
灰色检查 如果一个函数被调用两次,并且 if 语句分支在其中一次调用中不可达,则该分支不会显示为灰色。 如果一个函数被调用两次,并且 if 语句分支在其中一次调用中不可达,则该分支会显示为灰色。

在每一项对内联函数的检查的下方,可以看到特定于每个调用上下文的信息。例如,如果一个特定的函数调用导致了明确的除以零错误,一个橙色感叹号会出现在除以零的旁边,您可以识别该调用以及该调用产生的值。

Polyspace results for inlined functions

不要使用此选项来理解结果。仅当某个函数导致规模问题时才使用此选项。

提示

  • 根据别名验证提供的提示选择要内联的函数。

  • 不要将此选项用于入口函数,包括 main

  • 使用此选项会增加灰色检查不可达代码的数量。

    例如,在下面的代码中,如果您为内联输入 max,则会为对 max 的每个调用显示两个不可达代码检查。

    int max(int a, int b) {
      return a > b ? a : b;
    } 
    
    void main() {
      int i=3, j=1, k;
      k=max(i,j);
      i=0;
      k=max(i,j);
    }
  • 如果您在函数定义前使用关键字 inline,将定义放入头文件中并从多个源文件调用该函数,则结果与使用内联选项时相同。

  • 对于 C++ 代码,此选项适用于某个类的所有重载的方法。

命令行信息

参数:-inline
值:function1[,function2[,...]]
无默认值
示例 (Code Prover):polyspace-code-prover -sources file_name -inline func1,func2
示例 (Code Prover Server):polyspace-code-prover-server -sources file_name -inline func1,func2