我有一个元素树。我从一些元素中获取数据,并使用该数据创建一组节点。我想要一个断言来检查,只能访问一组节点,不可能访问其他数据,例如树的其他元素中的数据。也就是说,我想确保没有数据泄漏。
这是我的元素树:
sig Element {
data: Data,
children: set Element
}
我从一些元素中收集数据。我将数据填充到节点中:
sig Node {
data: Data
}
如果有人只能访问节点集,那么就没有数据泄漏,因为节点只包含故意从树中的元素中获取的数据。
但是,出于调试目的,我向Node添加了一个字段,以引用作为Node数据源的Element:
sig Node {
data: Data,
represents: Element
}
通过意外疏忽,represents
字段未被删除。现在,有权访问该组节点的人也可以访问该树,因此可以看到比该人更多的数据。因此,存在数据泄漏的可能性。
我想创建一个断言来检查模型是否存在潜在的数据泄漏:
assert No_data_leakage { ??? }
直观地说,我希望断言能够这样说:在这个模型中的宇宙(univ)值中,只能访问节点集的人只能访问节点集中的数据值。没有其他的。我该如何表达?
以下是我的模型的简化版本。
open util/ordering[Element]
open util/ordering[Node]
sig Element {
data: Data,
children: set Element
}
one sig Root extends Element {}
sig Data {}
sig Node {
data: Data,
represents: Element
}
fact No_disconnected_elements {
all e: Element |
(e = Root) or (e in Root.^children)
}
fact Each_element_has_one_parent {
no disj e, e', e'': Element |
(e in e'.children) and (e in e''.children)
}
fact No_loops {
no e: Element | e in e.^children
}
fact First_Node_data_is_first_Element_data {
(Node <: first).data = (Element <: first).data
(Node <: first).represents = (Element <: first)
}
fact Last_Node_data_is_last_Element_data {
(Node <: last).data = (Element <: last).data
(Node <: last).represents = (Element <: last)
}
fact Every_element_has_different_data {
no disj e, e': Element | e.data = e'.data
}
run {} for 3 but 2 Node
assert No_data_leaks {
// How to express this?
}
答案 0 :(得分:1)
请参阅http://alloytools.org/quickguide/meta.html
有一种元功能允许您“迭代”Atom的字段。
assert no_data_leaks {
all f : Node$.subfields| f.value[Node] in Data
}