没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记166(2007)47-62www.elsevier.com/locate/entcsSmPL:一种用于Linux设备驱动程序放大图片作者:J.拉瓦尔湾 和吉勒·穆勒aOBASCO Group,Ecole des Mines de Nantes-INRIA,LINA,Nantes,France{约安.帕迪奥洛,吉勒. Muller}@emn.fr丹麦哥本哈根大学julia@diku.dk摘要并行演化是大规模软件开发中普遍存在的问题。当一个影响通用库接口的进化需要修改时,这种进化就会发生,即:在所有图书馆客户端中,执行这些附带的演化需要识别已修改的文件,并修改这些文件中以某种方式依赖于已更改接口的所有代码片段我们已经研究了Linux设备驱动程序上下文中的并行进化问题。目前,Linux中的附带演化大多是使用文本编辑器手动完成的,可能需要grep等工具的帮助。然而,大量的Linux驱动程序意味着这种方法既耗时又不可靠,当修改不一致时会导致细微的错误。在本文中,我们提出了一种转换语言,SmPL,指定抵押品的演变。由于Linux程序员习惯于以补丁的形式交换、阅读和操作程序修改,因此我们围绕补丁的思想和语法构建我们的语言,将补丁扩展为语义补丁。关键词:Linux,设备驱动程序,并行进化,特定领域语言。1介绍在软件开发中,一个主要的困难,也是最高成本的来源是管理演化。软件的发展是为了增加新的功能,适应新的需求,并提高性能、安全性或软件体系结构。尽管进化可以带来长期的好处,但它也会带来短期的困难,因为一个组件的进化会影响到其他组件所依赖的接口。在以前的工作[16]中,我们已经识别出了并行进化的现象,其中,影响通用库接口的进化需要修改,即。,附属演变,在所有图书馆的客户端。作为以前工作的一部分,我们在Linux设备驱动程序的上下文中进一步研究了这种现象1571-0661 © 2006 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2006.07.02248Y. Padioleau等人/理论计算机科学电子笔记166(2007)47在这种情况下,并行演化是一个重要的问题,因为设备驱动程序占Linux源代码的一半以上,并且高度依赖于内核和各种驱动程序支持库的功能和数据结构。之前的研究确定了设备驱动程序所需的各种附带进化的分类。这些变化包括对驱动程序支持库函数的调用的更改以添加或删除新参数,由驱动程序定义的回调函数的更改以添加或删除所需参数,数据结构的更改以添加或删除字段,以及函数使用协议的更改。在Linux设备驱动程序中执行并行演化需要识别受影响的驱动程序文件,并修改这些文件中的所有代码片段,这些代码片段在某种程度上依赖于驱动程序支持库接口中的更改。标准技术包括文本编辑器中的手动搜索和替换,查找具有相关属性的驱动程序文件,以及sed、perl脚本和emacs宏来更新一个被删除的驱动程序代码片段。然而,这些方法都没有提供考虑语法和语义C代码。错误的结果,如删除更多的代码行比预期或忽略一些相关的代码片段。此外,许多附带的演化涉及控制流属性,因此需要大量的编程语言专业知识来正确实现。本文提出了一种声明式转换语言SmPL(Se-manticPatchLanguage),用于精确、简洁地表达Linux设备驱动程序的并行演化Linux程序员习惯于交换、读取和操作补丁文件,这些文件提供了以前执行的更改的记录因此,我们将SmPL的语法基于补丁文件符号。与传统的补丁不同,它记录了特定文件中特定站点的变化,SmPL可以描述适用于多个并行进化站点的通用转换。特别地,转换是根据控制流图而不是抽象语法树来定义的,因此不遵循C代码的语法,而是遵循其语义。因此,我们将使用SmPL表示的转换规则称为语义补丁。SmPL是开发转换工具Coc-cinelle的大型项目的第一步,该工具为执行抵押品演变提供自动化帮助。这种协助将包括SmPL语言,用于指定附带的演变和转换引擎,用于将它们应用于设备驱动程序代码。我们希望当驱动程序支持库的开发人员修改库的接口时,他将创建相应的语义补丁,这取决于他对使用被引用的接口元素的协议和典型驱动程序代码的结构的理解。然后,他将把语义补丁分发给驱动程序维护人员,他们将使用它来更新他们的驱动程序。我们的目标是转换过程应该是健壮的,并且在必要时是交互式的特别是,它应该仍然能够帮助驱动程序维护者,即使在驱动程序编码风格发生意外变化的情况下,规则与源代码的精确匹配是不可能本文的其余部分组织如下。第2节描述了一组附带的演进,它们将被用作我们的运行示例。第3节说明了如何使用标准补丁符号来表示这些附带的演化之一Y. Padioleau等人/理论计算机科学电子笔记166(2007)4749第4节根据这个例子介绍了SmPL。最后,第5节和第6节分别介绍了相关的工作和结论2激励的例子作为一个运行的例子,我们考虑在Linux 2.5.71中SCSI驱动程序中发生的附带演变这样的函数由SCSI驱动程序通过proc info导出到SCSI驱动程序支持库SHT(SCSI主机模板)结构的字段每个函数打印信息以与Linux文件系统。proc info函数中的附带演变是由以下决定触发的:驱动程序不希望直接使用scsihost hn get函 数 来获得对设备表示的访问,而scsihost put放弃此访问,因为这些函数的任何不正确使用都可能破坏相关引用计数的完整性[11]。从Linux 2.5.71开始,这些函数不再由SCSI驱动程序支持库导出。为了弥补这种演变,proc info函数被作为一个额外的参数传递给设备的表示一个用作scsi主机hn get参数的现有参数也被删除。在Linux源代码树中的驱动程序中,这些附带的演变包括19个SCSI驱动程序文件,位于4个不同的目录中。在scsiglue驱动器的情况下的侧支演变如图1所示。如图1a所示,在Linux 2.5.70中,函数usb storage proc info声明了一个本地变量hostptr(第7行),表示设备,并包含访问(第15行),测试(第16-18行)和释放(第23和33行)的代码。副值。所有这些代码在Linux 2.5.71中都被删除了(图1b)。1相反,本地变量hostptr成为usb storage proc info的参数,具有相同的类型。另外,Linux中USB存储过程信息的hostno参数2.5.70在Linux 2.5.71中被删除。 对hostno的引用被替换为对新hostptr参数的hostno字段的访问。这个例子说明了我们在以前的工作中确定的两种基本类型的Collateral演化的组合[16]:(i)引入一个新的参数并相应地消除该参数使之变得多余的计算,以及(ii)消除一个参数并引入计算以重构其值。3补丁方法传统上,Linux操作系统中的更改使用补丁文件发布[12]。补丁文件是通过手动执行源代码中的更改,然后使用特殊参数在旧版本和新版本上运行diff因此diff不仅记录了差异,还记录了某些位置和上下文1第21-25行的条件在Linux 2.5.71中也被删除了,但这似乎与另一个演变有关,因此我们为了示例的目的而保留了它50Y. Padioleau等人/理论计算机科学电子笔记166(2007)471static int usb_storage_proc_info(1static int usb_storage_proc_info(struct Scsi_Host *hostptr,2char *buffer,char **start,off_t offset,2char *buffer,char **start,off_t offset,3int length,int hostno,int inout)3int length,int inout)4.4.5struct us_data *us;5struct us_data *us;6char *pos = buffer;6char *pos = buffer;7struct Scsi_Host *hostptr;78unsigned longf;8unsigned longf;9910/*如果有人向我们发送 数据,只需将其丢弃 */10/*如果有人向我们发送 数据,只需将其丢弃 */11if(i)11if(i)12返回长度;12返回长度;131314/* 从给定的hostno中查找数据 */1415Hostptr= scsi_host_hn_get(hostno);1516如果(!hostptr){1617return-ESRCH;1718}1819us =(structus_data*)hostptr->hostdata[0];19us =(structus_data*)hostptr->hostdata[0];202021/*如果21/*如果22如果(!us){22如果(!us){23public int findDuplicate();2324return-ESRCH;24return-ESRCH;25}25}262627/* 打印控制器名称 */27/* 打印控制器名称 */28SPRINTF(“主机scsi%d:usb-storage\ n”,hostno);28SPRINTF(“主机scsi%d:usb-storage\ n”,hostptr->host_no);29/* 打印产品、供应商和序列号字符串 */29/* 打印产品、供应商和序列号字符串 */30SPRINTF(“Vendor:%s\n”,us->vendor);30SPRINTF(“Vendor:%s\n”,us->vendor);31. . . //一些代码被省略31. . . //一些代码被省略32/* 释放此主机上的引用计数 */3233public int findDuplicate();3334. . . //一些代码被省略34. . . //一些代码被省略35返回长度;35返回长度;36}(a)Linux 2.5.7036}(b)Linux 2.5.71Fig. 1. 在drivers/usb/storage/scsigma.c信息.补丁文件中的条目以头文件开头,表示旧文件的名称以-开头,新文件的名称以+开头。标头后面是一系列区域,每个区域以@@. @@,指定新旧文件中的起始行号。然后,一个区域包含一系列文本行,其中添加的行在第一列中用+表示,删除的行在第一列中用-表示,在第一列中用空格来表示提供上下文信息的上下文信息。要应用补丁文件,访问每个提到的文件,并添加和删除指定的行。通常情况下,补丁文件被应用到与Linux开发人员创建它所使用的文件相同的文件中。可以指示补丁工具忽略行号或某些上下文行,以便能够将补丁应用到与预期文件相似但不相同的文件中。 然而,由于没有对补丁的意义或被删除的意义进行语义分析,源代码,这种方法容易出错。此外,在实践中,补丁是相当脆弱的,并且源代码中的变化意味着补丁的部分根本不能应用。图2显示了用于将函数usb storage-proc info从Linux 2.5.70更新到Linux2.5.71的部分补丁文件。 虽然此修补程序可能适用于scsigm.c文件的微小变化,但它不能应用于其他SCSI驱动程序中的proc info函数,因为在修改的代码行中使用了scsiglue特定的名称,如usb storage-proc info。这是不幸的,因为多个文件必须以相同的方式更新。Y. Padioleau等人/理论计算机科学电子笔记166(2007)4751- a/drivers/usb/storage/scsigma.c Sat Jun 14 12:18:55 2003+ b/drivers/usb/storage/scsigm.c2003年6月14日星期六12:18:55@@-264,33 +300,21 @@-static int usb_storage_proc_info(+static int usb_storage_proc_info(struct Scsi_Host*hostptr,char *buffer,char **start,off_toffset,-int length,int hostno,int inout)+ int length,int inout){ struct us_data *us;char *pos = buffer;-struct Scsi_Host *hostptr;unsigned long f;/*如果 有人给我们发送数据,就把它扔掉 */if(inout)返回长度;-/* 从给定的hostno中查找数据 */-Hostptr= scsi_host_hn_get(hostno);-如果(!hostptr){-return-ESRCH;- 个文件夹美国=(struct us_data*)hostptr->hostdata[0];/*如果 我们us){-return-ESRCH;}/* 打印控制器名称 */-SPRINTF(“主机scsi%d:usb-storage\n”,hostno);+ SPRINTF(“主机scsi%d:usb-storage\n”,hostptr->host_no);/* 打印产品、供应商和序列号字符串 */SPRINTF(“Vendor:%s\n”,us->vendor);@@-318,9 +342,6 @@* (pos++)=}-/* 释放此主机上的引用计数 */-public int findDuplicate();/** 计算下一个缓冲区的开始,并返回值。图二. 从Linux 2.5.70到Linux 2.5.71的4将并列进化表示为语义补丁为了表达抵押演变,我们提出了一种新的语言SmPL作为一种手段,概括补丁语义补丁。语义补丁是一种在视觉上类似于补丁的规范,但其应用程序基于要转换的代码的语义,而不是其语法。完整的语言定义见附录。在这里,我们通过一个例子来展示SmPL,一个表达第2节中描述的附带进化的语义补丁。我们逐步开发语义补丁,通过显示连续的与仅适用于一个文件的补丁不同,语义补丁可以应用于Linux源代码树中的所有文件,选定的文件,单个文件,甚至是Linux源代码树之外的文件4.1更换我们的第一个任务是更改函数签名,添加一个指向Scsi主机结构的参数,并删除hostno参数。我们表达这些52Y. Padioleau等人/理论计算机科学电子笔记166(2007)47SmPL中的修改如下:proc_info_func(+struct Scsi_Host *hostptr,char *buffer,char **start,off_t offset,int length,-int hostno,intinout)与标准补丁一样,以+和-开头的行分别被添加和删除。剩下的几行描述了修改上下文。这段摘录应用于整个文件,并转换每个匹配的代码片段,而不管片段4.2元变量,第1前面的规则假设proc info函数有参数buffer、start等。然而,实际上,参数名称因驱动程序而异。为了使规则对名称的选择不敏感,我们用元变量替换显式名称。 这些在每个转换之前出现的由@@分隔的部分中声明,如下所示:@@标识符缓冲区,开始,偏移,长度,inout,主机号;新鲜标识符hostptr;@@proc_info_func(+struct Scsi_Host *hostptr,char *buffer,char **start,off_t offset,int length,-int hostno,intinout)元变量buffer、start、offset、length、hostno和inout用于用-or空格注释的行,因此与原始源程序中的术语匹配。它们被声明为标识符,表明它们匹配任何标识符。元变量hostptr表示新添加到函数签名中的参数。因此,我们将其声明为一个新标识符,表明应该选择一些与其他标识符不冲突的标识符,节目语义补丁可以包含多个区域,每个区域声明一些Meta变量并指定一个转换规则.一旦声明,元变量就通过将给定的转换规则与源代码相匹配来获得其值然后,它在后续区域中保持其值,直到重新声明它4.3元变量,第2如图1所示,要转换的函数的名称通常不是proc info func,而是特定于每个驱动程序的名称。我们不依赖于所选名称的属性,而是根据函数与SCSI接口的关系来识别函数。具体来说,要修改的函数是存储在SHT结构的proc info字段中的函数。下面的摘录,放在第4.2节摘录之前,表达了这一限制:@@structSHT;本地函数proc_info_func;@@Y. Padioleau等人/理论计算机科学电子笔记166(2007)4753sht.proc_info= proc_info_func;声明structSHTsht;表示元变量sht表示struct SHT类型的表达式。当多个结构类型具有相同名称的字段时,这种类型指定避免了对proc info字段的引用中的歧义。如果proc info字段有多个赋值,则元变量procinfofunc绑定到所有可能的右侧的集合。使用此元变量的后续转换将为所有ele-value实例化这一套的部分。上面的规则被写为将proc info字段直接赋值给局部函数的名称。但是,在要转换的代码中,此赋值的右侧可能是作为局部变量别名的其他表达式功能我们在驱动程序代码中观察到的这种别名模式非常简单,例如在条件的每个分支中将局部变量初始化为不同的函数这样的别名可以通过标准数据流分析来检测4.4序列,第1下一步是删除声明hostptr局部变量以及访问、测试和释放其值的语句序列。实际上,这些语句可以用任意代码分隔,如图1a(第7、15-18、23和33行)所示。为了指定任意序列,SmPL提供了操作符“... “, 我 们 使 用 如下:@@identifier buffer,start,offset,length,inout,hostptr,hostno;@@proc_info_func(+struct Scsi_Host *hostptr,char *buffer,char **start,off_t offset,int length,-public intfindDuplicate(intfindDuplicate){...-struct Scsi_Host *hostptr;...-Hostptr= scsi_host_hn_get(hostno);...-如果(!hostptr){. 个文件夹...-public int findDuplicate();...}如果我们将此规则与图1a进行比较,我们可以看到声明、访问和测试的hostptr在源程序中只出现一次,但该scsi host put被调用两次,一次是在返回错误代码之前的第23行,一次是在函数结束时的第33行。为了解决这个问题,序列在SmPL中,描述控制流图中的序列而不是抽象语法树中的序列。具体地说,当一个转换包含运算符“... “,这是一个非常简单的方法,它可以通过定义端点的方法来实现,端点在这里是函数定义的开始和结束。例如,在图1a中,在变量us赋值之后,有两个控制流路径,一个是错误路径(第23-24行),另一个继续,直到54Y. Padioleau等人/理论计算机科学电子笔记166(2007)47最后的回归(第27-35行)。对scsihost put的调用将从它们中的每一个中删除。因此,在实践中,一条线可以擦除多条代码线,每条控制流路径擦除一条.回想一下,在4.2节中,我们创建了一个新的标识符作为新参数hostptr。事实上,当手动执行附带演化时,参数总是被赋予已删除的ScsiHost类型局部变量的名称。现在我们已经扩展了语义补丁摘录,以包含参数和局部变量声明,我们可以通过在两种情况下使用相同的元变量(声明为标识符)来表达这种命名策略这种重复意味着两次出现指的是同一个术语,从而传递了名称将旧局部变量的值转换为新参数。因此,元变量类似于逻辑变量,因为规则中的元变量的每次出现都引用相同的术语集。然而,与Prolog的逻辑变量不同,元变量总是绑定到基础项。本节中描述的附带演化在Linux 2.5.71版本中引入了一些bug。例如,在两个文件中,hostno参数没有被删除,导致函数需要太多的参数。这个问题在6个月后发布的Linux 2.6.0中得到了修复4.5序列,第2最后,我们考虑对删除的hostno参数的引用的处理。 在每种情况下,引用都应该替换为hostptr->hostno。在这里,我们对在任何给定的控制流路径上强制执行任何特定数量的hostno不感兴趣,所以我们使用操作符<... ...> 在匹配区域内的所有位置应用变换:@@@proc_info_func(.){1}<...- 霍斯诺+ hostptr->host_no...>}请注意,操作符“... “可用于表示任何类型的序列。在这里,在函数头中,它用于表示一系列参数。4.6同构我们已经提到,语义补丁对空格、指示符和注释不敏感。此外,通过根据控制流路径定义序列并考虑数据流,我们抽象出了C代码中存在的各种构造方法,例如循环和复杂表达式。这些特性有助于使语义补丁通用化,允许补丁开发人员只编写少数几个场景,而转换工具处理语义等效的其他场景。事实上,这些特征是我们称之为同构的更大语义等价集合的一部分。其他同构与Y. Padioleau等人/理论计算机科学电子笔记166(2007)4755@@structSHT;本地函数proc_info_func;@@sht.proc_info= proc_info_func;@@identifier buffer,start,offset,length,inout,hostptr,hostno;@@proc_info_func(+struct Scsi_Host *hostptr,char *buffer,char **start,off_t offset,int length,-public intfindDuplicate(intfindDuplicate){...-struct Scsi_Host *hostptr;...-Hostptr= scsi_host_hn_get(hostno);...?-如果(!hostptr){. 个文件夹...?- public int findDuplicate();...}@@@proc_info_func(.){1}<...-霍斯诺+ hostptr->host_no...>}该示例包括typedef别名(例如,,structSHT通常被称为SCSI主机模板),引用结构字段的各种方式(例如,,ex p->fielddand*ex p. 场),以及测试核动力学的方法(例如,、!hostno和hostno == NULL)。我们已经发现了更多有用的同构,并继续发现新的同构。4.7All Together Now图3展示了完整的语义补丁,它实现了第2节中描述的附带演化。 这个版本与之前的摘录相比有所增加,因为错误检查代码if(!hostptr){. }和调用SCSI主机放置注释有?,表明匹配这些模式是可选(尽管如果匹配则必须删除它们)。 什么?年,年tation通常对错误检查代码有用,例如Engler等人的研究。[1]表明错误检查代码经常(不正确地)在设备驱动程序中被省略图三. 一个完整的语义补丁4.8评估考虑图3,很明显,对附带演化的大部分描述都是根据普通C代码进行的。在我们编写的62个语义补丁中,我们经常发现可以通过复制和修改现有的驱动程序代码来构建语义补丁。与实际驱动程序代码的密切关系56Y. Padioleau等人/理论计算机科学电子笔记166(2007)47还应当使想要应用语义补丁的驱动程序维护者容易理解其意图和各种变换项之间的关系。“proc info”语义补丁适用于Linux源代码树的4个不同目录中的19个在标准的补丁标记法中,Linux源代码树中的文件所需的更改的指定总计为614行代码,平均每个文件32.3行。语义补丁是33行代码,适用于所有相关文件,包括那些不在Linux源代码树中的文件。由于语义补丁旨在实现附带的演化,这是由接口的变化,因为接口元素通常只根据非常有限的协议使用事实上,在我们之前对1600多个驱动程序文件中的并行演化的研究中,我们发现,给定演化所影响的代码结构几乎没有变化,这一观察结果被另一项对驱动程序代码的研究进一步证实。5相关工作在法庭上。SmPL的设计受到许多来源的影响。其中最前面的是我们的目标域,Linux设备驱动程序的世界. Linux程序员广泛地使用补丁,围绕它们设计了各种工具[13],并在电子邮件中非正式地使用其语法来描述软件演化。这促使我们考虑补丁语法作为一个有效的替代经典重写系统。其他改进包括JetBrains [14]的IDEA开发环境的结构化搜索和替换(SSR)工具,它允许使用元变量指定模式并提供一些同构,以及De Volder在JQuery [3]上的工作,它在系统中使用Prolog逻辑变量浏览源代码。最后,我们受到启发,SmPL的语义基础上[八]《中国日报》其他工作。重构是一种通用的程序转换,它重组程序的结构而不改变其语义[6]。Linux驱动程序中的一些附带演化可以被视为重构。重构,然而,适用于整个程序,需要访问所有的使用网站的一个不确定的定义。然而,在Linux的情况下,整个代码库不可用,因为许多驱动程序是在Linux源代码树之外开发的。目前还没有办法表达或生成对这种外部代码的重构效果。其他附带的演化对于OS API来说非常特殊,因此不能被描述为通用重构的一部分[9]。此外,在实践中,重构是通过Eclipse这样的开发环境使用的,它只提供一组固定的转换。JunGL是一种脚本语言,允许程序员实现新的重构[20]。这种语言应该能够表达并行进化。然而,JunGL转换规则不遵循源项的结构,并且因此不使源项之间的关系在视觉上明显。Y. Padioleau等人/理论计算机科学电子笔记166(2007)4757转换的术语,我们发现这使得所提供的示例难以阅读。此外,该语言符合ML的精神,而ML并不是Linux开发人员标准工具箱的一部分。最近提出了许多程序转换框架,目标是工业强度语言,如C和Java。CIL[15]和XTC [7]本质上是为实现抽象语法树遍历提供一些支持的解析器。当前没有提供程序转换抽象,例如使用逻辑变量的模式匹配。CIL还以更简单的中间表示形式管理C源代码。重写规则必须用这种表示法来表示,而不是用相关驱动程序中的代码来表示。Replego是一种用于编写程序转换的领域特定语言[21]。内置了方便的模式匹配和规则管理策略,这意味着程序员可以指定应该发生什么转换,而不会使代码与转换机制的实现然而,只提供了一些程序分析。任何其他需要的分析,如控制流程分析,都必须用BLOG语言实现。根据我们的经验,这会导致规则非常复杂,即使是表达简单的附带演化。Coady等人使用面向方面的编程(AOP)来扩展具有新特性的OS代码[2,5]。然而,AOP的目标是模块化关注点,而不是将它们集成到单一的源代码中。在并行进化的情况下,我们的观察表明,Linux开发人员喜欢更新源代码的方法,从而导致驱动程序实现之间的一致性。例如,有时候,已经引入包装器函数以允许遵守接口的旧版本和新版本的代码共存,但是当已经进行协调的尝试以更新代码以遵守接口的新版本时,这些包装器函数通常在几个版本之后被移除。Linux社区最近开始使用各种工具来更好地分析C代码。Sparse [18]是一个库,像编译器前端一样,提供对C程序的抽象语法树和类型信息的方便访问。这个库已经被用来实现一些针对bug检测的静态分析,基于添加到变量声明中的注释,本着熟悉的static和const的精神。Smatch [19]是一个类似的项目,写Perl脚本来分析C代码 这两个项目的灵感都来自于Engler等人[4]关于操作系统代码中的自动bug发现。这些例子表明,Linux社区对使用自动化工具来提高代码质量持开放态度,特别是当这些工具构建在Linux开发人员的传统专业领域时。6结论在本文中,我们提出了一种声明性语言,SmPL,用于表达在Linux设备驱动程序中执行并行进化所需58Y. Padioleau等人/理论计算机科学电子笔记166(2007)47这种语言基于Linux开发人员所熟悉的补丁语法,但允许以更通用的形式表示同构的使用特别允许转换的简洁表示,但可以适应多种编程风格。SmPL进一步解决了我们在以前的工作中识别的Linux设备驱动程序中的各种附带演化的分类的所有元素我们目前正在完成SmPL语义的正式规范,并正在探索有效实现的途径。从长远来看,我们计划使用SmPL来指定将驱动程序从一个Linux版本更新到后续版本所需的一整套附带演化。致谢这项工作得到了法国国家研究机构(Agence Nationale de la Recherche)和丹麦技术和生产科学研究理事会的部分支持。有关Coccinelle项目的更多信息,请访问网址:http://www.emn.fr/x-info/coccinelle/引用[1] A. Chou,J. Yang,B. Chelf,S. Hallem和D. 恩格勒 操作系统错误的实证研究。 在操作系统原理研讨会(SOSP),第73[2] Y. Coady和G. Kiczales。回到未来:操作系统代码方面演化的追溯研究。在第二届面向软件开发的国际会议论文集,AOSD 2003,第50-59页,马萨诸塞州波士顿,3月。2003年。[3] K.德·沃尔德jQuery:一个带有声明性配置语言的通用代码浏览器。 在声明性语言的实践方面,第8届国际研讨会,PADL 2006,第88-102页,查尔斯顿,SC,1月。2006年。[4] D. R.恩格勒湾Chelf,A. Chou和S.哈勒姆使用特定于系统的程序员编写的编译器扩展检查系统规则。在第四届USENIX操作系统设计与实现研讨会(OSDI)的会议记录中,第1-16页,加利福尼亚州圣地亚哥,10月16日。两千[5] M.菲乌琴斯基河Grimm,Y. Coady和D.沃克补丁(1)被认为是有害的。在第10次研讨会上的热门主题在操作系统(HotOS X),圣达菲,新墨西哥州,2005年6月。[6] M.福勒 重构:改进现有代码的设计。 艾迪森·韦斯利1999年[7] R.格 林 XTC : 使 C安 全 可 扩 展 。 2004 年 8月 , Argonne National Laboratory , Workshop on Domain-Specific Language for Numerical Optimization[8] D.莱西和O.德·摩尔通过重写进行强制程序转换。In R. Wilhelm,editor,Champier Construction,10thInternational Conference,CC 2001,number 2027 in Lecture Notes in Computer Science,pages 52-68,Genova,Italy,Apr. 2001年[9] J. L. Lawall,G. Muller和R.乌鲁努埃拉狼蛛:在孵化前杀死驾驶员虫子。在第四届AOSD基础架构软件方面、组件和模式研讨会(ACP 4 IS),第13-18页,芝加哥,IL,3月。2005年[10] Z. Li,S. Lu,S. Myagmar和Y.舟CP-Miner:一个用于发现操作系统代码中的复制粘贴和相关错误的工具。在第六届USENIX操作系统设计与实现研讨会(OSDI)会议记录中,第289-302页,San Francisco,CA,2010年12月12日。2004年[11]LWN。 ChangeLog for Linux 2.5.71,2003. http://lwn.net/Articles/36311/网站。[12] D. MacKenzie,P. Eggert和R. 斯托曼 用Gnu Di和Patch比较和合并文件。网络理论有限公司,1月。2003.统一格式部分,http://www.gnu.org/software/diffutils/manual/htmlnode/Unified-unified.html。Y. Padioleau等人/理论计算机科学电子笔记166(2007)4759[13] A.莫尔顿补丁管理脚本,10月2002.提供http://www.zip.com.au/akpm/linux/patches/.[14] M. Mossienko结构搜索和替换:什么,为什么,以及如何。OnBoard Magazine,2004.http://www.onboard.jetbrains.com/is1/articles/04/10/ssr/网站。[15] G. C. Necula,S. McPeak,S. P. Rahul和W.威默CIL:用于分析和转换C程序的中间语言和工具。在计算机构造,第11届国际会议,CC 2002,编号2304,计算机科学讲义,第213-228页,法国格勒诺布尔,2002年4月。[16] Y. Padioleau,J. L. Lawall和G.监听器手机监听器 了解Linux设备驱动程序中的附带演化。 在第一届ACMSIGOPS EuroSys会议(EuroSys 2006),第59-71页,比利时鲁汶,2006年4月。[17] F. 我和你都很好。 我的天啊。我的意思是我的意思是。版本号20060505。Availableathttp://cristal.inria.fr/http://www.example.com[18] D.西尔斯稀疏,莱纳斯的疯子,11月。2004.提供http://www.linuxjournal.com/article/7272网站。[19] 的内核清洁工斯马特,的源匹配器, 六 月2002年。可用在http://smatch.sourceforge.net网站。[20] M.韦尔巴埃河Ettinger和O.德·摩尔JunGL:一种用于重构的脚本语言。2006年5月在中国上海举行的国际软件工程会议(ICSE)[21] E.维瑟使用Xplugo/XT进行程序转换:XplugoXT-0.9中的规则、策略、工具和系统。In C. Lengauer等人, 编辑,Domain-Specific Program Generation,计算机科学讲义第3016卷。Spinger-Verlag,2004.一SmPL语法本节介绍SmPL语法。这个定义与我们使用Menhir解析器生成器的实现密切相关[17]。语法使用一些规则,其中左手边是所有大写字母。这些是宏,它把一个或多个语法规则的右侧作为参数。 该语法还使用了一些未指定的非终结符,如id、const等。id是指可能的C语言标识符的集合,而const是指可能的C语言常量的集合程序program::=(metavariables[---filename+++filename]transforrmation)+在元变量和转换规则之间,可以对旧文件和新文件的名称指定约束,类似于标准补丁语法中的文件名指定(参见图2)。元变量新的元变量只能在+代码中使用。元变量必须在紧接其声明之后的转换中至少出现一次。这些属性不在语法中表示,而是由随后分析.60Y. Padioleau等人/理论计算机科学电子笔记166(2007)47元变量::=@@metadec变量@@∗metadec::=[! |什么? |+]metakind(id,) 识别码;metakind::=[fresh]identifierr|类型E|参数r[列表t]|误差|声明,声明,声明|[loca l ]函数|[local]function|[常量]元表达式
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Python和Opencv的车牌识别系统实现
- 我的代码小部件库:统计、MySQL操作与树结构功能
- React初学者入门指南:快速构建并部署你的第一个应用
- Oddish:夜潜CSGO皮肤,智能爬虫技术解析
- 利用REST HaProxy实现haproxy.cfg配置的HTTP接口化
- LeetCode用例构造实践:CMake和GoogleTest的应用
- 快速搭建vulhub靶场:简化docker-compose与vulhub-master下载
- 天秤座术语表:glossariolibras项目安装与使用指南
- 从Vercel到Firebase的全栈Amazon克隆项目指南
- ANU PK大楼Studio 1的3D声效和Ambisonic技术体验
- C#实现的鼠标事件功能演示
- 掌握DP-10:LeetCode超级掉蛋与爆破气球
- C与SDL开发的游戏如何编译至WebAssembly平台
- CastorDOC开源应用程序:文档管理功能与Alfresco集成
- LeetCode用例构造与计算机科学基础:数据结构与设计模式
- 通过travis-nightly-builder实现自动化API与Rake任务构建
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功