一种智能软件代码类型推断方法、系统、设备及存储介质与流程

    专利查询2022-07-08  151



    1.本发明属于智能软件分析技术领域,特别涉及一种智能软件代码类型推断方法、系统、设备及存储介质。


    背景技术:

    2.随着智能软件的应用也在各行各业大力推进,为了使智能软件更好地服务于用户,开发者对于内部的软件模型或不同的模块应不断进行完善及性能提升。目前有越来越多的智能软件内部采用javascript语言进行开发,而javascript是一种动态类型、弱类型的语言,并未使用严格的数据类型,如果因为类型未标注而引发了潜在bug,只有在运行时才会被激发,这样会引入程序代码缺陷,对代码安全性造成影响,增加了程序的脆弱性。因此,为了使开发者对软件代码结构深入了解,准确挖掘程序代码脆弱性,提高javascript智能软件代码的安全性及鲁棒性,对javascript智能软件代码进行类型推断成为了一个关键性的问题。
    3.目前javascript类型推断主要存在以下问题:
    4.1)类型词表限制。推断时如果仅限于训练期间观察到的有限类型字典,则无法预测任何用户自定义的数据类型。
    5.2)预测结果不一致。为不同位置出现的实体预测不同的类型。
    6.3)类型预测的精确度有待提高。


    技术实现要素:

    7.本发明提出一种智能软件代码类型推断方法、系统、设备及存储介质,以解决上述技术问题。本方法可以在源代码真正执行之前预测函数参数及返回值类型,提高软件代码的安全性及鲁棒性,更好地提升软件质量,使智能软件更好地服务于用户。
    8.为达到上述目的,本发明采用了以下技术方案:
    9.一种智能软件代码类型推断方法,包括:
    10.获取带有jsdoc注释的javascript智能软件源代码,遍历源代码的抽象语法树,抽取源代码中函数类型的话题语义信息和ast结构信息,形成json文件;
    11.针对所述json文件,将函数类型的话题语义信息和ast结构信息用知识图谱结构进行表示,构建知识图谱;
    12.将所述知识图谱数据结构中节点特征表示为三元组形式,选用适当的知识图谱的表示算法,进行节点信息的表示学习;学习后得到实体集合和关系集合的特征向量,以特征向量作为图神经网络的输入,在图神经网络内部进行节点消息传播,消息传播分为三个阶段,消息传播阶段,聚合阶段和更新阶段,获取到最终节点状态向量;
    13.构建图神经网络的预测层,根据获取传播后的节点信息,进行概率类型预测;
    14.根据所述概率类型预测输出带有所有推断类型的javascript智能软件源代码。
    15.作为本发明的进一步改进,所述抽取输入程序中与类型推断相关的话题语义信息
    和ast结构信息,具体包括:
    16.针对带有jsdoc注释的javascript智能软件源代码,获取对应的抽象语法树,使用babel/parser解析源码语法树,在其抽象语法树中对特定的函数类型的节点进行遍历;
    17.抽取源代码中函数类型的话题语义信息和ast结构信息,话题语义信息和ast结构信息包括函数的函数名、参数信息、函数相关的注释、和函数返回值类型相关的注释、返回值类型和调用关系,根据函数类型的话题语义信息和ast结构信息形成json文件。
    18.作为本发明的进一步改进,所述知识图谱数据结构的有向图中节点表示函数实体,与节点相连的其他边分别代表函数相关属性,节点与节点之间存在调用关系或控制流关系的有向边。
    19.作为本发明的进一步改进,所述将所述知识图谱数据结构中节点特征表示为三元组形式,具体包括:
    20.根据生成的节点信息,将信息表示为(函数,属性,属性值)的三元组集合,根据transe算法基本思想,把实体按照关系进行映射,构建翻译等式;输入参数为三元组集合s={(h,l,t)},实体集e和关系集l,范围γ和嵌入维度k;
    21.对于每一个实体,随机初始化为规定维数的一个向量;
    22.从训练三元组集合中随机抽出b个向量,对于每个三元组进行打碎生成负例;
    23.计算势能函数,利用梯度下降算法更新h,l,t,不断优化实体和关系的向量表示;
    24.获得实体集合与关系集合的向量表示。
    25.作为本发明的进一步改进,所述利用梯度下降算法更新h,l,t,不断优化实体和关系的向量表示,具体包括:
    26.通过h和l之和与t之差的二范数来表示这个三元组的势能,势能计算如下所示:
    27.f(h,l,t)=‖h l-t‖228.其中,h表示头实体对应的向量,l表示关系对应的向量,t表示尾实体对应的向量,二范数计算公式为:
    [0029][0030]
    根据势能判断是否为最优向量表示,如果是输出,如果否重新从训练三元组集合中随机抽出b个向量。
    [0031]
    作为本发明的进一步改进,所述在图神经网络内部进行节点消息传播,节点特征嵌入向量作为节点的初始状态,边的嵌入向量用来在相关边之间传递消息,分为三个阶段,具体包括:
    [0032]
    消息传递阶段,消息函数的功能是能够生成传递节点u到邻居节点v的消息向量其中节点v编码节点u中类型信息;在知识图谱中,把关系的特征作为嵌入向量然后通过以下消息函数将关系特征向量嵌入到消息向量中:
    [0033][0034]
    其中,是学习参
    数,表示第k步时的消息向量,表示第k-1步时节点u的状态向量,e
    uv
    表示关系特征向量。
    [0035]
    消息聚合阶段,为所有的节点u∈n(v)计算完消息向量m
    uv
    后,集成函数把消息向量集成到一个向量中赋给节点v,此时节点v中携带着其他节点u中包含的信息,采用的具体计算如下所示:
    [0036][0037]
    其中,表示第k步时的消息向量,表示节点v在第k步时集成了其他节点信息后的集成向量。
    [0038]
    消息更新阶段,在类型推断时,类型信息在多轮传播时传播到多个函数节点,采用门控循环单元作为更新函数,采用的具体计算如下所示:
    [0039][0040]
    其中,表示节点v在第k步时集成了其他节点信息后的集成向量,表示节点v在第k-1步的状态向量,表示节点v在第k步时的最终状态向量。
    [0041]
    作为本发明的进一步改进,所述根据获取传播后的节点信息,进行概率类型预测,具体包括:
    [0042]
    根据生成的最终节点状态向量,使用一个全连接层及softmax函数把经过k轮消息传播后的最终的节点状态转换为候选类型上的概率分布,输出一个最有可能的类型作为节点的推断类型。
    [0043]
    一种智能软件代码类型推断系统,包括:
    [0044]
    获取模块,用于获取带有jsdoc注释的javascript智能软件源代码,遍历源代码的抽象语法树,抽取源代码中函数类型的话题语义信息和ast结构信息,形成json文件;
    [0045]
    构建模块,用于针对所述json文件,将函数类型的话题语义信息和ast结构信息用知识图谱结构进行表示,构建知识图谱;
    [0046]
    学习模块,用于将所述知识图谱数据结构中节点特征表示为三元组形式,选用适当的知识图谱的表示算法,进行节点信息的表示学习;学习后得到实体集合和关系集合的特征向量,以特征向量作为图神经网络的输入,在图神经网络内部进行节点消息传播,消息传播分为三个阶段,消息传播阶段,聚合阶段和更新阶段,获取到最终节点状态向量;
    [0047]
    预测模块,用于构建图神经网络的预测层,根据获取传播后的节点信息,进行概率类型预测;
    [0048]
    推断模块,用于根据所述概率类型预测输出带有所有推断类型的javascript智能软件源代码。
    [0049]
    一种电子设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现所述智能软件代码类型推断方法的步骤。
    [0050]
    一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计
    算机程序被处理器执行时实现所述智能软件代码类型推断方法的步骤。
    [0051]
    与现有技术相比,本发明的有益效果体现在:
    [0052]
    针对javascript智能软件中可能出现的因为类型引发潜在bug,从而导致软件缺陷的情况,本方法采用依赖抽取技术,构建知识图谱表示程序,以及图神经网络对函数参数和返回值类型进行推断。将图中节点信息进行表示学习,进而使用图神经网络在节点间消息传播,进行实体概率类型预测。通过以上方法,可以在源代码真正执行之前预测函数参数及返回值类型,提高软件代码的安全性及鲁棒性,更好地提升软件质量,使智能软件更好地服务于用户。
    [0053]
    进一步构建知识图谱采用图表示程序,图中节点代表依赖抽取的函数,节点属性包含该函数的话题语义信息、ast结构信息如函数相关注释,参数信息等,本发明抽取源代码中的自然语言信息及ast中的结构信息用于构建知识图谱,进行程序表示,推断信息更为直观全面。
    附图说明
    [0054]
    图1为本发明方法整体流程图;
    [0055]
    图2为本发明抽取javascript源码中节点信息的方法流程图;
    [0056]
    图3为本发明特征三元组转化为特征向量的方法流程图;
    [0057]
    图4为本发明图神经网络内部消息传播的方法流程图;
    [0058]
    图5为本发明具体实施例给出的知识图谱结构示意图;
    [0059]
    图6为本发明时序数据断网续传场景下计算标签的数据补算系统示意图;
    [0060]
    图7为本发明优选实施例电子设备结构示意图。
    具体实施方式
    [0061]
    下面将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本技术中的实施例及实施例中的特征可以相互组合。
    [0062]
    以下详细说明均是示例性的说明,旨在对本发明提供进一步的详细说明。除非另有指明,本发明所采用的所有技术术语与本技术所属领域的一般技术人员的通常理解的含义相同。本发明所使用的术语仅是为了描述具体实施方式,而并非意图限制根据本发明的示例性实施方式。
    [0063]
    本发明提供一种智能软件代码类型推断方法,javascript智能软件中使用弱类型、动态类型的javascript作为主体语言,并未使用严格的数据类型,缺失类型信息可能招致潜在bug,在运行时才会被激发,导致软件缺陷,增加程序脆弱性。因此,本发明采用知识图谱表示程序,图中节点代表依赖抽取的函数实体,节点属性包含该函数的话题语义信息、ast结构信息如函数相关注释、参数信息等,节点与节点之间的有向边表示为函数之间的调用关系或控制流关系,将图中节点信息进行表示学习,使用图神经网络在节点间消息传播,进行函数参数和返回值概率类型预测。此方法的目标是给定输入的包含jsdoc注释的源代码,转换为知识图谱结构,对图结构数据进行javascript函数未标注类型的推断。
    [0064]
    下面结合附图详细说明本发明基于知识图谱的javascript智能软件代码类型推断方法的具体实施方式。
    [0065]
    图1为本发明基于知识图谱的javascript智能软件代码类型推断方法的整体流程图;
    [0066]
    本发明公开一种基于知识图谱的javascript智能软件代码类型推断方法,包括以下步骤:
    [0067]
    s1:分析、抽取javascript智能软件源代码,关注包含了jsdoc注释的源码,遍历源代码的抽象语法树,抽取函数类型的话题语义信息和ast结构信息,如文本注释中的函数相关注释,参数信息等。
    [0068]
    图2为本发明抽取源码中节点信息的方法流程图。
    [0069]
    具体而言,可以分为以下步骤:
    [0070]
    s101:输入包含jsdoc注释的程序代码,获取对应的抽象语法树,使用babel/parser解析源码语法树,在其抽象语法树中对特定的函数类型的节点进行遍历。
    [0071]
    s102:抽取该函数的函数名,参数信息(包括参数名,参数相关注释,参数类型),与函数相关的注释,和函数返回值类型相关的注释,返回值类型,调用关系等话题语义信息和ast结构信息,输出为json文件。
    [0072]
    s2:定义知识图谱数据结构表示程序,根据步骤s1的实体信息json文件,节点表示函数实体,与节点相连的边代表函数相关的属性,如name,comment,param,return type等,函数节点与节点之间存在调用关系或控制流关系的有向边。
    [0073]
    具体而言,定义的知识图谱结构与json文件中的节点输出一一对应,属性包含语法树上获取的与函数相关的comment,函数名,函数形参序列,函数返回值,元数据(行列号,内部变量,节点id等)相关信息等,形参序列中包含参数名,与参数相关注释,参数类型等。其中,如果在jsdoc注释中未发现参数类型或返回值类型,输出为空,即是需要利用已知类型推断未知类型的部分。
    [0074]
    步骤s3:将知识图谱中节点特征表示为三元组形式,选用适当的知识图谱的表示算法,进行节点信息的表示学习。
    [0075]
    图3为本发明知识图谱特征三元组转换为特征向量的方法流程图。
    [0076]
    具体而言,可以分为以下步骤:
    [0077]
    s301:根据步骤s102中生成的节点信息,将信息表示为(函数,属性,属性值)的三元组集合,根据transe算法基本思想,首先把实体按照关系进行映射,然后与该关系构建翻译等式。输入为三元组集合s={(h,l,t)},实体集e和关系集l,范围γ和嵌入维度k。
    [0078]
    s302:对于每一个实体,首先将它随机初始化为规定维数的一个向量。
    [0079]
    s303:从训练三元组中随机抽出b个向量,对于每个三元组进行打碎(随机替换头或尾,但不能同时替换)生成负例。
    [0080]
    s304:计算势能函数,利用梯度下降算法更新h,l,t,不断优化实体和关系的向量表示。通过h和l之和与t之差的二范数来表示这个三元组的势能。对于一个正确的三元组,希望势能越低越好,而对于一个错误的三元组,希望势能越高越好。势能计算公式如下所示:
    [0081]
    f(h,l,t)=‖h l-t‖2[0082]
    其中,h表示头实体对应的向量,l表示关系对应的向量,t表示尾实体对应的向量,二范数计算公式为:
    [0083][0084]
    步骤s4:学习后得到实体集合和关系集合的特征向量表示,以此作为图神经网络的输入,在图神经网络内部进行节点消息传播,消息传播分为三个阶段,消息传播阶段,聚合阶段和更新阶段,获取到节点的最终状态。
    [0085]
    图4为本发明图神经网络内部消息传播的方法流程图。
    [0086]
    具体而言,可以分为以下步骤:
    [0087]
    s401:消息传播阶段。消息函数的功能是能够生成传递节点u到邻居节点v的消息向量其中节点v编码u中类型信息。在知识图谱中,把关系的特征作为嵌入向量然后通过以下消息函数将关系特征向量嵌入到消息向量中:
    [0088][0089]
    其中,是学习参数,表示第k步时的消息向量,表示第k-1步时节点u的状态向量,e
    uv
    表示关系特征向量。
    [0090]
    s402:消息聚合阶段。为所有的节点u∈n(v)计算完消息向量m
    uv
    后,集成函数把消息向量集成到一个向量中赋给节点v,采用的具体计算公式如下所示:
    [0091][0092]
    其中,表示第k步时的消息向量,表示节点v在第k步时集成了其他节点信息后的集成向量。
    [0093]
    s403:消息更新阶段。在类型推断时,类型信息可能会在多轮传播时传播到多个函数节点,采用门控循环单元作为更新函数,采用的具体计算公式如下所示:
    [0094][0095]
    其中,表示节点v在第k步时集成了其他节点信息后的集成向量,表示节点v在第k-1步的状态向量,表示节点v在第k步时的最终状态向量。
    [0096]
    步骤s5:构建图神经网络的预测层,获取传播后的节点信息,进行概率类型预测。进一步的,所述步骤s5中,使用一个全连接层及softmax函数把经过k轮消息传播后的最终的节点状态转换为候选类型上的概率分布,输出一个最有可能的类型作为节点的推断类型。
    [0097]
    本发明进一步的改进在于:所述步骤s1中,使用babel/parser在包含了jsdoc注释的源码的语法树上进行函数实体信息的抽取,抽取的完善信息为后续的知识图谱构建提供
    数据支撑。
    [0098]
    本发明的进一步改进在于:所述步骤s2中,用知识图谱结构表示程序,使节点通过属性或关系的形式更全面的携带对应的语义或结构信息,并且清晰直观。
    [0099]
    为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面结合具体实施例详细说明本发明的具体实施方式。
    [0100]
    一种智能软件代码类型推断方法,包括如下步骤:
    [0101]
    以一段包含jsdoc注释的javascript源代码片段为例:
    [0102][0103][0104]
    s1:分析、抽取javascript智能软件源代码,关注包含了jsdoc注释的源码,输出为包含函数相关属性,如函数名,参数信息(包括参数名,参数相关注释,参数类型),与函数相关的注释,和函数返回值类型相关的注释,返回值类型,元数据(行列号,内部变量,节点id等)等的文件。输出文件结构按以下形式组织:
    [0105][0106]
    s2:定义知识图谱数据结构表示程序,根据步骤s1的实体信息json文件,节点表示函数实体,与节点相连的边代表函数相关的属性,如name,comment,param,return type等,函数节点与节点之间存在调用关系或控制流关系的有向边。知识图谱结构按以下如图5所示的形式组织。
    [0107]
    步骤s3:将知识图谱中节点特征表示为三元组形式,选用transe算法,进行节点信息的表示学习。将知识图谱信息预处理为三元组集合文件train.txt,预处理实体集与关系
    集映射文件为entity2id.txt和relation2id.txt,以此作为transe算法输入。此处以wn18公共数据集作为transe输入示例,文件结构按以下形式组织:
    [0108][0109]
    train.txt
    [0110][0111]
    设置输入参数,范围为1.0,嵌入维度为50,学习率为0.01,采用二范数,如下所示:
    [0112]
    transe=transe(entity_set,relation_set,triple_list,embedding_dim=50,,lr=0.01,margin=1.0,norm=2)
    [0113]
    步骤s4:学习后得到实体集合和关系集合的特征向量表示,输出实体向量表示和关系向量表示文件,如下所示:
    [0114]
    entity_embedding.txt:
    [0115][0116]
    relation_embedding.txt:
    [0117][0118]
    将知识图谱信息按以上方式组织,将输出的实体集合和关系集合的向量表示文件作为图神经网络的输入,在图神经网络内部进行节点消息传播,消息传播分为三个阶段,消息传播阶段,聚合阶段和更新阶段,获取到节点的最终状态。
    [0119]
    步骤s5:构建图神经网络的预测层,获取传播后的节点信息,进行概率类型预测。进一步的,所述步骤s5中,使用一个全连接层及softmax函数把经过k轮消息传播后的最终的节点状态转换为候选类型上的概率分布,输出一个最有可能的类型作为节点的推断类型。
    [0120]
    假设候选类型为t={number,boolean,string,array},基于候选类型上的概率分布为[0.3,0.7,0.2,0.1],则推断最有可能的类型为boolean类型。
    [0121]
    训练结束最终输出包含了已知类型及推断类型的源代码文件。
    [0122]
    综上所述,本发明方法可以针对javascript智能软件中的函数参数和返回值,进行自动化分析并推断类型,相比于人工标注类型,提高了效率和准确率;因此本发明提供了一种javascript类型推断的思路,即利用源代码中的自然语言信息及ast中的结构信息构建知识图谱,从而在知识图谱上利用图神经网络技术进行类型推断,是新兴人工智能技术在智能软件分析领域的应用。
    [0123]
    如图6所示,本发明还提供一种智能软件代码类型推断系统,包括:
    [0124]
    获取模块,用于获取带有jsdoc注释的javascript智能软件源代码,遍历源代码的抽象语法树,抽取源代码中函数类型的话题语义信息和ast结构信息,形成json文件;
    [0125]
    构建模块,用于针对所述json文件,将函数类型的话题语义信息和ast结构信息用知识图谱结构进行表示,构建知识图谱;
    [0126]
    学习模块,用于将所述知识图谱数据结构中节点特征表示为三元组形式,选用适当的知识图谱的表示算法,进行节点信息的表示学习;学习后得到实体集合和关系集合的特征向量,以特征向量作为图神经网络的输入,在图神经网络内部进行节点消息传播,消息传播分为三个阶段,消息传播阶段,聚合阶段和更新阶段,获取到最终节点状态向量;
    [0127]
    预测模块,用于构建图神经网络的预测层,根据获取传播后的节点信息,进行概率类型预测;
    [0128]
    推断模块,用于根据所述概率类型预测输出带有所有推断类型的javascript智能软件源代码。
    [0129]
    如图7所示,本发明第三个目的是提供一种电子设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现所述智能软件代码类型推断方法的步骤。
    [0130]
    所述智能软件代码类型推断方法,包括:
    [0131]
    获取带有jsdoc注释的javascript智能软件源代码,遍历源代码的抽象语法树,抽取源代码中函数类型的话题语义信息和ast结构信息,形成json文件;
    [0132]
    针对所述json文件,将函数类型的话题语义信息和ast结构信息用知识图谱结构进行表示,构建知识图谱;
    [0133]
    将所述知识图谱数据结构中节点特征表示为三元组形式,选用适当的知识图谱的表示算法,进行节点信息的表示学习;学习后得到实体集合和关系集合的特征向量,以特征向量作为图神经网络的输入,在图神经网络内部进行节点消息传播,消息传播分为三个阶段,消息传播阶段,聚合阶段和更新阶段,获取到最终节点状态向量;
    [0134]
    构建图神经网络的预测层,根据获取传播后的节点信息,进行概率类型预测;
    [0135]
    根据所述概率类型预测输出带有所有推断类型的javascript智能软件源代码。
    [0136]
    本发明第四个目的是提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述智能软件代码类型推断方法的步骤。
    [0137]
    所述智能软件代码类型推断方法,包括:
    [0138]
    获取带有jsdoc注释的javascript智能软件源代码,遍历源代码的抽象语法树,抽取源代码中函数类型的话题语义信息和ast结构信息,形成json文件;
    [0139]
    针对所述json文件,将函数类型的话题语义信息和ast结构信息用知识图谱结构进行表示,构建知识图谱;
    [0140]
    将所述知识图谱数据结构中节点特征表示为三元组形式,选用适当的知识图谱的表示算法,进行节点信息的表示学习;学习后得到实体集合和关系集合的特征向量,以特征向量作为图神经网络的输入,在图神经网络内部进行节点消息传播,消息传播分为三个阶段,消息传播阶段,聚合阶段和更新阶段,获取到最终节点状态向量;
    [0141]
    构建图神经网络的预测层,根据获取传播后的节点信息,进行概率类型预测;
    [0142]
    根据所述概率类型预测输出带有所有推断类型的javascript智能软件源代码。
    [0143]
    本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
    [0144]
    本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
    [0145]
    这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
    [0146]
    这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
    [0147]
    最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求保护范围之内。
    转载请注明原文地址:https://tc.8miu.com/read-2142.html

    最新回复(0)