微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查找破坏输出后置条件的函数的输入

如何解决查找破坏输出后置条件的函数的输入

我有一个编程语言的函数,例如C.我要求函数输出满足某个条件。如果此函数的某些输入不满足要求的条件,我需要找到任何这样的确切输入。

一般情况下我需要这样做,但对于相当简单的功能,例如循环次数是固定的,不依赖于输入。另一个要求是我需要非常快地做到这一点。我发现 CBMC 工具 [https://www.cprover.org/cbmc/] 可能对我有帮助,但我不确定如何使用它。我也欢迎将问题转换为 CNF 公式的解决方案(但我仍然需要检索反例输入)。

函数示例:

int function(int n) {
    int m = 0;
    for(int i = 1; i < 8; i++) {
        m += n*i;
    }
    int output = m % 11;
    return output;
}
// POSTCONDITION: require the output < 10 for all inputs
// VERIFICATION: this is not true,the counterexample is the input n=9.

解决方法

考虑这个完全没有循环的简单函数:

bool function (int a,int b,int c)
{
   bool answer = a*a*a + b*b*b + c*c*c != 42;
   // POSTCONDITION: require answer==true
}

我们用了几百个计算机年(或者,在 500,000 台强大的 PC 网格上实际花费了几周时间)才发现存在一个 counterexample (pdf):

(−80538738812075974)3 + 804357581458175153 + 126021232973356313 = 42

能够非常快地完成这项工作的程序确实是一个非常非常好的程序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。