我需要为一个以指针作为输入的函数的依赖关系编写一个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
吗?
答案 0 :(得分:2)
是的,你可以。 from
的右侧部分表示哪些位置可能对\result
的值有贡献,但f
不需要从*p
读取计算\result
(如果p
当然是NULL
,则最好避免使用它)。
作为旁注,也可能针对assigns
行为的p_not_null
条款提出问题,正如p!=\null
所做的那样
并不意味着在{C}中\valid(p)
。{/ p>
尽管如此,没有行为的合同比具有行为的合同稍微精确一些,这表明当p
为NULL
时会返回一个常量值,而当p
不为null时,仅使用*p
的内容(没有行为的assigns
子句允许返回例如*p+(int)p
,甚至(int)p
)。