本主题关注于Polyspace®桌面用户界面。要了解Polyspace Access web界面中的等效窗格,请参见Polyspace Access Web界面中的全局变量.
的变量访问窗格显示全局变量(和局部静态变量)。对于每个全局变量,该窗格列出了对变量执行读/写访问的所有函数和任务,以及它们的属性,如值、读/写访问和共享使用。
要打开此窗格,请在Polyspace桌面用户界面中选择按钮结果细节窗格。
对于每个变量和每次读/写访问,变量访问窗格包含相关属性。对于变量,表中列出了各种属性。
属性 | 描述 |
---|---|
变量 | 变量的名称 |
文件 | 包含变量声明的源文件 |
值 | 变量的值(或值的范围) 对于指针变量,此列为空。 |
#读 | 读取变量的次数 |
#写道 | 变量被写入的次数 |
写的任务 | 写变量的任务名 |
阅读任务 | 任务读取变量的名称 |
保护 | 是否保护共享变量不受并发访问 (只有当了使用列条目,共享) 这一栏中可能的条目是:
有关这些条目的详细信息,请参见多任务处理. |
使用 | 共享 ,如果变量在任务之间共享;否则,空白的 |
行 | 变量声明的行号 |
上校 | 变量声明的列号(从行开始的字符数) |
数据类型 | 变量的数据类型(C/ c++数据类型或结构/类) |
双击变量名可以查看对变量的读写访问操作。箭头符号和在变量访问窗格表示对全局变量分别执行读和写访问的函数。同样,执行读写访问的任务也用符号表示和分别。有关任务的更多信息,请参见任务(入口点)
.
对于对变量的访问操作,该表中列出了窗格中描述的各种属性。
属性 | 描述 |
---|---|
变量 | 对变量执行读/写访问的函数(或任务)的名称 |
值 | 执行读/写访问的函数或任务中变量的值或范围 对于指针变量,此列为空。 |
写的任务 | 只有在任务:对变量进行写访问的任务名称 |
阅读任务 | 只有在任务:对变量进行读访问的任务名称 |
行 | 函数或任务访问变量的行号 |
上校 | 函数或任务访问变量的列号 |
文件 | 包含对变量的访问操作的源文件 如果该列包含名称 |
例如,考虑全局变量,SHR2
:
这个函数,Tserver
,在文件中,tasks1.c
,执行两次写操作SHR2
.这在变量访问的两个实例Tserver ()
根据变量,SHR2
,.同样的,这两个写访问的任务,server1
和server2
,亦列于SHR2
和标记.
中的变量的颜色方案变量访问面板是:
黑色:全局变量。
橙色:全局变量,在任务之间共享,对并发访问没有保护。
绿色:全局变量,在任务间共享,不允许并发访问。
灰色:全局变量,声明但不在可达代码中使用。
如果任务对全局变量执行某些操作,但操作处于不可访问的代码中,则任务是灰色的。
的全局变量信息和读/写访问操作变量访问窗格称为数据字典。
控件还可以执行以下操作变量访问窗格。
控件以图形格式查看对全局变量的访问操作变量访问窗格。选择全局变量并单击.
下面是一个访问图的例子:
对于结构化变量,请查看变量访问窗格。例如,对于结构,SHR4
,窗格显示字段,SHR4。一个
和SHR4。B
,以及对其进行读写访问的函数。
可以查看对匿名变量的操作。例如,考虑下面这行代码,它声明了一个未命名的联合,变量位于绝对地址处:
联盟{char, c;int我;} @0x1234;
iar
编译器中,未命名变量at0 x1234
出现在变量访问窗格的名称以pstanonymous.
通过全局指针间接执行对全局变量的视图访问操作。
如果通过全局指针对变量进行读/写访问,则该访问被标记为(读)或(写)。通过本地指针进行访问的方式与其他直接访问一样。
例如,在文件中,initialisations.c
的变量,加勒比海盗
,声明为指向数组的指针,选项卡
.
在文件中c
,选项卡
在函数中读取,插值()
,通过全局指针变量,加勒比海盗
.该操作显示在变量访问面板的图标。
在动态内存分配期间,内存直接分配给指针。因为值列仅为非指针变量填充,不能使用此列来查找存储在动态分配的内存中的值。使用变量访问窗格中导航到指针的解引用源窗格。使用此窗格中的工具提示来查找每个指针解引用后的值。
自定义变量访问窗格以只显示共享变量。在变量访问窗格工具栏,单击“非共享变量”按钮显示或隐藏非共享变量。
通过单击筛选按钮隐藏不可访问代码中的读/写访问.
控件中的读/写操作不能将对全局变量或对象的寻址操作(在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
.