本节设计并实现了一个用于代码移植的编辑器OntoAPIEditor,该编辑器能对打开的源代码中使用的系统调用进行红色标注。
这里给出了一个简单的测试用例,测试用例首先在当前工作路径下创建了一个新的目录(WinAPICreateDirectory),接下来查找第一个驱动器(WinAPI Find-FirstVolume),遍历所有的驱动器,对于遍历到的每一个驱动器,输出其GUID,并试图将驱动器挂载到创建的目录之下(WinAPISetVolumeMountPoint),获取驱动器的第一个挂载点(WinAPI FindFirstVolumeMountPoint),遍历所有的挂载点,输出挂载点的路径,若是挂载点遍历完毕(WinAPIFindNextVolumeMountPoint)或是驱动器遍历(WinAPI FindNextVolume)完毕,就退出遍历。最后关闭用于遍历挂载点的句柄(WinAPI FindVolumeMountPointClose)和遍历驱动器的句柄(WinAPI FindVolumeClose)。
测试用例在代码移植编辑器中打开的结果如图14 所示。
图14 测试用例中Windows API高亮显示
假设程序员对系统调用函数非常熟悉,可以直接判断,对每行代码进行判断及标注始终保持理想状态,平均需要1s/LOC,表3 中对比一下两者在不同情况下对代码中系统调用进行标注所花费的时间。
表3 手动标注与自动标注使用时间对比
(www.xing528.com)
从表中可以看出采用自动标注的方法要比程序员手工标注更快速。事实上自动标注的时间开销会因为运行平台硬件配置,算法效率高低的不同而不同。自动标注所花费的时间由两部分组成:
其中,TCreateOntoModel为读入接口模型,构建本体图状模型所需要的时间,对于特定的操作系统而言,这一时间是固定的。TMatch为字符串匹配所花费的时间。假设某一操作系统有x个系统调用,在最糟糕的情况下,N行代码要进行Nx次的匹配。若运行编辑器的平台每秒处理y个操作。则自动标注所需时间为:
而手动标注N行代码需要的时间为T=N。
因此只有在x>=y时,即操作系统所提供的系统调用的数量大于或等于计算机每秒运算次数时,自动标注所花费的时间才会大于手动标注。以Windows操作系统为例,它虽然提供了数量庞大的API,特别是到了Windows8,API的数量已达到了1.3 万个,但是计算机发展至今,每秒的运算次数已是数百万次了。随着计算机技术的逐步发展,每秒的运算次数还会更快。自动标注在时间上相较于手工标注在时间上优势显著。
在准确率上,自动标注的准确率取决于接口模型中对系统调用的覆盖度,而手工标注则取决于程序员的经验与记忆,二者相比较,自动标注的准确率显然要高于手工标注。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。