检测数据泄漏?

时间:2018-01-29 22:01:32

标签: alloy

我有一个元素树。我从一些元素中获取数据,并使用该数据创建一组节点。我想要一个断言来检查,只能访问一组节点,不可能访问其他数据,例如树的其他元素中的数据。也就是说,我想确保没有数据泄漏。

这是我的元素树:

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?
}

1 个答案:

答案 0 :(得分:1)

请参阅http://alloytools.org/quickguide/meta.html

有一种元功能允许您“迭代”Atom的字段。

assert no_data_leaks {
   all f : Node$.subfields| f.value[Node] in Data
}