Main Content

Polyspace 桌面端用户界面中的变量访问

本主题侧重于 Polyspace® 桌面端用户界面。若要了解 Polyspace Access Web 界面中的等效窗格,请参阅Polyspace Access Web 界面中的全局变量 (Polyspace Access)

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

要打开此窗格,请在 Polyspace 桌面端用户界面中选择结果详细信息窗格中的 按钮。

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

属性描述
变量

变量的名称

文件包含变量声明的源文件

变量的值(或值范围)

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

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

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

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

此列中可能的输入值为:

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

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

有关这些输入值的详细信息,请参阅多任务

使用如果变量是在任务之间共享的,则为 Shared;否则为空
变量声明的行号
变量声明的列号(从行开头算起的字符数)
数据类型变量的数据类型(C/C++ 数据类型或结构体/类)

双击某个变量名称可查看已对该变量执行的读取/写入操作。变量访问窗格中的箭头符号 分别指示对全局变量执行读取和写入访问的函数。类似地,执行读取和写入访问的任务分别由符号 予以指示。有关这些任务的更多信息,请参阅 Tasks (-entry-points)

围绕对变量的访问操作,下表中列出了窗格中描述的各种属性。

属性描述
变量

对变量执行读取/写入访问的函数(或任务)的名称

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

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

由任务写入仅限任务:对变量执行写入访问的任务的名称
由任务读取仅限任务:对变量执行读取访问的任务的名称
函数或任务访问变量的行号
函数或任务访问变量的列号
文件

包含对变量的访问操作的源文件

如果此列包含名称 __polyspace__stdstubs.c,则表明该变量是在标准库函数内部被访问的。

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

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

变量访问窗格中用于变量的颜色方案为:

  • 黑色:全局变量。

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

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

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

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

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

您还可以从变量访问窗格执行以下操作。

查看访问图

使用变量访问窗格以图形格式查看对全局变量的访问操作。选择全局变量,然后点击

下面是访问图的示例:

查看结构化变量

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

查看对匿名变量的操作

您可以查看对匿名变量的操作。例如,以下面的代码行为例,它声明了一个未命名并集,其中的变量位于绝对地址:

union {char, c; int i; } @0x1234;
分析前面的代码并指定 iar 编译器时,位于 0x1234 的未命名变量将出现在变量访问窗格中,且其名称以 pstanonymous 开头。

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

查看通过全局指针间接对全局变量执行的访问操作。

如果对变量的读取/写入访问是通过全局指针执行的,则该访问会标有 (读取)或 (写入)。通过指针执行的访问与任何其他直接访问的显示是相同的。

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

在文件 main.c 中,函数 interpolation() 通过全局指针变量 arr 读取了 tab。此操作显示在变量访问窗格中,带有一个 图标。

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

显示或隐藏调用方和被调用方

自定义变量访问窗格以仅显示共享变量。在变量访问窗格工具栏上,点击“非共享变量”按钮 以显示或隐藏非共享变量。

显示或隐藏不可达代码中的访问

通过点击过滤器按钮 可隐藏出现在不可达代码中的读取/写入访问。

其他特征

变量访问窗格中,对全局变量或对象(在 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 的方法的寻址操作。