一种基于图卷积网络的软件缺陷预测方法

未命名 10-20 阅读:67 评论:0


1.本发明涉及软件缺陷预测技术领域,特别是涉及一种基于图卷积网络的软件缺陷预测方法。


背景技术:

2.随着软件工程技术的不断发展,对软件缺陷的研究已经逐渐成为软件可靠性研究的热点。根据ieee标准1044-2009,软件缺陷是“软件产品中的不完善或缺陷,该产品不符合其要求或规格,需要进行修复或替换”。目前,研究者们广泛使用机器学习技术(如逻辑回归、支持向量机、朴素贝叶斯和随机森林等)和深度学习技术(如bp神经网络、卷积神经网络、图神经网络等)进行软件缺陷预测。此外,缺陷预测的粒度主要划分为文件级、类级和方法级(在面向对象程序实现的项目中,文件粒度也被称为类粒度)。然而,目前大多数方法的预测粒度仍然在文件级别,被认为是粗粒度的。据统计,一个文件中通常只有1%-3%的代码行是有缺陷的,这表明当文件预测为缺陷时,开发人员可能将大量的时间和精力浪费在进一步定位文件中的可能有缺陷的代码行上。
3.行级别软件缺陷预测模型可以帮助开发和测试人员快速定位高风险代码行,从而显著降低软件缺陷修复成本,提高软件缺陷修复效率。然而,在行级别缺陷预测中,一行代码包含的语义信息有限,现有技术大多采用粗粒度缺陷预测,难以充分表达其中的含义,导致预测性能较差。


技术实现要素:

4.本发明的目的在于提供一种基于图卷积网络的软件缺陷预测方法,以解决现有技术预测性能差的问题。
5.一种基于图卷积网络的软件缺陷预测方法,包括:s1,采集含有多个软件版本的项目集合,根据项目集合构建原始缺陷预测数据集,将原始缺陷预测数据集拆分为训练集、验证集和测试集,所述训练集、验证集和测试集均包含源代码文件以及指示文件是否有缺陷的缺陷指示标签;s2,提取训练集或验证集或测试集中的源代码文件对应的程序依赖图,在程序依赖图中,节点对应软件中的代码行,边对应关系;s3,将程序依赖图中的节点和边进行细化,得到细化后的程序依赖图;s4,使用流信息扩展方法将细化后的程序依赖图中节点对应的语句扩展为多行,得到经过流信息扩展后的语句;s5,使用词嵌入技术将经过流信息扩展后的语句转换为低维空间向量,并将低维空间向量作为细化后的程序依赖图中节点的特征,从而得到词嵌入后的程序依赖图,其中,对于训练集中的源代码文件,得到训练集对应的词嵌入后的程序依赖图,对于验证集中的源代码文件,得到验证集对应的词嵌入后的程序依赖图,对于测试集中的源代码文件,得到测试集对应的词嵌入后的程序依赖图;
s6,基于训练集和验证集构建图卷积网络模型,将训练集对应的词嵌入后的程序依赖图和验证集对应的词嵌入后的程序依赖图输入至图卷积网络模型,在训练集上训练并在验证集上进行验证,从而得到已训练的图卷积网络模型;s7,使用已训练的图卷积网络模型对测试集对应的词嵌入后的程序依赖图进行预测,若预测结果为测试集有缺陷,则将已训练的图卷积网络模型和测试集对应的词嵌入后的程序依赖图同时输入至事后解释模型,通过事后解释模型提取出测试集对应的最小子图,使用社交网络分析方法计算测试集对应的最小子图中各个节点的节点重要度,并根据测试集对应的最小子图中各个节点对应的代码行的缺陷指示标签确定节点重要度阈值;s8,获取待测试的软件对应的词嵌入后的程序依赖图,并将已训练的图卷积网络模型和待测试的软件对应的词嵌入后的程序依赖图同时输入至事后解释模型,通过事后解释模型提取出待测试的软件对应的最小子图,使用社交网络分析方法计算待测试的软件对应的最小子图中各个节点的节点重要度,将待测试的软件对应的最小子图中各个节点的节点重要度分别与重要度阈值进行对比分析,从而识别出待测试的软件中存在缺陷的代码行。
6.根据本发明提供的基于图卷积网络的软件缺陷预测方法,针对单行代码无法实现语义可区分问题,提出使用程序依赖图中的流信息对原始语句进行扩展,使代码行包含的语义更加丰富,通过使用词嵌入技术将经过流信息扩展后的语句转换为低维空间向量,并将低维空间向量作为细化后的程序依赖图中节点的特征,可以完整保留源代码文件的结构和语义信息,能够更好的学习与缺陷相关特征,此外,若软件存在缺陷,则继续使用事后解释模型提取对模型预测具有关键影响的最小子图,使用社交网络分析方法计算最小子图中各个节点的节点重要性,以节点重要性作为对应代码行的缺陷评估指标,能够有效提升行级别的软件缺陷预测性能。
附图说明
7.图1为一实施例的基于图卷积网络的软件缺陷预测方法的流程图。
具体实施方式
8.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
9.请参阅图1,一种基于图卷积网络的软件缺陷预测方法,包括步骤s1~s8:s1,采集含有多个软件版本的项目集合,根据项目集合构建原始缺陷预测数据集,将原始缺陷预测数据集拆分为训练集、验证集和测试集,所述训练集、验证集和测试集均包含源代码文件以及指示文件是否有缺陷的缺陷指示标签。
10.其中,原始缺陷预测数据集中的每个软件项目都需要收集三个或更多版本。可以以原始缺陷预测数据集中软件项目的首个版本作为训练集,第二个版本作为验证集,除训练集和验证集外的软件版本作为测试集。对于缺陷指示标签,存在缺陷的文件为缺陷文件,不存在缺陷的文件为无缺陷文件,缺陷文件中的缺陷语句一并给出。
11.s2,提取训练集或验证集或测试集中的源代码文件对应的程序依赖图,在程序依赖图中,节点对应软件中的代码行,边对应关系。
12.其中,关系包含源代码的控制依赖和数据依赖关系。具体可以先对源代码文件进行特征提取,将源代码转化为结构化数据,从而提取软件中的数据依赖和控制依赖关系。
13.s3,将程序依赖图中的节点和边进行细化,得到细化后的程序依赖图。
14.其中,步骤s3具体包括:将程序依赖图中的节点类型由单一类型细化为三类,分别为:变量定义的节点、判断的节点、执行语句的节点;将程序依赖图中的控制流边细化为三类,分别为:判断条件为1语句执行的边、判断条件为0语句执行的边、下一次执行的边。
15.节点的细化可以实现将不同类型的代码行加以区分,边的细化可以更清晰体现源代码的执行流程。通过将程序依赖图进一步细分可以充分利用源代码的结构信息,挖掘程序依赖图结构中的缺陷相关信息。
16.s4,使用流信息扩展方法将细化后的程序依赖图中节点对应的语句扩展为多行,得到经过流信息扩展后的语句。
17.其中,步骤s4具体包括:将细化后的程序依赖图中的节点对应的语句,按照后向数据流、后向控制流、当前代码行、前向控制流以及前向数据流的方式扩展为多行,且控制流扩展的优先级为:判断条件为1的控制流的优先级大于下一次执行的控制流的优先级,下一次执行的控制流的优先级大于判断条件为0的控制流的优先级。
18.需要指出的是,使用流信息对程序依赖图中的节点对应的代码行进行语义扩展,将原始语句按照后向数据流、后向控制流、当前代码行、前向控制流以及前向数据流的方式扩展为多行,若该行代码无对应的流信息则将该信息舍弃,如某行代码不存在后向数据流,则将后向数据流舍弃,以此类推。
19.s5,使用词嵌入技术将经过流信息扩展后的语句转换为低维空间向量,并将低维空间向量作为细化后的程序依赖图中节点的特征,从而得到词嵌入后的程序依赖图,其中,对于训练集中的源代码文件,得到训练集对应的词嵌入后的程序依赖图,对于验证集中的源代码文件,得到验证集对应的词嵌入后的程序依赖图,对于测试集中的源代码文件,得到测试集对应的词嵌入后的程序依赖图。
20.其中,使用词嵌入技术将经过流信息扩展后的语句转换为低维空间向量具体包括:将经过流信息扩展后的语句进行合并以构建语料库,通过doc2vec在语料库上学习固定长度的向量表示形式,从而使用doc2vec分别提取经过流信息扩展后语句的低维空间向量。低维空间向量将包含扩展后的语句的完整语义信息。将这些低维空间向量汇入程序依赖图对应的节点处,作为词嵌入后的程序依赖图中的节点特征,词嵌入后的程序依赖图中将包含源代码文件的结构信息和语义信息。
21.s6,基于训练集和验证集构建图卷积网络模型,将训练集对应的词嵌入后的程序依赖图和验证集对应的词嵌入后的程序依赖图输入至图卷积网络模型,在训练集上训练并在验证集上进行验证,从而得到已训练的图卷积网络模型。
22.s7,使用已训练的图卷积网络模型对测试集对应的词嵌入后的程序依赖图进行预
测,若预测结果为测试集有缺陷,则将已训练的图卷积网络模型和测试集对应的词嵌入后的程序依赖图同时输入至事后解释模型,通过事后解释模型提取出测试集对应的最小子图,使用社交网络分析方法计算测试集对应的最小子图中各个节点的节点重要度,并根据测试集对应的最小子图中各个节点对应的代码行的缺陷指示标签确定节点重要度阈值。
23.本实施例中,所述事后解释模型采用图解释器gnnexplainer。gnnexplainer能够使词嵌入后的程序依赖图和最小子图之间的分数差异最小。最小子图中的节点可视作导致文件缺陷的重要语句。
24.其中,社交网络分析方法计算节点重要性采用的是度中心性、katz中心性和紧密中心性。
25.度中心性体现的是当前节点所连接节点的百分比。度中心性是在网络分析中刻画节点中心性的最直接度量指标,一个节点的度越大则相应的度中心性越高,该节点在网络中越重要。
26.katz中心性通过计算直接邻居的数量,以及通过这些直接邻居连接到的所有其它节点的数量,来计算节点的相对影响。
27.紧密中心性反映一个节点与网络中的所有其它节点的接近程度。紧密中心性定义为从该节点到其它节点的最短路径长度的平均值。一个节点的平均最短距离越小,该节点的紧密中心性越大。
28.具体的,节点重要度的计算公式如下:;;;;;;;其中,表示节点i的节点重要度,表示归一化后的节点i的度中心性值,表示归一化后的节点i的katz中心性值,表示归一化后的节点i的紧密中心性值;g表示词嵌入后的程序依赖图,表示节点i的度,表示g中所有节点的度,max表示取最大值函数,节点i的katz中心性值,为衰减因子,用于惩罚节点与远邻居之间的连接;为g的特征值,是g的邻接矩阵中的元素,如果节点i与节点j相连,则的取值为1,否则为0;表示第j个节点的katz中心性值,为用于控制初始中心性的常数,表示节点i的紧密中心性值,n表示g中的
节点的总数量,表示节点i和节点j之间的距离,表示g中所有节点的紧密中心性值的最大值。
29.需要指出的是,节点重要度的数值越大,存在缺陷的可能性就越大。由于测试集中各个代码行是否有缺陷是已知信息,因此,只需计算出测试集中各个代码行对应节点的节点重要度,找到有缺陷的代码行对应节点的节点重要度、以及没有缺陷的代码行对应节点的节点重要度,就可以确定出节点重要度阈值。具体的,可以取有缺陷的代码行对应节点的节点重要度和没有缺陷的代码行对应节点的节点重要度之间的某个值作为节点重要度阈值,直接将没有缺陷的代码行对应节点的节点重要度中的最大值作为节点重要度阈值。
30.可以理解的,可以将不在最小子图中的节点对应的节点重要度定义为0。
31.s8,获取待测试的软件对应的词嵌入后的程序依赖图,并将已训练的图卷积网络模型和待测试的软件对应的词嵌入后的程序依赖图同时输入至事后解释模型,通过事后解释模型提取出待测试的软件对应的最小子图,使用社交网络分析方法计算待测试的软件对应的最小子图中各个节点的节点重要度,将待测试的软件对应的最小子图中各个节点的节点重要度分别与重要度阈值进行对比分析,从而识别出待测试的软件中存在缺陷的代码行。
32.具体的,若将没有缺陷的代码行对应节点的节点重要度中的最大值作为节点重要度阈值,则对于待测试的软件中的代码行,只要其对应的节点重要度大于节点重要度阈值,就可以确定该代码行存在缺陷。
33.下面对本发明提供的方法分别进行文件级别预测实验和行级别预测实验。
34.对于文件级别预测实验,将本发明的方法和其它三种现有技术的方法进行对比实验,其它三种现有技术的方法分别为:cnn、dbn和bi-lstm,dnn为一种基于卷积神经网络的文件级别缺陷预测方法,dbn为一种基于深度信念网络的文件级别缺陷预测方法,bi-lstm为一种基于双向长短时记忆网络的文件级别缺陷预测方法。本发明提供的方法和其它三种现有技术的方法在相同的环境、相同的数据集下进行实验。
35.以activemq软件作为实验对象,有三个版本,分别为5.2.0、5.3.0和5.8.0。activemq软件的文件数为:1884-3420,代码行数为:142k-299k,缺陷文件数为:2%-7%,缺陷行数为:0.08%-0.44%。
36.采用auc、balanced accuracy和mcc这三种文件级别评价指标。auc是roc曲线下的面积,auc取值范围为[0,1],值为1表示模型预测效果最好,值为0.5表示随机猜测;balanced accuracy衡量真阳性率(即有多少预测的缺陷文件是正确的)和真阴性率(即有多少预测的无缺陷文件是正确的)的平均值,高balanced accuracy表明方法可以准确预测有缺陷文件和无缺陷文件。mcc衡量实际结果和预测结果之间的相关系数,mcc值取值范围为[-1, 1],其中mcc值为1表示预测效果最佳,-1表示预测结果与实际完全不一致。
[0037]
表1展示了本发明的方法与其它三种现有技术的方法的文件级别预测结果对比。
[0038]
表1
从表1可以看出,本发明的方法实现了0.826的auc、0.669的balanced accuracy和0.198的mcc预测性能,相比其它三种现有技术的方法,本发明提出的方法在auc和balanced accuracy指标上表现更优,在真实的开发场景中,开发人员往往更加重视缺陷概率高的文件,高auc值表明在根据缺陷概率对文件进行排名时,能够取得良好的效果。因此,本发明的方法可以适用于实际场景,能够帮助开发人员更有效地识别潜在的软件缺陷。
[0039]
对于行级别预测实验,将本发明的方法和其它两种现有技术的方法进行对比实验,其它两种现有技术的方法分别为:n.gram和errorprone。n.gram为一种基于缓存的语言模型,即适用源代码检测的增强型n-gram模型;errorprone为google的静态分析工具。本发明提供的方法和其它两种现有技术的方法在相同的环境、相同的数据集下进行实验。
[0040]
仍然以activemq软件作为实验对象,有三个版本,分别为5.2.0、5.3.0和5.8.0。activemq软件的文件数为:1884-3420,代码行数为:142k-299k,缺陷文件数为:2%-7%,缺陷行数为:0.08%-0.44%。
[0041]
采用recall@top20%loc、effort@top20%recall和这三种行级别评价指标。
[0042]
recall@top20%loc的计算方式如下:首先,将测试集上软件项目的所有源代码文件进行合并,根据代码行的缺陷风险系数由高到低进行排序,从上到下统计检查前20%代码行时,找到的缺陷占总缺陷数的比例。recall@top20%loc值越高,说明方法可以将许多实际的缺陷代码行排在最前面。当工作量固定的情况下,可以找到更多实际存在缺陷的代码行;recall@top20%loc值越低表明更多无缺陷的代码行在前20%的代码行中,开发人员需要花费更多的精力来定位有缺陷的代码行。
[0043]
effort@top20%recall的计算方式如下:首先,将测试集上软件项目的所有源代码文件进行合并,根据代码行的缺陷风险系数由高到低进行排序,从上到下统计找到20%的实际缺陷代码行时,需要检查的代码行数占软件项目所有代码行数的比例。effort@top20%recall的数值越低,表明开发人员只需花费很少的精力即可找到前20%的实际缺陷行;effort@top20%recall的数值越高,说明开发人员需花费更多精力来找到整个版本前20%的实际缺陷行;的计算方式如下:首先,将测试集上软件项目的所有源代码文件进行合并,根据代码行的缺陷风险系数由高到低进行排序,从上到下统计找到第一条缺陷代码行之前需要统计多少条无缺陷的代码行。值越低,说明排名靠前的无缺陷行越少,而值越高,说明开发者会在无缺陷代码行上花费更多不必要的精力。
[0044]
表2展示了本发明的方法与其它两种现有技术的方法的行级别预测结果对比。
[0045]
表2
从表2可以看出,本发明的方法实现了0.431的recall@top20%loc、0.100的effort@top20%recall以及88的。相比其它两种现有技术的方法,本发明提出的方法在行级别预测的性能上表现更优,且在recall@top20%loc和effort@top20%recall指标上显著优于其它方法,该结果表明,本发明的方法在行级别软件缺陷预测中实现了最高的成本效益,即付出最少的工作量可以找到最多的缺陷代码行。
[0046]
综上,根据本发明提供的基于图卷积网络的软件缺陷预测方法,针对单行代码无法实现语义可区分问题,提出使用程序依赖图中的流信息对原始语句进行扩展,使代码行包含的语义更加丰富,通过使用词嵌入技术将经过流信息扩展后的语句转换为低维空间向量,并将低维空间向量作为细化后的程序依赖图中节点的特征,可以完整保留源代码文件的结构和语义信息,能够更好的学习与缺陷相关特征,此外,若软件存在缺陷,则继续使用事后解释模型提取对模型预测具有关键影响的最小子图,使用社交网络分析方法计算最小子图中各个节点的节点重要性,以节点重要性作为对应代码行的缺陷评估指标,能够有效提升行级别的软件缺陷预测性能。
[0047]
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
[0048]
尽管已经示出和描述了本发明的实施例,本领域的普通技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由权利要求及其等同物限定。

技术特征:
1.一种基于图卷积网络的软件缺陷预测方法,其特征在于,包括:s1,采集含有多个软件版本的项目集合,根据项目集合构建原始缺陷预测数据集,将原始缺陷预测数据集拆分为训练集、验证集和测试集,所述训练集、验证集和测试集均包含源代码文件以及指示文件是否有缺陷的缺陷指示标签;s2,提取训练集或验证集或测试集中的源代码文件对应的程序依赖图,在程序依赖图中,节点对应软件中的代码行,边对应关系;s3,将程序依赖图中的节点和边进行细化,得到细化后的程序依赖图;s4,使用流信息扩展方法将细化后的程序依赖图中节点对应的语句扩展为多行,得到经过流信息扩展后的语句;s5,使用词嵌入技术将经过流信息扩展后的语句转换为低维空间向量,并将低维空间向量作为细化后的程序依赖图中节点的特征,从而得到词嵌入后的程序依赖图,其中,对于训练集中的源代码文件,得到训练集对应的词嵌入后的程序依赖图,对于验证集中的源代码文件,得到验证集对应的词嵌入后的程序依赖图,对于测试集中的源代码文件,得到测试集对应的词嵌入后的程序依赖图;s6,基于训练集和验证集构建图卷积网络模型,将训练集对应的词嵌入后的程序依赖图和验证集对应的词嵌入后的程序依赖图输入至图卷积网络模型,在训练集上训练并在验证集上进行验证,从而得到已训练的图卷积网络模型;s7,使用已训练的图卷积网络模型对测试集对应的词嵌入后的程序依赖图进行预测,若预测结果为测试集有缺陷,则将已训练的图卷积网络模型和测试集对应的词嵌入后的程序依赖图同时输入至事后解释模型,通过事后解释模型提取出测试集对应的最小子图,使用社交网络分析方法计算测试集对应的最小子图中各个节点的节点重要度,并根据测试集对应的最小子图中各个节点对应的代码行的缺陷指示标签确定节点重要度阈值;s8,获取待测试的软件对应的词嵌入后的程序依赖图,并将已训练的图卷积网络模型和待测试的软件对应的词嵌入后的程序依赖图同时输入至事后解释模型,通过事后解释模型提取出待测试的软件对应的最小子图,使用社交网络分析方法计算待测试的软件对应的最小子图中各个节点的节点重要度,将待测试的软件对应的最小子图中各个节点的节点重要度分别与重要度阈值进行对比分析,从而识别出待测试的软件中存在缺陷的代码行。2.根据权利要求1所述的基于图卷积网络的软件缺陷预测方法,其特征在于,步骤s3具体包括:将程序依赖图中的节点类型由单一类型细化为三类,分别为:变量定义的节点、判断的节点、执行语句的节点;将程序依赖图中的控制流边细化为三类,分别为:判断条件为1语句执行的边、判断条件为0语句执行的边、下一次执行的边。3.根据权利要求1所述的基于图卷积网络的软件缺陷预测方法,其特征在于,步骤s4具体包括:将细化后的程序依赖图中的节点对应的语句,按照后向数据流、后向控制流、当前代码行、前向控制流以及前向数据流的方式扩展为多行,且控制流扩展的优先级为:判断条件为1的控制流的优先级大于下一次执行的控制流的优先级,下一次执行的控制流的优先级大于判断条件为0的控制流的优先级。4.根据权利要求1所述的基于图卷积网络的软件缺陷预测方法,其特征在于,步骤s5
中,使用词嵌入技术将经过流信息扩展后的语句转换为低维空间向量具体包括:将经过流信息扩展后的语句进行合并以构建语料库,通过doc2vec在语料库上学习固定长度的向量表示形式,从而使用doc2vec分别提取经过流信息扩展后语句的低维空间向量。5.根据权利要求1所述的基于图卷积网络的软件缺陷预测方法,其特征在于,所述事后解释模型采用图解释器gnnexplainer。6.根据权利要求5所述的基于图卷积网络的软件缺陷预测方法,其特征在于,节点重要度的计算公式如下:;;;;;;;其中,表示节点i的节点重要度,表示归一化后的节点i的度中心性值,表示归一化后的节点i的katz中心性值,表示归一化后的节点i的紧密中心性值;g表示词嵌入后的程序依赖图,表示节点i的度,表示g中所有节点的度,max表示取最大值函数,节点i的katz中心性值,为衰减因子,为g的特征值,是g的邻接矩阵中的元素,表示第j个节点的katz中心性值,为用于控制初始中心性的常数,表示节点i的紧密中心性值,n表示g中的节点的总数量,表示节点i和节点j之间的距离,表示g中所有节点的紧密中心性值的最大值。

技术总结
本发明提供一种基于图卷积网络的软件缺陷预测方法,该方法通过采集含有多个软件版本的项目集合,针对单行代码无法实现语义可区分问题,提出使用程序依赖图中的流信息对原始语句进行扩展,使代码行包含的语义更加丰富,该方法将低维空间向量作为细化后的程序依赖图中节点的特征,可以完整保留源代码文件的结构和语义信息,能够更好的学习与缺陷相关特征,此外,若软件存在缺陷,则继续使用事后解释模型提取对模型预测具有关键影响的最小子图,使用社交网络分析方法计算最小子图中各个节点的节点重要性,以节点重要性作为对应代码行的缺陷评估指标,能够有效提升行级别的软件缺陷预测性能。预测性能。预测性能。


技术研发人员:钟发 杨丰玉 周文清 曾广东 肖鹏
受保护的技术使用者:南昌航空大学
技术研发日:2023.09.06
技术公布日:2023/10/15
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐