基于Petri网的Rust语言自动建模与死锁检测方法及软件工具

文档序号:35281478发布日期:2023-09-01 01:03阅读:63来源:国知局
基于Petri网的Rust语言自动建模与死锁检测方法及软件工具

本发明涉及软件系统建模与分析,更具体地,涉及一种基于petri网的rust语言自动建模与死锁检测方法及软件工具。


背景技术:

1、rust是由谋智公司开发的一种编程语言,旨在构建高效且安全的底层软件。它的主要思想是继承c和c++的大部分功能,从而保留c和c++良好的运行时性能,但同时又会通过严格的编译时检查排除c和c++的安全问题。

2、在过去一段时间中,研究人员对不同编程语言中的多种错误进行了各种实证研究。rust-clippy是一个静态检测器,用于检测那些遵循某些简单源代码模式的内存bug。它仅能涵盖少量的bug模式。miri是动态内存bug检测器,用于解释和执行rust的中级中间表示(mid-level intermediate representation,mir)。根据我们的实验,miri还会产生许多误报。由此可见,基于程序分析的检测器虽然具有分析速度快等优点,但覆盖bug的范围较窄,且容易出现误报。此外,rust的别名模型构建了一个动态内存bug检测器,该检测器使用栈来动态跟踪对每个内存的所有有效引用或指针位置并报告未正确嵌套使用引用时潜在的不确定行为和内存bug,具有高精度等优点。以上两个动态检测器依靠用户提供的输入来触发内存bug。

3、经过对文献和开源技术的探索发现,这些现有rust bug检测工具均有其自身的局限性,并且没有一个能够检测并发性bug。因此,对rust的并发性bug进行的实证研究对于诸如此类的工作非常重要和必要,它可以帮助研究人员和从业人员未来构建更多的rust专属检测器。


技术实现思路

1、由于现有技术存在上述缺陷,本发明提供了一种基于petri网的rust语言自动建模与死锁检测方法及软件工具,对rust程序源代码进行自动抽象检测,准备识别程序中可能造成死锁的程序执行路径,并且报告与死锁有关变量的位置,结合了程序分析与模型检测方法的优点,避免了它们的缺陷,通过控制流和数据流到petri网模型的语义映射,使得产生的模型符合源代码的逻辑。

2、为实现上述目的,一方面,本发明提供一种基于petri网的rust语言自动建模与死锁检测方法,其特征在于,包括以下步骤:

3、步骤s1、rust程序源代码分析;并非所有的源代码都需要进行检测分析,只有锁目标是需要检测的对象。

4、步骤s2、创建rust程序中间代码;所述中间代码隐含了所述源代码的控制流图和数据流图;中间代码是编译器生成的一种表示形式,其中隐含了代码的控制流图(cfg)和数据流图,是代码生成的基本元素。并发代码之间的数据相关性是锁的操作,无相关性的中间代码不需要关注。

5、步骤s3、指定检测rust程序中的锁类型;不同的所述锁类型对应不同的petri网模型和操作语义。

6、步骤s4、生成锁数据流图:在所述控制流图的基础上,根据所述步骤s3中锁类型进行提取的锁执行路径。

7、步骤s5、转换所述锁数据流图为petri网:通过提前定义好的映射关系来完成所述锁数据流图到petri网模型的映射,对所述映射关系进行形式化表述,确保不会发生操作语义的变更。

8、步骤s6、分析petri网,生成死锁检测报告;所述死锁检测报告包括在程序中发现可能造成的锁结构信息。

9、petri网是对离散并行系统的数学表示,适合于描述异步的、并发的计算机系统模型,也是指一种图形化建模方法,可通过检测网的可达性来检测系统的故障。可达性是petri网死锁分析的重要方式,如果petri网有死锁,其死锁标识必然可达。

10、进一步地,所述步骤s2中,中间代码是由rust编译器生成的控制流图的数据结构,是表达程序逻辑的基本元素。

11、进一步地,所述步骤s3中,所述锁类型指用户指定要检测的锁类型,包括可单独检测,也可同时检测的互斥锁和读写锁。

12、进一步地,所述步骤s4中,基于生成的所述控制流图,根据指定的所述锁类型进行遍历,裁剪不包含锁操作的路径。

13、进一步地,所述步骤s5中,将所述锁数据流图转换为petri网包括将程序中锁的执行语义映射为所述petri网模型基本结构的操作,包括加锁、解锁和分支中的任意一种或多种的组合。

14、进一步地,所述步骤s5包括以下步骤:

15、步骤s51、从rust编译器前端获取所有函数的单态表示,构建函数调用图,收集函数中锁的位置、锁所在的函数id等信息;

16、步骤s52、使用安德森指针分析来分析这两个锁是否相同;

17、步骤s53、遍历指定的所述锁类型,并根据其给出的规则完成源代码到petri网模型的映射。

18、进一步地,所述步骤s5中,所述映射过程的主结构体translator,tcx中保存了所有函数实例的所述控制流图,lockguard_map记录了所有锁在所述控制流图中的位置,调用图用于生成不同函数的petri网之间进行绑定;在所有的锁相关实例生成后,链接程序结束的库所。

19、另一方面,本发明提供一种基于petri网的rust语言自动建模与死锁检测的软件工具,其特征在于,用以执行如上述的rust语言自动建模与死锁检测方法,包括:

20、用户界面模块,调用cargo以自动锁定输入包的依赖项并收集所有需要的源文件;

21、rust程序源代码分析模块,用于分析rust程序源代码并创建rust程序中间代码;

22、映射到petri网模块,用于生成锁数据流图,并将所述锁数据流图转换为petri网;

23、bug检测模块,调用petri网分析工具,根据petri网的可达性检测潜在的死锁并生成对应的诊断信息。

24、进一步地,所述用户界面模块调用cargo的自定义子命令,读取一个rust crate作为输入,连同用户提供的锁类型转换过程行为的选项,并收集所有需要的源文件。

25、进一步地,所述petri网分析工具为pipe工具。

26、与现有技术相比,上述发明具有如下优点或者有益效果:

27、(1)本发明可以创建一个以petri网为基础的死锁检测工具,同时屏蔽掉了多余代码带来的复杂性;本发明基于cargo的,不需要重写命令,提高检测效率;

28、(2)本发明的方法使用rust编译作为前端来执行程序化查询,基于锁操作语义的等价映射,不改变原有的程序语义;

29、(3)本发明的方法对无关操作进行了裁剪,缩减了模型检测的状态空间,提高了检测速度;

30、(4)为了减少生成的petri网的大小,本发明从不同的角度来考虑程序的锁定,根据cfg中表示的锁定、解锁、生成和加入的信息进行转换且转换过程依赖于我们设计的规则,与锁定机制有关;

31、(5)本发明的软件工具揭示了现有技术未发现的rust程序bug;

32、(6)本发明的软件工具包括简单的用户界面,这样用户就可以毫不费力地将该工具与rust生态系统中的其他工具一起使用。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1