新闻
2021-04-15:课程网站现已上线。如果你想对本课程内容留下深刻印象,你可以观看去年讲座的三段视频.
动机
你曾经写过不能正常工作的计算程序吗?也许对于局外人来说,每个程序员的反应都是“是的”,这令人惊讶,因为特别是在软件开发过程中,错误的程序是规则而非例外。
我们如何处理代码中经常出现错误的问题?有两种典型的方法:
- 我们可以编写测试。如果程序产生预期的输出,我们检查给定的输入
- 我们可以非常仔细地分析代码。
即使您非常仔细地分析代码并进行了一些测试,您的代码中是否有错误?即使对于这个问题,答案“是”也不奇怪,因为测试不能捕获程序的所有行为,而且代码分析是冗长且容易出错的。从我们日常使用电子设备的经验中,我们知道不仅计算机科学专业的学生,而且专业程序员经常无法编写正确的代码。事实上,有一长串昂贵或安全关键的故障软件系统表明,问题不仅在于程序员的草率,还在于需要新的方法来提高软件的可靠性。
在这节课中,我们将学习一种称为软件验证的方法。首先,我们将正式声明属性,例如,如果程序到达第42行,则变量x为正,或者如果输入与23不同,则不会发生溢出。然后我们将学习如何编写数学证明,证明给定的程序满足给定的属性。
不幸的是,找到这样的数学证明可能会很枯燥和困难,而且人类在给出数学证明时也容易出错。因此,我们希望让计算机完成这项任务。
在这节课中,我们将看到一些算法,这些算法使计算机能够发现计算机程序中的错误,或者找到证明没有错误的证据。
目录
虽然我们将使用工具,但这是一个理论性的讲座,我们将在其中学习程序验证的基本概念。
我们经常将问题归结为逻辑公式的可满足性问题。(因此,如果你不喜欢数学逻辑,你可能不想听这节课。)例如,下面公式的一个令人满意的赋值将向我们展示如何违反所描述程序中的断言语句。
x_0>=0/\y_0>=0/\ x_0<=4294967296/\y_0<=4294967296/\x_0+y_0<=42/\y_0>=100/\x_1=(2*x_0-y_0)%4294967296/\x+y<100
|
void foo(无符号int x,无符号int y){而(x+y<=42){如果(y>=100){x=2*x-y;//@断言(x+y>=100);}年++}}
|
|
|
为了熟悉逻辑推理,本课程将从命题逻辑和一阶逻辑的介绍开始。然后,我们将正式介绍霍尔微积分,它将允许我们说明程序的正确性,并给出程序正确的数学证明。
在整个讲座中,我们将使用类似Z3 SMT求解器或Ultimate Automizer软件验证程序为了在实际例子中看到我们的算法的效果。例如,如果我们想知道下面的C程序是否正确,我们可以询问Ultimate Automizer.
|
整型main(){无符号字符pos=getInitialPosition();整数arr[256];而(1){arr[pos]=获取下一个值();arr[pos+1]=getNextValue();位置+=2;}返回0;}
|
|
|
在线学习
课程将在网上组织伊利亚斯体系主要课程材料是幻灯片和练习。此外,我们将通过BigBlueButton,集成在Ilias中。交互式会话不会被录制。
幻灯片集由三种幻灯片组成。首先,我会在演示中展示一些幻灯片。其中一些幻灯片附有附加的幻灯片(带有紫色文本的幻灯片),其中包含我在演示时要说的信息。此外,还有一些类似标题页的幻灯片,背景为蓝色,告诉您下一个虚拟教室中讨论的幻灯片范围。
这些幻灯片与课堂讲稿非常相似,目的是让你阅读这些幻灯片之前接下来的交互式会话。你为理解幻灯片所做的努力将得到你提交的练习的支持之前接下来的交互式会话。在互动环节中,我们将快速浏览幻灯片,只讨论您的问题。此外,我们将讨论您的练习解决方案。
我们很高兴能改进课程材料。如果你有问题,并且你认为应该更详细地解释一些事情,那么请让我们知道。
幻灯片
讲座幻灯片是主要的课程材料。从第2节开始,幻灯片上添加了附加信息,可以看作是一种讲稿。
幻灯片将经常更新。我们不仅会添加新的内容,还会根据互动会议中的问题插入包含额外信息的幻灯片。
练习
练习表将在伊利亚斯上传和提交(电子版)。
- 练习表将于每周三晚上上传,并应于下周一提交(伊利亚斯)。
- 此外,周一我们将有简短的练习表,为周三之前提交的下一堂课做准备。
考试
考试期间将有一场考试。参加考试的先决条件是积极参加练习。积极参与练习的一个充分标准是,你获得了练习表中可以获得的50%的分数,并在互动会话中演示了一个练习。
文学类