主要内容

在访问变量Polyspace桌面用户界面

本主题关注于Polyspace®桌面用户界面。要了解Polyspace Access web界面中的等效窗格,请参见Polyspace Access Web界面中的全局变量

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

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

对于每个变量和每次读/写访问,变量访问窗格包含相关属性。对于变量,表中列出了各种属性。

属性 描述
变量

变量的名称

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

变量的值(或值的范围)

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

#读 读取变量的次数
#写道 变量被写入的次数
写的任务 写变量的任务名
阅读任务 任务读取变量的名称
保护

是否保护共享变量不受并发访问

(只有当了使用列条目,共享

这一栏中可能的条目是:

  • 临界区:如果变量在代码的关键部分被访问

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

有关这些条目的详细信息,请参见多任务处理

使用 共享,如果变量在任务之间共享;否则,空白的
变量声明的行号
上校 变量声明的列号(从行开始的字符数)
数据类型 变量的数据类型(C/ c++数据类型或结构/类)

双击变量名可以查看对变量的读写访问操作。箭头符号变量访问窗格表示对全局变量分别执行读和写访问的函数。同样,执行读写访问的任务也用符号表示分别。有关任务的更多信息,请参见任务(入口点)

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

属性 描述
变量

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

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

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

写的任务 只有在任务:对变量进行写访问的任务名称
阅读任务 只有在任务:对变量进行读访问的任务名称
函数或任务访问变量的行号
上校 函数或任务访问变量的列号
文件

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

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

例如,考虑全局变量,SHR2

这个函数,Tserver,在文件中,tasks1.c,执行两次写操作SHR2.这在变量访问的两个实例Tserver ()根据变量,SHR2,.同样的,这两个写访问的任务,server1server2,亦列于SHR2和标记

中的变量的颜色方案变量访问面板是:

  • 黑色:全局变量。

  • 橙色:全局变量,在任务之间共享,对并发访问没有保护。

  • 绿色:全局变量,在任务间共享,不允许并发访问。

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

如果任务对全局变量执行某些操作,但操作处于不可访问的代码中,则任务是灰色的。

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

控件还可以执行以下操作变量访问窗格。

视图访问图

控件以图形格式查看对全局变量的访问操作变量访问窗格。选择全局变量并单击

下面是一个访问图的例子:

视图结构变量

对于结构化变量,请查看变量访问窗格。例如,对于结构,SHR4,窗格显示字段,SHR4。一个SHR4。B,以及对其进行读写访问的函数。

查看匿名变量的操作

可以查看对匿名变量的操作。例如,考虑下面这行代码,它声明了一个未命名的联合,变量位于绝对地址处:

联盟{char, c;int我;} @0x1234;
当你分析前面的代码和指定iar编译器中,未命名变量at0 x1234出现在变量访问窗格的名称以pstanonymous

通过全局指针访问视图

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

如果通过全局指针对变量进行读/写访问,则该访问被标记为(读)或(写)。通过本地指针进行访问的方式与其他直接访问一样。

例如,在文件中,initialisations.c的变量,加勒比海盗,声明为指向数组的指针,选项卡

在文件中c选项卡在函数中读取,插值(),通过全局指针变量,加勒比海盗.该操作显示在变量访问面板的图标。

在动态内存分配期间,内存直接分配给指针。因为列仅为非指针变量填充,不能使用此列来查找存储在动态分配的内存中的值。使用变量访问窗格中导航到指针的解引用窗格。使用此窗格中的工具提示来查找每个指针解引用后的值。

显示或隐藏呼叫者和Callees

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

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

通过单击筛选按钮隐藏不可访问代码中的读/写访问

其他功能

控件中的读/写操作不能将对全局变量或对象的寻址操作(在c++中)视为变量访问窗格。例如,考虑以下c++代码:

class C0 {public: C0() {} int get_flag() {volatile int rd;返回路;} ~C0() {} private: int a;/* Never read/ write */};C0 C0;/* c0是不可达的*/ int main() {if (c0.get_flag()) /*使用方法地址*/ {int *ptr = take_addr_of_x();返回1;} else返回0;}

您看不到方法调用c0.get_flag ()变量访问窗格,因为该调用是对属于该对象的方法的寻址操作c0