主要内容

Polyspace 平台用户界面中的“全局变量使用”

全局变量使用窗格会显示全局变量和局部静态变量。对于每个全局变量,此窗格会列出所有对变量执行读取/写入访问的函数和任务,以及它们的属性(例如值、读取/写入访问和共享使用)。

可以使用结果详细信息窗格中的 Global Variables icon 图标,或转至视图 > 全局变量使用,来打开全局变量使用窗格。此外,您还可以在源代码窗格中选择一个全局变量,右键点击并选择显示全局变量使用情况,来打开全局变量使用窗格。

对于每个变量和每项读取/写入访问,全局变量使用窗格都包含相关属性。围绕变量,下表中列出了各种属性。

属性描述
变量

变量的名称

变量的值(或值范围)

对于指针变量,此列为空。

读取次数 变量被读取的次数
写入次数 变量被写入的次数
由任务读取 读取变量的任务数
由任务写入 写入变量的任务数
保护

共享变量是否阻止并发访问

(仅当使用列的输入值为共享时才填写)

此列中可能的输入值为:

  • 临界区:如果变量在代码的临界区中被访问

  • 时序互斥:如果变量在互斥任务中被访问

有关这些输入值的详细信息,请参阅 Polyspace® Code Prover™Polyspace Code Prover Server™ 文档。

使用 如果变量是在任务之间共享的,则为 Shared;否则为空
文件 包含变量声明的源文件
数据类型 变量的数据类型(C/C++ 数据类型或结构体/类)

点击某个变量名称可在全局变量访问窗格中查看对该变量执行的读取/写入访问操作。全局变量访问窗格中的箭头符号 Read icon(读取)和 Write icon 分别指示对全局变量执行读取和写入访问的函数。有关这些任务的详细信息,请参阅分析选项Tasks (-entry-points)

对于针对变量的访问操作,下表中列出了全局变量使用窗格中描述的各种属性。

属性描述

执行读取/写入访问的函数或任务中的变量的值或值范围

对于指针变量,此列为空。

由任务写入 仅限任务:对变量执行写入访问的任务的名称
由任务读取 仅限任务:对变量执行读取访问的任务的名称
文件 包含对变量的访问操作的源文件

全局变量访问窗格还会列出对变量执行的访问操作的作用域

例如,以全局变量 SHR2 为例:

The Global Variable Accesses pane shows that the variable SHR2 is shared among several tasks and some of the operations on SHR2 are not protected against concurrent access. The Global Variable Accesses pane also shows the possibly conflicting operations.

文件 tasks1.c 中的函数 Tserver()SHR2 执行两个写入操作。在全局变量访问窗格中,这由表中标有 Write icon 的两个 Tserver() 实例予以指示。类似地,任务 initregulate() 的读取访问也列在表中并标有 Read icon

全局变量使用窗格中用于变量的颜色方案为:

  • 黑色:全局变量。

  • 橙色:在任务之间共享的且不阻止并发访问的全局变量。

  • 绿色:在任务之间共享的且阻止并发访问的全局变量。

  • 灰色:已声明但在可达代码中未使用的全局变量。

如果某个任务对全局变量执行某些操作,但这些操作在不可达代码中,则该任务将被着色为灰色

全局变量使用窗格中获取的有关全局变量和读取/写入访问操作的信息称为数据字典。

您还可以从全局变量使用窗格执行以下操作。

  • 查看结构化变量

    对于结构化变量,双击全局变量使用窗格中的变量以查看各个字段。例如,对于结构体 SHR4,该窗格会显示字段 SHR4.ASHR4.B,以及对它们执行读取/写入访问的函数。

    On the Global Variables Usage pane, you can expand a structured variable on the Variables column to see the structure fields.

  • 查看通过全局指针执行的访问

    如果对变量的读取/写入访问是通过全局指针间接执行的,则该访问会标有 Global read icon(读取)或 Global write icon(写入)。

    例如,在文件 initialisations.c 中,变量 arr 被声明为指向数组 tab 的指针。

    在文件 main.c 中,函数 interpolation() 通过指针变量 arr 读取了 tab。此操作显示在全局变量访问窗格中,带有一个 Global read icon 图标。点击全局变量访问窗格中的表中的行,可在源代码窗格中显示相关代码行。

    The Global Variables Accesses pane showing the variable tab is read in the function interpolation()

    在动态内存分配期间,内存被直接分配给指针。由于只有非指针变量的列已填充,因此无法通过此列查找在动态分配的内存中存储的值。请使用全局变量窗格来导航到窗格中该指针的解引用。使用此窗格中的工具提示查找跟在每个指针解引用后的值。

  • 显示/隐藏调用方和被调用方

    自定义全局变量使用窗格以仅显示共享变量。在全局变量使用窗格工具栏上,点击“非共享变量”按钮 Global Variables icon 以显示或隐藏非共享变量。

  • 隐藏不可达代码中的访问

    通过点击 Show/Hide unreachable variables icon 图标可隐藏出现在不可达代码中的读取/写入访问。

限制

全局变量使用窗格中,对全局变量或对象(在 C++ 中)的寻址操作不会显示为读取/写入操作。以如下 C++ 代码为例:

class C0 
{ 
public: 
  C0() {} 
  int get_flag() 
  { 
    volatile int rd; 
    return rd; 
  } 
  ~C0() {} 
private: 
  int a;                /* Never read/written */ 
}; 

C0 c0;                  /* c0 is unreachable */ 

int main() 
{ 
  if (c0.get_flag())    /* Uses address of the method */ 
    { 
      int *ptr = take_addr_of_x(); 
      return 1; 
    } 
  else 
    return 0; 
}

您在全局变量使用窗格中不会看到方法调用 c0.get_flag(),因为该调用是对属于对象 c0 的方法的寻址操作。