Page 158 - 《软件学报》2025年第8期
P. 158

徐家乐 等: 操作系统内核权能访问控制的形式验证                                                        3581



                 7.  if(z == success){
                 8.   return revoke_success;
                 9.  }else{
                 10.    return revoke_failure;
                 11.  }
                 }

                    内部函数    cnode_revoke_kernel 的函数代码  (实现  2) 首先取值  prio  任务对应的权能节点, 然后在不为空的情况
                 下, 调用  deleterec 函数进行实际递归撤销操作, 并且返回         success, 其他情况均为错误情况, 返回      failure.
                 实现  2. 函数  cnode_revoke_kernel 代码.

                 Int cnode_revoke_kernel (Int8u prio, Int8u type, Int8u capability)
                 {
                 1.  cspace* pcspace;
                 2.  pcspace = OSCSpacePrioTbl[prio];
                 3.  if(pCSpace != NULL){
                 4.   deleterec(pcspace, type, capability);
                 5.  }else{
                 6.   return success;
                 7.  }
                 8.   return failure;
                 }

                    内部函数    deleterec 的函数代码  (实现  3) 先删除当前节点     cspace 对应的权能, 然后初始化一个变量         i 为  0, 将
                 其用作循环变量, 递归调用        deleterec 函数来删除后代所有节点的权能.

                 实现  3. 函数  deleterec 代码.

                 void deleterec (CSPACE* cspace, Int8u type, Int8u capability)
                 {
                 1.  … /*分为  category  和  object 两种情况分类讨论, 删除  cspace 对应的权能*/
                 2.  Int8u i = 0;
                 3.  while(i < cspace → childnum){
                 4.   deleterec(cspace → cspacechildren[i], type, capability);
                 5.   i++;
                 6.  }
                 }

                    基于以上函数调用关系, 实现         1, 2  和  3  共同构成了  cnode_revoke 函数的实现.

                 4.3.2.2    接口函数  cnode_revoke 的形式规范
                    由于   API 函数  cnode_revoke  的正确性依赖于内核函数       cnode_revoke_kernel 的正确性, 内核函数    cnode_
                 revoke_kernel 的正确性依赖于    deleterec  的正确性, 所以我们将按照由底向上的顺序依次建立各个函数的规范.
                 deleterec 涉及  while 循环和递归调用, 对该函数的规范和验证, 同时具有以下两个需求.
                    ● 使用递归断言来描述函数执行前后权能空间的改变, 对应                  while 循环的不变式.
   153   154   155   156   157   158   159   160   161   162   163