论文摘要
应用程序生命周期中需要不断进行更新,以修复程序中的错误、添加新的功能、适应环境和需求的变化。传统更新方式需关闭应用程序、安装更新、然后重启新版本的应用程序,但很多应用程序需要不间断的运行。软件动态更新不需要关闭应用程序,在运行的过程中实现对软件程序的更新。较之离线更新,动态更新面临更大的技术挑战,而如何保证更新后程序运行的正确性是其难点所在。现有程序代码级动态更新技术对更新正确性的考虑多停留在类型正确层面上,仅能够保证动态更新之后运行不发生类型错误。应用语义层面正确性的保证是通过程序员对更新点的选择来进行控制的,而这方面缺乏系统化的方法和技术的支持。本文在研究了当前C语言程序动态更新机制和安全策略的基础上,提出并实现了一种基于断言的动态更新点选择技术,用于帮助避免动态更新后程序运行的逻辑错误。主要工作包括:首先,提出了一种基于程序断言的更新点选择准则。通过程序新旧版本中已有的或者为动态更新添加的程序断言,可指定期望程序在当前点需要满足的属性。动态更新时更新前后程序运行路径上的断言不应被破坏。其次,为上述准则提出一种使用基于约束控制流分析的自动判断技术。对于每一个更新点,寻找与之相关的断言,即在这些更新点更新可能会受影响的断言。通过分析程序中与这些断言存在关联的所有类型、变量和函数,保守地判断这些断言有无被违反的可能。如果存在断言被违背,则更新点不满足上述准则,跳过该更新点,程序继续运行,继续寻找满足条件的更新点。如果断言不被违背,则在该更新点可进行更新。最后,基于Ginseng系统实现一个基于断言的更新点自动选择机制,并通过一个OpenSSH的实际更新实例,说明了上述技术的实际使用,初步展示了其可行性和有效性。