- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有哪些代码示例可以证明KeY的优势?
细节
有了这么多的正式方法工具,我想知道KeY在哪些方面比其竞争对手更好,以及如何?一些可读的代码示例对于比较和理解非常有帮助。
更新
搜索the KeY website时,我发现了the book中的代码示例-那里是否有合适的代码示例?
此外,我找到了a paper about the bug that KeY found in Java 8’s mergeCollapse in TimSort。 TimSort的最少代码可以证明KeY的实力吗?但是,我不明白为什么模型检查应该找不到该错误-具有64个元素的位数组不应太大而无法处理。其他演绎验证工具是否同样能够发现错误?
是否存在建立有适当代码示例的验证竞赛?
最佳答案
这是一个非常棘手的问题,这就是为什么在一年多前被问到之后为什么还没有得到答案的原因(尽管我们来自KeY社区的人们都知道这一点……)。
互动的力量
首先,我想指出的是,KeY基本上是那里唯一允许进行Java程序的交互式证明的工具。尽管许多证明会自动运行,并且我们有非常强大的自动策略,但有时需要进行交互才能理解证明失败的原因(太弱甚至错误的规范,错误的代码或“仅仅是”证明者的能力不足)并添加适当的更正或增强。
验证检查的反馈
尤其是在证明方无能力的情况下(规格和程序都可以,但是问题很难使证明方自动成功),交互是一项强大的功能。许多程序证明者(例如OpenJML,Dafny,Frama-C等)都依赖于后端的SMT求解器,并以或多或少的小型验证条件作为输入。然后,将这些条件的验证状态报告给用户,基本上是通过或失败-或超时。当断言失败时,用户可以更改程序或完善规范,但不能检查证明的状态以推断出出了什么原因。这种样式有时称为“自动活跃”,而不是交互式。尽管这在很多情况下非常方便(尤其是在通过验证时,因为SMT求解器可以非常迅速地证明某些东西),但可能很难挖掘SMT求解器的输出以获取信息。甚至SMT求解器本身也不知道出了什么问题的原因(尽管他们可以提供反例),因为他们只是被提供了一组试图寻找矛盾的公式。
TimSort:复杂的算法问题
对于您提到的TimSort证明,我们必须进行大量交互才能使它们通过。以排序算法的mergeHi方法为例,该方法已被我所知的最有经验的KeY高级用户之一证明。在460K证明节点的证明中,需要3K用户交互,包括很多简单的交互,例如隐藏分散注意力的公式,还包括478个量词实例化和大约300个割断(在线引理引入)。该方法的代码具有许多困难的Java功能,例如带有标记中断,整数溢出,位算术等的嵌套循环。特别是,在证明树中分支有很多潜在的例外情况和其他原因(这就是为什么在证明中还使用了五个手动状态合并规则应用程序的原因)。证明此方法的工作流程主要是尝试一些策略,然后检查证明状态,修剪证明并引入有用的引理,以减少总体证明工作并重新开始;有时,如果策略本身无法直接找到正确的实例,则可以手动实例化量词,并合并证明分支以应对状态爆炸。我只是在这里声称,(至少当前)使用自动工具无法证明该代码,在这种情况下,您不能以这种方式指导证明者,也无法获得正确的反馈以了解如何进行指导。
KeY的力量
最后,我要说的是KeY在证明棘手的算法问题(例如排序等)方面很强,在这些问题中,复杂的量化不变量和整数算术存在溢出,并且需要通过检查和交互来快速找到量词实例化和小引理。具有证明状态。半交互式验证的KeY方法在SMT求解程序超时的情况下通常也很出色,这样用户无法分辨出是什么问题还是需要附加的引理。
KeY当然也可以证明“简单”的问题,但是您需要注意程序中不要包含不受支持的Java功能(例如浮点数或多线程)。同样,如果尚未在JML中指定库方法,则可能是一个很大的问题(但此问题也适用于其他方法)。
持续发展
顺便提一句,我还想指出,KeY现在越来越多地转变成一个平台,用于对各种程序属性(不仅是Java程序的功能正确性)进行静态分析。一方面,我们开发了诸如Symbolic Execution Debugger之类的工具,非专家也可以使用这些工具来检查顺序Java程序的行为。另一方面,我们目前正在忙于重构系统的体系结构,以便可以为不同于Java的语言添加前端(在我们的内部项目“ KeY-RED”中);此外,正在不断进行现代化的Java前端工作,以支持诸如Lambdas之类的更新语言功能。我们还在研究诸如编译器正确性之类的关系属性。尽管我们已经支持第三方SMT求解器的集成,但我们的集成逻辑核心仍将在那里支持理解SMT和自动化失败情况下的证明情况和手动交互。
TimSort代码示例
既然您要求一个代码示例...我想不起来想到显示KeY实力的“那个”代码示例,但是也许是为了给您带来TimSort算法中mergeHi复杂性的味道,这里是一段简短的摘录,内含一些注释(完整方法大约有100行代码):
private void mergeHi(int base1, int len1, int base2, int len2) {
// ...
T[] tmp = ensureCapacity(len2); // Method call by contract
System.arraycopy(a, base2, tmp, 0, len2); // Manually specified library method
// ...
a[dest--] = a[cursor1--]; // potential overflow, NullPointerException, ArrayIndexOutOfBoundsException
if (--len1 == 0) {
System.arraycopy(tmp, 0, a, dest - (len2 - 1), len2);
return; // Proof branching
}
if (len2 == 1) {
// ...
return; // Proof branching
}
// ...
outer: // Loop labels...
while (true) {
// ...
do { // Nested loop
if (c.compare(tmp[cursor2], a[cursor1]) < 0) {
// ...
if (--len1 == 0)
break outer; // Labeled break
} else {
// ...
if (--len2 == 1)
break outer; // Labeled break
}
} while ((count1 | count2) < minGallop); // Bit arithmetic
do { // 2nd nested loop
// That's one complex statement below...
count1 = len1 - gallopRight(tmp[cursor2], a, base1, len1, len1 - 1, c);
if (count1 != 0) {
// ...
if (len1 == 0)
break outer;
}
// ...
if (--len2 == 1)
break outer;
count2 = len2 - gallopLeft(a[cursor1], tmp, 0, len2, len2 - 1, c);
if (count2 != 0) {
// ...
if (len2 <= 1)
break outer;
}
a[dest--] = a[cursor1--];
if (--len1 == 0)
break outer;
// ...
} while (count1 >= MIN_GALLOP | count2 >= MIN_GALLOP);
// ...
} // End of "outer" loop
this.minGallop = minGallop < 1 ? 1 : minGallop; // Write back to field
if (len2 == 1) {
// ...
} else if (len2 == 0) {
throw new IllegalArgumentException(
"Comparison method violates its general contract!");
} else {
System.arraycopy(tmp, 0, a, dest - (len2 - 1), len2);
}
}
关于verification - KeY验证工具在哪里发光?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46754018/
在 JSF2 应用程序中遇到验证属性的问题时,有两种主要方法。 使用 Annotation 在 ManagedBean 上定义验证 @ManagedBean public class MyBean {
我想实现一个不常见的功能,我认为 jquery 验证插件将是最好的方法(如果您在没有插件的情况下建议和回答,我们也会欢迎)。我想在用户在输入字段中输入正确的单词后立即隐藏表单。我试过这个: $("
我有几个下拉菜单(类名为month_dropdown),并且下拉菜单的数量不是恒定的。我怎样才能为它们实现 NotEqual 验证。我正在使用 jQuery 验证插件。 这就是我写的 - jQuery
我设法制作了这个网址验证代码并且它起作用了。但我面临着一个问题。我认为 stackoverflow 是获得解决方案的最佳场所。 function url_followers(){ var url=do
我目前正在使用后端服务,该服务允许用户在客户端应用程序上使用 Google Games 库登录。 用户可以通过他们的 gplay ID 向我们发送信息,以便登录或恢复旧帐户。用户向我们发送以下内容,包
我正在尝试验证输入以查看它是否是有效的 IP 地址(可能是部分地址)。 可接受的输入:172、172.112、172.112.113、172.112.113.114 Not Acceptable 输入
我从 Mongoose 验证中得到这条消息: 'Validator failed for path phone with value ``' 这不应该发生,因为不需要电话。 这是我的模型架构: var
我一直在尝试使用Python-LDAP (版本 2.4.19)在 MacOS X 10.9.5 和 Python 2.7.9 下 我想在调用 .start_tls_s() 后验证与给定 LDAP 服务
我正在处理一个仅与 IE6 兼容的旧 javascript 项目(抱歉...),我想仅在 VS 2017 中禁用此项目的 ESLint/CSLint/Javascript 验证/CSS 验证。 我知道
我正在寻找一种方法来验证 Spring 命令 bean 中的 java.lang.Double 字段的最大值和最小值(一个值必须位于给定的值范围之间),例如, public final class W
我正在尝试在 springfuse(JavaEE 6 + Spring Framework (针对 Jetty、Tomcat、JBoss 等)) 和 maven 的帮助下构建我的 webapps 工作
我试图在我们的项目中使用 scalaz 验证,但遇到了以下情况: def rate(username: String, params: Map[String, String]): Validation
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
我有一个表单,人们可以单击并向表单添加字段,并且我需要让它在单击时验证这些字段中的值。 假设我单击它两次并获取 2 个独立的字段集,我需要旋转 % 以确保它在保存时等于 100。 我已放入此函数以使其
在我的页面中有一个选项可以创建新的日期字段输入框。用户可以根据需要创建尽可能多的“截止日期”和“起始日期”框。就像, 日期_to1 || date_from1 日期到2 ||日期_from2 date
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
有没有办法在动态字段上使用 jquery 验证表单。 我想将其设置为必填字段 我正在使用 Jsp 动态创建表单字段。 喜欢 等等...... 我想使用必需的表单字段验证此表单字段。 最佳答
嗨,任何人都可以通过提供 JavaScript 代码来帮助我验证用户名文本框不应包含数字,它只能包含一个字符。 最佳答案 使用正则表达式: (\d)+ 如果找到匹配项,则字符串中就有一个数字。 关于J
我有两个输入字段holidayDate和Description(id=tags) $(document).ready(function() {
我遇到了这个问题,这些验证从电子邮件验证部分开始就停止工作。 我只是不明白为什么即使经过几天的观察,只是想知道是否有人可以在这里指出我的错误? Javascript部分: function valid
我是一名优秀的程序员,十分优秀!