System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种代码死锁风险检测方法技术_技高网

一种代码死锁风险检测方法技术

技术编号:41258889 阅读:2 留言:0更新日期:2024-05-11 09:17
本发明专利技术属于计算机程序设计技术领域,涉及一种代码死锁风险检测方法。首先要划定合适的检测范围。然后对检测范围内的代码进行检查,保证其符合以下三个规则:检测范围内占用的资源没有在检测范围外占用,或者虽然占用了,但在进入检测范围时处于释放状态;检测范围内的代码段占用的资源,一定要在退出此段代码时释放;检测范围内的代码调用的外部代码,不再回调检测范围内的任何代码。划定检测范围也可参照上述原则,保证划进检测范围的代码符合上述规则。本发明专利技术提出的代码检查的方法,可以作为代码设计阶段的规范;代码死锁风险检测方法,可以判定已完成的代码是否有死锁风险,本发明专利技术有助于在程序设计领域彻底解决死锁问题,具有实用价值。

【技术实现步骤摘要】

本专利技术属于计算机程序设计,涉及一种代码死锁风险检测方法


技术介绍

1、在计算机中运行的一组线程,如果运行到某个时刻,每个线程都在等待已经由本组线程中的其他线程占用的资源释放出来才能继续运行,则本组线程在此时刻发生死锁。死锁有以下四个必要条件,分别是:(1)互斥条件:一个资源每次只能被一个线程占用;(2)请求和保持条件:一个线程因得不到所请求资源而阻塞时,对已占用的资源保持不放;(3)不可强占条件:线程已获得的资源,不能强行剥夺,只能由线程自己释放;(4)循环等待条件:每个线程都在等待资源,且所等待资源都被本组线程中的某个线程占用。

2、上述四个条件是发生死锁的必要条件,任何一个不满足都不会发生死锁。本专利技术从第(4)个条件入手,破坏发生死锁的条件,从而避免死锁。前三个条件是对可能造成死锁的资源的特征的描述,满足这三个条件的资源称为互斥资源,在不引起混淆的前提下,本专利技术也直接称其为资源。

3、线程是代码的执行过程。代码是静态的,规定了执行顺序,以及重复执行、选择执行的条件。线程是动态的,它从入口代码开始执行,根据执行时的情况顺序执行代码,或者重复执行某段代码,或者从多段代码中选择一段执行,最后从出口代码处结束线程。线程执行的代码按顺序排列,称为线程路径。对于一组线程,如果其中每个线程的线程路径上的所有代码都没有死锁风险,则线程不会发生死锁;如果其中有些代码有死锁风险,则线程可能死锁,也可能不会死锁。也就是说,排除线程路径上所有代码的死锁风险,可以断定线程不会死锁。

4、但是真正的线程路径只有在线程实际执行时才能完全确定,因此有必要通过对代码的静态分析来判断死锁风险,本专利技术就提出了这样一种检测代码死锁风险的方法。必须指出,代码是否存在死锁风险的结论,只在确定的代码范围内有效,如果在原来判定没有死锁风险的代码中增加了新的代码,则不仅新增代码,就是原来的代码也不再当然排除死锁风险,需要重新判断。

5、本专利技术的死锁风险检测是在源代码级进行的,非源代码不能进行静态分析。因此本专利技术所指的代码,如无特别说明,说的就是源代码。


技术实现思路

1、本专利技术的领域是计算机程序设计领域,适用于多任务环境下,不同线程需要独占相同资源,且占用顺序不定,从而引入死锁风险的情况。本专利技术通过对源代码进行静态分析,判断代码是否存在死锁风险,并找出可能出现死锁的地方,为软件设计者降低或消除死锁风险提供一种切实可行的方法。

2、本专利技术采用的技术方案是,在源代码上,标记与互斥资源使用有关的代码,将其抽象为有向网络(包括节点及节点间的上下关系);用数据表表达此有向网络;为网络上的每个节点编号,编号的基本原则是上节点编号小于下节点编号,通过编号能否顺利完成判断代码是否有死锁风险。具体内容如下:

3、内容1,确定要检测代码的范围。

4、本专利技术适用于各种编程语言,符合各种编程语言的共同特征。检测在源代码层级进行。源代码分为代码段(如函数、方法、子程序等)。代码段互相调用。每个代码段被调用时,只能从代码段的开头进入,不能从中间进入,但可从任何位置退出。

5、本专利技术的代码死锁风险检测只在确定的代码范围(以下称检测范围)内有效,如果检测范围有所改变,原结论不是当然有效,必须重新检测。检测范围内的代码,常常需要调用外部代码,对所调用的外部代码是否有死锁风险,本专利技术无法进行检测,只能由外部代码自行保证。

6、检测范围内的代码,须满足一些基本要求,方能适用本专利技术进行检测。这些要求共三个,分述如下:

7、(1)资源初始空闲要求。检测范围内用到的所有资源,在进入检测范围时必须处于空闲(释放)状态。检测范围内涉及到的所有资源,最好只在检测范围内被占用,即便在检测范围外被占用,也要在进入检测范围之前被释放,确保进入检测范围时,所有资源处于释放状态。实际应用中,可以通过扩大检测范围,把所有占用资源的代码包括进来满足这一要求。

8、(2)用完即释放要求。每个代码段占用的资源,在退出该代码段时,无论从何处退出,都应被释放。实际编程中做到这一点并不难。如果被一个代码段占用的资源需要在退出该代码段时继续占用,将占用它的代码移到上级代码段(该代码段的调用者)中,即可符合这一要求。关键是养成良好的编程习惯,做到资源在哪占用,就在哪释放,增强代码的规范性和可检测性。

9、(3)无回调要求。检测范围内的代码调用外部代码时,所调用的外部代码不会再调用检测范围内的代码,即不会回调。

10、上述三个要求称为内容1的规则(1)、规则(2)和规则(3)。实际应用中,如果违反上述三个要求,则需要程序员手工检查作为本专利技术检测方法的补充。

11、因此,在进行死锁风险检测之前,必须设定合适的代码范围。代码范围太小,外部代码回调较多,资源的占用-释放超出检测范围,无死锁风险的结论意义不大。因此要尽量扩大检测范围。但如果不同模块之间的边界清晰、调用方向明确(即以一个模块调用另一个模块为主,反向调用的很少或没有),则可以分开检测,一方面减少工作量,同时检测结果也不失实用价值。

12、内容2,在源代码上标出节点。

13、源代码中,只有部分与死锁有关,其他与死锁无关。我们首先要挑出与死锁有关的代码,忽略掉其他代码,并将与死锁有关的代码抽象为有向网络的节点。每个节点都应该有一个id,这个id可以使用该处代码的行号;代码分布在不同文件中时,可加上文件的序号;必要时,可以加上文件名、变量名、代码说明等有意义的字符串。总之,必须使每个节点拥有不同于其他节点的名称,以利互相区分。

14、我们通过阅读源代码标记节点。在编程语言、开发平台有相应工具时,也可以自动识别节点。需要标记的节点有以下四种:

15、内容2.1,资源定义节点。无论何种资源,只要符合
技术介绍
中的前三个条件,都应标记。资源类型无需关注。在一些编程语言中,有些资源没有专门的定义,此时应为其虚拟一个资源定义节点。

16、资源是在资源定义节点上产生的。一个资源定义节点,可能产生多个不同的资源,其id是相同的,但其实是不同的资源。比如,如果资源定义节点每调用一次,就产生一个新的资源,则在该段代码重复调用的情况下,就会产生多个id相同的不同资源。又如,在面向对象编程时,如果将某个资源定义为对象的成员,则每创建一个对象,都会创建一个使用相同id的资源。由于本专利技术采用的是静态检测的方法,并不能区分运行时产生的多个同id的不同资源。因此假定所有同id的资源都是同一个资源。占用其中的任何一个,都相当于占用所有同id资源;只有全部同id的资源都释放,才能说该id的资源被释放。这样做,虽然扩大了风险范围,将本来没有死锁风险的代码判定为有,但不会遗漏确实有死锁风险的代码。

17、内容2.2,资源调用节点。即占用资源的代码。此代码执行时,所在线程将尝试获得此资源。如此资源已被占用,则该线程将无限期等待,直到此前的占用者(也是一个线程)释放此资源才能被该线程占本文档来自技高网...

【技术保护点】

1.一种代码死锁风险检测方法,其特征在于,通过规范的检测方法,确信死锁的循环等待条件不成立,以此确认代码没有死锁风险。

2.如权利要求1所述的规范的检测方法,其特征在于,规定待检测代码的基本约束;将待检测代码抽象为一种数据模型,此数据模型用节点数据表和有向网络图表达;数据模型的建立可以手动,也可以在相关工具的支持下自动进行;对此数据模型进行检查,以排除数据抽象过程中的相当一部分错误;对数据模型进一步进行简化,消除无关因素,减少数据量,使节点间的关系更清晰;对简化后的数据模型进行编号,通过编号能否进行判断代码是否有死锁风险。

3.如权利要求2所述的关于检测范围内代码的基本约束,其中关于资源的约束,适用于在检测范围内曾经被占用的所有资源。约束有三项:

4.如权利要求2所述的数据模型建立,其特征在于基本思路和基本过程。这一基本思路和基本过程适用于所有编程语言。

5.如权利要求4所述的基本思路,其特征在于,尽量舍弃与死锁无关的代码,只保留与死锁有关的代码。循环结构假定只执行一次,选择结构假定各个分支顺序执行。将有关代码均标记为节点,用节点间的关系表示代码间的关系。

6.如权利要求4所述的基本过程,其特征在于,标记资源定义节点,标记占用资源的节点,标记占用资源的节点所在代码段(有关代码段),标记调用有关代码段的代码段,这也是有关代码段,一直标记下去,直到检测范围内再无代码段调用这些有关代码段,或者调用有关代码段的均为线程直接入口为止。为所有标记的节点分配ID。并将上面标记出的节点分为资源定义、资源调用、代码段定义、代码段调用四种类型。确定这些节点的上下关系,具体是确定每个节点的下节点;所述的标记资源定义节点包括如果代码中有资源的明确定义,应以此定义为资源定义节点;如果资源未经定义或申明就直接使用,应为其虚拟一个资源定义节点;所述的确定每个节点的下节点,针对资源定义节点没有任何下节点;所述的确定每个节点的下节点,针对资源调用节点有且只能有一个资源定义节点作为其下节点之一。除此之外,资源调用节点的下节点还可以是资源调用节点和代码段调用节点;所述的资源调用节点的资源调用下节点是在上节点对应的资源占用期间又准备占用的资源的资源调用节点;所述的资源调用节点的代码段调用下节点是在上节点对应的资源占用期间又准备调用的代码段;所述的确定每个节点的下节点,只能是代码段调用节点和资源调用节点,而且至少要有一个下节点;所述的确定每个节点的下节点,针对代码段调用节点只能有一个下节点,而且必须是代码段定义节点。

7.如权利要求2所述的用节点数据表表达数据模型,其特征在于,该数据表是二维表,一行表示一个节点,每行有节点ID、上节点、下节点等字段。上节点字段表示了该节点所有上节点的ID,顺序无所谓。下节点字段表示了该节点所有下节点的ID,顺序无所谓。

8.如权利要求2所述的用有向网络图表达数据模型,其特征在于,每个节点都是有向网络图的一个节点,节点间有直接的上下关系时,用箭头连起来,并且从上节点指向下节点。

9.如权利要求2所述的对数据模型进行简化,其特征在于,舍弃代码段定义节点和代码段调用节点,只保留资源定义节点和资源调用节点(统称资源节点),建立精简节点数据表;在节点数据表中,寻找每个资源节点(节点A)的各个下节点分支中各级下节点中的第一个资源节点(节点B),在精简节点数据表中,以节点B为节点A的下节点,以此建立精简节点数据表各节点的上下关系。

10.如权利要求2所述的对精简节点数据表中的节点进行编号,其特征在于,通过编号能否顺利进行,判断检测范围内的代码是否有死锁风险。如果编号过程正常结束,判定代码没有死锁风险;如果编号异常结束,判断代码存在死锁风险。编号过程分两步,初次编号和再次编号。所有编号从1开始,不能小于1;所述的初次编号包括对所有节点进行编号,保证下节点的编号大于上节点的编号,不同节点的编号可以重复。编号分多轮。第1轮对所有没有上节点的节点进行编号,编号为1;第2轮在去掉已编号节点的基础上,对所有没有上节点的节点进行编号,编号为2……一直进行下去,直到所有节点已编号或异常结束为止;所述的再次编号包括在初次编号正常结束的基础上进行,要求资源调用节点的编号比其资源定义下节点的编号小1。逐个检查,如果发现不合标准则修改资源调用节点的编号使之合规。一个节点的编号修改后,必要时要修改其他节点的编号,最终使所有节点的编号仍然符合初次编号的标准。如果上述过程能进行,为正常结束,否则为异常结束。所述的异常结束包括如果要给某个节点赋予的编号大于节点总数,则异常结束。

...

【技术特征摘要】

1.一种代码死锁风险检测方法,其特征在于,通过规范的检测方法,确信死锁的循环等待条件不成立,以此确认代码没有死锁风险。

2.如权利要求1所述的规范的检测方法,其特征在于,规定待检测代码的基本约束;将待检测代码抽象为一种数据模型,此数据模型用节点数据表和有向网络图表达;数据模型的建立可以手动,也可以在相关工具的支持下自动进行;对此数据模型进行检查,以排除数据抽象过程中的相当一部分错误;对数据模型进一步进行简化,消除无关因素,减少数据量,使节点间的关系更清晰;对简化后的数据模型进行编号,通过编号能否进行判断代码是否有死锁风险。

3.如权利要求2所述的关于检测范围内代码的基本约束,其中关于资源的约束,适用于在检测范围内曾经被占用的所有资源。约束有三项:

4.如权利要求2所述的数据模型建立,其特征在于基本思路和基本过程。这一基本思路和基本过程适用于所有编程语言。

5.如权利要求4所述的基本思路,其特征在于,尽量舍弃与死锁无关的代码,只保留与死锁有关的代码。循环结构假定只执行一次,选择结构假定各个分支顺序执行。将有关代码均标记为节点,用节点间的关系表示代码间的关系。

6.如权利要求4所述的基本过程,其特征在于,标记资源定义节点,标记占用资源的节点,标记占用资源的节点所在代码段(有关代码段),标记调用有关代码段的代码段,这也是有关代码段,一直标记下去,直到检测范围内再无代码段调用这些有关代码段,或者调用有关代码段的均为线程直接入口为止。为所有标记的节点分配id。并将上面标记出的节点分为资源定义、资源调用、代码段定义、代码段调用四种类型。确定这些节点的上下关系,具体是确定每个节点的下节点;所述的标记资源定义节点包括如果代码中有资源的明确定义,应以此定义为资源定义节点;如果资源未经定义或申明就直接使用,应为其虚拟一个资源定义节点;所述的确定每个节点的下节点,针对资源定义节点没有任何下节点;所述的确定每个节点的下节点,针对资源调用节点有且只能有一个资源定义节点作为其下节点之一。除此之外,资源调用节点的下节点还可以是资源调用节点和代码段调用节点;所述的资源调用节点的资源调用下节点是在上节点对应的资源占用期间又准备占用的资源的资源调用节点;所述的资源调用节点的代码段调用下节点是在上...

【专利技术属性】
技术研发人员:李倩雅王晓军马秀娟初健
申请(专利权)人:西安忒亚科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1