编写一个计算机程序以分析另一个计算机程序的质量?

时间:2019-03-31 10:40:20

标签: testing automated-tests z3 software-quality

我有兴趣了解这种可能性。我正在做一个验证软件工程师技能的项目,目前,我们基于经过认证的开发人员的代码审查来验证技能。

我比问题更完整地知道答案,我无法想象程序必须能够分析复杂的代码有多复杂,但是我从基本的编程面试问题入手。

例如,经典的FizzBu​​zz问题:

编写一个程序,打印从1到20的数字。但是,对于三个打印数字“ Fizz”(而不是数字)的倍数,以及五个打印“嗡嗡声”的倍数。对于三和五的倍数的数字,请打印“ FizzBu​​zz”。

及以下是python中的解决方案:

for num in range(1,21):
    string = ""
    if num % 3 == 0:
        string = string + "Fizz"
    if num % 5 == 0:
        string = string + "Buzz"
    if num % 5 != 0 and num % 3 != 0:
        string = string + str(num)
    print(string)

问题是,我们可以以编程方式分析此解决方案的有效性吗?

我想知道是否有人尝试过这种方法,以及是否有当前的实现方式可以看看。另外,如果有人使用过z3,并且可以使用它来解决此问题。

2 个答案:

答案 0 :(得分:1)

让我们这样说:数学上已经证明您不能确定是否某个程序将终止。因此,如果您想要一个数学上完美的答案,即目标程序是否正确,那注定要失败。

也就是说,您仍然可以进行单元测试和“整理”,这将为您提供大量的集成见解。

但是对于像FizzBu​​zz这样的简单代码段,我认为经验丰富的开发人员的眼球注视可能会带来最佳效果。

答案 1 :(得分:1)

如Vilx-所述,通常无法确定程序的正确性(包括它们是否终止)。但是,诸如Z3之类的工具表明,尽管该问题的总体不确定性,仍可以对相关的具体案例进行推理。

静态分析器通常查找“简单”问题(例如,空引用,越界访问,数值溢出),但速度相对较快,并且几乎不需要用户指导(请参阅向代码中添加类型注释的精神。

要搜索的关键字的非详尽列表(且带有偏见):“静态分析器”,“抽象解释”; “ facebook推断”,“空客遗弃”,“ juliasoft”。

Verifiers 试图证明更丰富的属性,尤其是功能正确性,例如“这种排序实现是否真的对我的数组进行了排序(并且不执行其他任何操作,例如,释放一些全局内存或更新可从数组访问的元素)?”或“该加密实现是否真的实现了它承诺实现的加密协议?”。这是一项很多的艰巨任务,而该研究领域的工具通常相当缓慢,需要具有正式验证背景和重要用户指导背景的专家用户。

要搜索的关键字的非穷尽(且带有偏见)列表:“验证”,“占位逻辑”,“分离逻辑”; “ eth viper”,“ microsoft dafny”,“ kuleuven verifast”,“ microsoft f *”。

其他形式方法存在,例如改进(或按结构校正),但所需的工具支持甚至更少,据我所知,行业认可度。