主要内容

要插桩的函数 (-functions-to-stub)

指定分析期间要插桩的函数

描述

指定分析期间要插桩的函数。

对于指定的函数,Polyspace® 会:

  • 忽略函数定义(即使函数定义存在也是如此)。

  • 假设函数输入和输出具有其类型所允许的完整范围的值。

设置选项

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

  • Polyspace 平台用户界面(仅限桌面端产品):在您的工程配置中,在静态分析选项卡上,选择输入和插桩节点,然后为此选项输入函数名称。

  • 命令行和选项文件:请使用 -functions-to-stub 选项。请参阅命令行信息

为何使用此选项

如果您希望分析忽略函数体中的代码,则可以对该函数进行插桩。

例如:

  • 假设您尚未完成函数编写,并且不希望分析考虑函数体。您可以使用此选项对函数进行插桩,然后指定针对其返回值和可修改参量的约束。

  • 假设函数体的分析不精确。分析会假设函数返回其返回类型允许的所有可能值。您可以使用此选项对函数进行插桩,然后指定针对其返回值的约束。

设置

无默认值

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

  • 点击“添加空行”按钮 并输入函数名称,以添加单个函数。

  • 点击“从预定义列表中添加函数”按钮 ,以从列表中选择函数。

  • 点击“添加/编辑多行”按钮 ,并在添加/编辑多行对话框中输入函数(每行一个),以添加或更新多个函数。前导空格和尾随空格将被剪除,空行将被忽略。

输入函数名称时,请使用基本语法;或者,要区分重载的函数,请使用参量语法。对于参量语法,请使用分号分隔函数参量。有关示例,请参阅以下代码和表。

//simple function

void test(int a, int b);

//C++ template function

Template <class myType>
myType test(myType a, myType b);

//C++ class method

class A {
	public:
	int test(int var1, int var2);
};


//C++ template class method

template <class myType> class A
{
	public:
	myType test(myType var1, myType var2);
};

函数类型基本语法参量语法
简单函数testtest(int; int)
C++ 模板函数testtest(myType; myType)
C++ 类方法A::testA::test(int;int)
C++ 模板类方法A<myType>::testA<myType>::test(myType;myType)

提示

  • Code Prover 会对插桩函数的参量和返回值进行假设。例如,Polyspace 假设插桩函数的返回值为完整范围。这些假设可能会影响代码其他部分的检查。请参阅Code Prover Assumptions About Stubbed Functions

  • 如果您对某个函数进行插桩,则可以对函数参量和返回值的范围设定约束。要指定约束,请使用分析选项约束设置 (-data-range-specifications)

  • 当您使用此选项时,您可能会看到文件级代码复杂度度量(例如代码行数和注释密度)发生变化,这是因为一个或多个函数体不再被分析。

  • 对于 C 函数,允许使用以下特殊字符:( ) < > ; _

    对于 C++ 函数,允许使用以下特殊字符:( ) < > ; _ * & [ ]

    C++ 函数允许使用空格字符,但 C 函数不允许。

  • 您不能使用此选项对以下 C++ 函数进行插桩:

    • constexpr 函数

    • catch 子句与整个函数体关联的函数 try 块,例如:

      Class()
          try : Class( 0.0 ) //delegate constructor
          {
              // ...
          }
          catch (...)
          {
              // exception occurred on initialization
          }

    • 具有参数包的模板函数,例如:

      template <class T, class... T2>
          X(T n, T n2, T2... rest): X(rest...) {
              v.insert(v.begin(), n);
              v.insert(v.begin(), n2);
          }

    • 具有 auto 返回类型的函数,例如:

      template <typename F, typename... Args>
      inline decltype(auto) invoke(F&& func, Args&&... args)
      {
        return invoke_impl(eastl::forward<F>(func), eastl::forward<Args>(args)...);
      }

命令行信息

参数:-functions-to-stub
无默认值
值:function1[,function2[,...]]
示例 (Code Prover):polyspace-code-prover -sources file_name -functions-to-stub function_1,function_2
示例 (Code Prover Server):polyspace-code-prover-server -sources file_name -functions-to-stub function_1,function_2