在ACSL依赖项中使用可能无效的指针

时间:2013-06-06 13:48:01

标签: frama-c

我需要为一个以指针作为输入的函数的依赖关系编写一个ACSL规范,并在指针处于非NULL状态时使用其内容。 我认为这个规范是正确的:

/*@ behavior p_null:
      assumes p == \null;
      assigns \result from \nothing;
    behavior p_not_null:
      assumes p != \null;
      assigns \result from *p;
*/
int f (int * p);

但我宁愿避免这些行为,但我不知道这是否正确(等效):

//@ assigns \result from p, *p;
int f (int * p);

即使*p可能是\from,我也可以在p的右侧使用NULL吗?

1 个答案:

答案 0 :(得分:2)

是的,你可以。 from的右侧部分表示哪些位置可能\result的值有贡献,但f不需要从*p读取计算\result(如果p当然是NULL,则最好避免使用它)。 作为旁注,也可能针对assigns行为的p_not_null条款提出问题,正如p!=\null所做的那样 并不意味着在{C}中\valid(p)。{/ p>

尽管如此,没有行为的合同比具有行为的合同稍微精确一些,这表明当pNULL时会返回一个常量值,而当p不为null时,仅使用*p的内容(没有行为的assigns子句允许返回例如*p+(int)p,甚至(int)p)。