用于测试计算机程序的方法与流程
未命名
09-21
阅读:89
评论:0

1.本公开涉及用于测试计算机程序的方法。
背景技术:
2.软件应用开发的一个重要组成部分是测试。特别是应当识别并纠正导致应用失败的错误。软件测试的一个示例是动态软件测试方法——模糊测试(fuzzing)。
3.模糊测试使得能够以良好的测试覆盖率实现高效测试,但它很难用于有状态的计算机程序,即存储内部存储器状态的计算机程序,特别是因为典型地不知道相应的计算机程序可以采取哪些状态。
4.因此期望一些方法使得能够测试计算机程序在不同状态下的行为(例如借助于模糊测试),或当计算机的状态并非明确已知时探索计算机程序的状态。
技术实现要素:
5.根据各种实施方式,提供了一种用于测试计算机程序的方法,具有:针对大量输入数据集中用于所述计算机程序的每个输入数据集执行所述计算机程序;并且分别确定所述计算机程序的覆盖率,所述覆盖率是在针对相应的输入数据集执行所述计算机程序时达到的;为每个输入数据集产生训练数据元素,所述训练数据元素包含为所述输入数据集确定的覆盖率作为训练输入并且包含所述输入数据集作为目标输出;使用产生的训练数据元素借助于监督学习来训练机器学习模型,其中所述机器学习模型具有编码器和随后的解码器,其中所述编码器被设置为从覆盖率中产生表示空间中的表示,而所述解码器被设置为从输送给所述解码器的来自所述表示空间的表示中产生用于所述计算机程序的输入数据集;从所述表示空间中选择表示;通过将所选择的表示输送给所述解码器来产生附加输入数据集;以及通过针对所产生的附加输入数据集执行所述计算机程序来测试所述计算机程序。
6.上述方法使得能够从执行计算机程序期间观察到的数据中检测所述计算机程序的状态依赖性,并且使得能够将该知识用于在事先不知道所述计算机程序的状态的情况下测试所述计算机程序。
7.在此,新的测试情况是基于ml模型(即机器学习模型)的固有生成能力产生的,无需用户开发的测试情况突变策略。
8.下面说明各种实施例。
9.实施例1是如上所述的一种用于测试计算机程序的方法。
10.实施例2是根据实施例1的方法,其中所述表示是从所述表示空间中随机选择的。
11.换句话说,表示是从所述表示空间中采样的。由于在训练后可以预期不同的表示对应于程序的不同状态,因此可以使用额外的输入数据集以高概率实现迄今在测试期间尚未达到的状态。
12.实施例3是根据实施例1或2的方法,其中从所述表示空间中选择与所述编码器将
所述训练数据元素的覆盖率映射到的表示不同的表示。
13.例如,已知的表示,即编码器将训练数据元素的覆盖率映射到的表示,可能会随机地受到噪声干扰。因此通过由解码器根据所选择的表示产生的附加输入数据集以高概率达到并测试迄今未探索(未测试)的计算机程序状态。
14.实施例4是根据实施例1至3任一项所述的方法,其中所述机器学习模型是变分自动编码器。
15.变分自动编码器(英语:variational autoencoder,vae)的训练促使编码器按照以下方式映射到表示空间,即表示空间的大部分以从这些部分任意选择的表示由解码器映射为有意义的输入数据集的方式有意义地构造。因此可以产生对测试计算机程序有用的输入数据集。
16.实施例5是根据实施例1至4中任一项的方法,其中用于所述计算机程序的每个输入数据集具有用于所述计算机程序的输入数据元素序列,并且针对所述输入数据集执行所述计算机程序具有执行所述计算机程序,其中所述输入数据元素是根据所述序列依次输送给所述计算机程序的。
17.通过这种方式,该序列中的早期元素可以达到特定状态,所述特定状态将由该序列中的另外的元素更准确地探索。
18.实施例6是根据实施例1至5中任一项所述的方法,其中所述表示空间是多维的,其中所述机器学习模型被训练为使得以解缠结的形式学习覆盖率的表示,并且其中从所述表示空间中选择表示通过在所选择的维度中设置表示的分量来进行。
19.由此可以在一定程度上有针对性地达到计算机程序的状态(或至少状态范围)。
20.实施例7是一种软件测试系统,其被设置为执行根据实施例1至6中任一项的方法。
21.实施例8是一种具有指令的计算机程序,所述指令在其由处理器执行时促使所述处理器执行根据实施例1-6中任一项的方法。
22.实施例9是一种存储指令的计算机可读介质,所述指令在其由处理器执行时促使所述处理器执行根据实施例1-6中任一项的方法。
附图说明
23.在附图中,相似的附图标记通常指代完全不同的视图中相同的部分。附图不一定按比例绘制,而是通常将重点放在显示本发明的原理上。在以下描述中,参考以下附图描述各个方面。
24.图1示出了用于开发和/或测试软件应用的计算机。
25.图2示出了借助于模糊器来测试模糊目标的布置。
26.图3示出了根据一个实施方式的ml模型。
27.图4示出了显示根据一个实施方式的用于测试计算机程序的方法的流程图。
具体实施方式
28.以下详细描述参考附图,所述附图为了解释示出了本公开的可以实施本发明的具体细节和方面。可以使用其他方面并且可以进行结构的、逻辑的和电气的改变而不脱离本发明的范围。本公开的各个方面不一定相互排斥,因为本公开的一些方面可以与本公开的
一个或多个其他方面组合以形成新的方面。
29.下面更详细地描述各种示例。
30.图1示出了用于开发和/或测试软件应用的计算机100。
31.计算机100具有cpu(central processing unit,中央处理单元)101和工作存储器(ram)102。工作存储器102用于例如从硬盘103加载程序代码,并且cpu 101执行所述程序代码。
32.在当前示例中,假定用户打算使用计算机100来开发和/或测试软件应用。
33.为此,用户在cpu 101上执行软件开发环境104。
34.软件开发环境104使得用户能够为各种设备106开发和测试应用(即软件)105,所述各种设备即目标硬件,如用于控制包括机器人手臂和自主车辆在内的机器人设备的嵌入式系统,或者也为移动(通信)设备开发和测试应用(即软件)105。为此,cpu 101可以执行仿真器作为软件开发环境104的一部分,以模拟正在或已经为其开发了应用的相应设备106的行为。如果仅用于测试来自其他来源的软件,则软件开发环境104也可以被视为或设计为软件测试环境。
35.用户可以经由通信网络107将完成的应用分发到对应的设备106。代替经由通信网络107,这也可以通过其他方式进行,例如借助于usb 记忆棒。
36.然而在这样做之前,用户应当测试应用105以避免将未按规定工作的应用分发到设备106。这在用户没有自己在计算机100上编写应用105的情况下也可能如此。特别地,可能会出现用户没有应用的源代码,而只有其可执行代码(即二进制程序)的情况。
37.一种测试方法是所谓的模糊测试。模糊测试是一种自动化软件测试方法,其中将无效、意外或随机的数据作为输入输送给待测试的计算机程序。然后监视该程序是否存在异常,如崩溃、缺少失败的集成代码断言或潜在的存储器泄漏。
38.典型地,模糊器(即使用模糊测试的测试程序)用于测试处理结构化输入的程序。这个结构例如以文件格式或文件格式或协议来详细说明并对有效输入和无效输入进行区分。有效的模糊器会产生半有效输入,这些半有效输入“足够有效”,以致于不会被待测试程序的输入解析器直接拒绝,但“足够无效”,以致于揭示了在待测试程序中没有被正确处理的意外行为和边界情况。
39.以下描述了与模糊测试关联使用的术语:
40.·
模糊测试是将随机生成的输入发送到目标程序(待测试程序)并观察其响应的自动化测试过程。
41.·
模糊器或模糊引擎是一种自动生成输入的程序。因此该程序不与待测试软件逻辑关联(例如通过探测(instrumentierung))。但是,模糊器具有探测代码、产生测试情况和执行待测试程序的能力。已知的示例是afl和libfuzzer。
42.·
模糊目标是应当通过模糊测试进行测试的软件程序或功能。模糊目标的主要特征应当是模糊目标接受模糊测试过程期间由模糊器产生的潜在不可信的输入。
43.·
模糊测试是模糊器和模糊目标的组合版本。于是模糊目标可以是经过探测的代码,其中模糊器与其输入逻辑关联(即提供其输入)。模糊测试是可执行的。模糊器还可以启动、观察和停止多个模糊测试,即执行多个测试过程(通常每秒数百或数千个),每个测试过程都具有由模糊器产生的略有不同的输入。
44.·
测试情况是来自模糊测试的特定输入和特定测试过程。通常,对可再现性感兴趣的运行(寻找新的代码路径或崩溃)会被保存。通过这种方式,具有对应输入的特定测试情况也可以在未与模糊器连接的模糊目标上执行,例如程序的发布版本。
45.·
覆盖率控制的模糊测试(英语:coverage-guided fuzzing)使用代码覆盖率信息作为模糊测试期间的反馈,以识别输入是否导致了新代码路径或块的执行。
46.·
基于生成器的模糊测试(英语:generation-based fuzzing)使用关于目标程序(模糊目标)的先验知识来创建测试输入。这种先验知识的一个示例是与模糊目标的输入规范相对应的语法,即模糊目标(即待测试程序)的输入语法。
47.·
静态探测是将指令插入(待测试)程序以获得关于执行的反馈。静态探测大多由编译器实现,并且例如可以说明执行期间达到的代码块。
48.·
动态探测是在运行时期间控制(待测试)程序的执行,以从该执行中生成反馈。动态探测大多通过操作系统系统功能或通过使用仿真器来实现。
49.·
调试器是一种设备或一种程序,其可以控制目标设备或目标程序并且可以提供功能,例如检索寄存器值或存储器值以及在个别步骤中暂停和执行目标程序。
50.·
断点通过调试器被置于目标程序或设备的指令中,以在达到时停止运行并将此通知控制进程。
51.·
数据观察点通过调试器被置于目标程序或目标设备的存储器地址中,以在访问该存储器地址时停止执行并通过触发中断将此通知控制进程。
52.当调试器连接到嵌入式设备时,指令断点可以用于在期望代码位置处停止执行,而数据观察点可以用于在访问特定存储器位置时停止执行。然而,断点和观察点的数量典型地是有限的,并且取决于所使用的系统,例如对于典型微控制器的最大数量是四个断点和两个数据观察点。
53.计算机程序105可以是有状态的(英语:stateful)或无状态的(英语:stateless),这取决于该计算机程序是否存储内部存储器状态。
54.有状态程序接受影响程序内部状态的明确定义的输入序列。有状态程序的示例是服务器程序、通信协议的实现、web服务和大多数嵌入式设备的软件。
55.将模糊测试方案(例如黑盒模糊测试或基于覆盖率的灰盒模糊测试)应用于有状态软件的情况下存在多个困难:
56.·
有状态程序将消息序列作为输入。标准模糊器无法产生或分析所述消息序列。从模糊器的角度来看,该程序表现出不确定的行为,因为其响应取决于该程序已看到的更早输入。
57.·
取决于状态的程序的所有可能状态的集合通常是未知的。
58.·
如果该程序是具有正式规范的协议的实现,则可以从该规范中导出所有状态的列表。但是,通常出现以下情况,即程序不实现整个协议,或者该程序没有完全实现协议,由此所述正式规范对模糊测试的用处不大。此外,要通过模糊测试发现的漏洞可能恰好在于规范与协议实现之间的差异。
59.根据各种实施例,产生使得能够探索程序状态而不需要程序状态的明确知识的测试输入(和与所述测试输入相关联的测试情况)。
60.图2示出了借助于模糊器201测试模糊目标202的布置。
61.模糊器201产生用于模糊目标202的输入203,并且模糊目标202响应于输入而向模糊器201提供反馈204。通过这种方式形成模糊测试反馈回路。
62.模糊器201和模糊目标202可以在同一计算机上(例如,两者都在计算机100上)运行或在不同的计算机上运行(例如,模糊器在计算机100上运行,而模糊目标在目标设备106上运行)。在这个示例中,模糊器201在测试计算机205上运行(在测试计算机205上也可以运行或不运行模糊目标202)。测试计算机205形成测试系统,必要时与在其上执行模糊目标202的另外的计算机或设备一起形成测试系统。
63.在下文中假设模糊测试目标202是有状态的并且应当为其生成测试情况(具有相应的输入203)。
64.根据各种实施例,为此测试计算机205实现生成机器学习(ml)模型206,特别是ml模型的解码器(例如自动编码器的解码器)。
65.测试计算机205训练ml模型,从而该ml模型隐式学习目标程序(即模糊目标)202的(隐藏)状态。生成ml模型允许产生新的输入203,使用这些输入203可以达到特定的程序状态,针对所述特定的程序状态,ml模型已经学习了表示。
66.图3示出了根据一个实施方式的ml模型300。
67.在该示例中,ml模型300具有自动编码器的经典架构。也可以使用其他架构,例如unet架构或序列到序列(英语:sequence-to-sequence)架构。
68.首先,测试计算机205借助于监督学习训练ml模型300。为此,通过针对各种输入执行目标程序202来产生训练数据。这些训练数据具有大量训练数据元素,每个训练数据元素由ml模型的训练输入和相关联的(基本事实)标签(即目标输出)组成。ml模型300的训练可以使用用于监督学习的标准方法进行,即用于此目的的标准优化方法,例如随机梯度下降。
69.在该训练之后,测试计算机205可以使用ml模型300产生新的测试输入(并因此产生测试情况),测试计算机205将所述新的测试输入输送给目标程序202,并为此观察目标程序202以反馈204形式的反应。根据反馈204,测试计算机205确定目标程序202是否按预期工作,即无错误地工作。
70.训练数据通过测试计算机205针对各种输入执行目标程序202并针对每个输入观察目标程序202的(代码)覆盖率来产生。
71.训练数据的每个训练数据元素因此是覆盖率和用于计算机程序的达到该覆盖率的(程序)输入(也称为(程序)输入数据集)的配对。覆盖率是ml模型的训练输入,而程序输入是ml模型的目标输出(换句话说:训练输入的标签)。
72.覆盖率可以表示为覆盖率度量的值,例如在模糊测试中所使用的那样。然而,覆盖率也可以明确地(例如以位图的形式)说明在执行程序202时以相应的输入数据集作为用于程序202的输入执行了该程序的哪些部分(即代码部分,例如函数或方法)。
73.因此,输入数据集的覆盖率可以用不同的形式表示。取决于此,覆盖率明确地说明通过输入数据集达到了哪些程序部分(即在执行程序202时使用输入数据集作为程序输入执行了哪些程序部分)或说明通过输入数据集达到了程序的哪个部分。覆盖率典型地用于灰盒模糊测试。
74.(程序)输入数据集可以包含输入数据元素序列。然后对于每个测试情况,即每个输入数据集,将输入数据元素顺序地(根据该序列)输送给程序202。为每个测试情况确定并
存储覆盖率。该覆盖率被认为是程序202的利用该输入数据集达到的状态的表示,并且因此被记录下来。
75.使用作为输入数据元素序列的输入数据集达到的状态特别是可能在很大程度上取决于该序列的第一输入数据元素。换句话说:第一输入数据元素粗略地定义了程序的状态,然后进一步的输入数据元素导致该状态的子状态或导致程序的特定部分在该状态下的执行。
76.在针对输入数据集执行了程序202之后,测试计算机205重置程序202。
77.如上所述,每个训练数据元素(i,c)由针对(程序)输入数据集观察到的作为用于ml模型的训练ml输入数据元素的覆盖率i和作为标签(目标输出)的输入数据集c组成。ml模型具有编码器(英语:encoder)302,用e表示,该编码器将ml输入数据元素301映射为表示,用z表示。ml输入数据元素301的表示可以被视为ml输入数据元素301的压缩版本。该表示是表示空间303(该表示空间可以被视为潜在空间)中的元素(例如向量)。
78.用d表示的解码器(英语:decoder)304将输送给它的表示空间303的元素映射为用于程序202的(程序)输入数据集305。在训练期间,编码器302和解码器304(它们例如是神经网络)被训练为使得解码器304为每个训练数据元素尽可能产生属于该训练数据元素的输入数据集305,编码器从该训练数据元素的覆盖率301中产生表示,解码器304从所述表示中产生输入数据集305。
79.可以使用来自序列到序列系列的ml模型,即学习输入和输出序列之间映射的模型。
80.由于表示空间303的元素应当用于为目标程序202产生(由解码器304)输入数据集,因此根据各种实施例以随机方式产生新的输入数据集。例如,这可以使用变分自动编码器(英语:variational autoencoder,vae)来进行。vae不会学习ml输入的固定表示(这里为覆盖率),而是将每个ml输入映射为概率分布。然后为了为目标程序202产生输入数据集305,从这种概率分布中抽取(采样)值作为表示空间中的元素。覆盖率被映射到的概率分布隐式表示达到该覆盖率时的程序状态(其中专门针对覆盖率和来自训练数据元素的输入数据集来观察该映射)。
81.vae在表示空间303的大部分(通过来自训练数据的覆盖率达到的那些部分)上提供良好的生成能力。为了为新测试情况的程序产生新的(迄今尚未在程序202的测试中使用过的)输入数据集,测试计算机205可以(在训练之后)简单地从表示空间303中采样(例如使用随机噪声)以及借助于解码器将样本映射为用于该程序的输入数据集。
82.测试计算机205还可以选择迄今尚未达到的覆盖率来为程序产生新的输入数据集(用于测试该程序)。例如,在以详细说明达到了哪些代码部分的形式说明覆盖率的情况下,测试计算机205可以选择说明迄今尚未达到的代码部分的覆盖率。然后,测试计算机205可以借助于编码器302将选择的覆盖率映射为表示,并借助于解码器304将所述表示映射为输入数据集,使用该输入数据集(理想情况下)达到所述覆盖率(例如,可以达到新的,即迄今尚未在测试中达到的代码部分)。
83.ml模型300可以被设计和训练为使得其以解缠结(英语:distentangled)的形式学习覆盖率的表示。在此,该训练按照以下方式进行,即ml模型被激励成,为其产生的输入数据集的不同特性产生表示空间的不同维度(即来自表示空间的向量的不同分量)。这例如可
以通过在损失函数中为了训练自动编码器(例如变分自动编码器)而添加对应的正则化项来实现。可以将各种已知的方案用于vae的解缠结(即disentanglement)。
84.如果测试计算机201通过这种方式(通过表示空间的解缠结)训练了ml模型300,则测试计算机201可以为程序产生新的输入数据集(以测试该程序),其方式是所述测试计算机改变表示的特定分量(例如,设置为针对迄今在训练中的输入数据集尚未出现的区域)并借助于编码器305映射为新的输入数据集。从而,测试计算机201可以在测试时有针对性地达到目标程序202的新状态,并针对这些状态测试目标程序202的行为。由此实现了对状态空间探索的更准确控制,并且测试计算机201还可以针对比其他状态更感兴趣的状态更频繁地产生输入数据集。
85.综上所述,根据各种实施方式提供了一种方法,如图4中所示。
86.图4示出了显示根据一个实施方式的用于测试计算机程序的方法的流程图。
87.在401中,针对大量输入数据集中用于所述计算机程序的每个输入数据集执行所述计算机程序,并且分别确定所述计算机程序的覆盖率,所述覆盖率是在针对相应的输入数据集执行所述计算机程序时达到的。
88.在402中,为每个输入数据集产生训练数据元素,所述训练数据元素包含为所述输入数据集确定的覆盖率作为训练输入并且包含所述输入数据集作为目标输出。
89.在403中,使用产生的训练数据元素借助于监督学习来训练机器学习模型,其中所述机器学习模型具有编码器和随后的解码器,其中所述编码器被设置为从覆盖率中产生表示空间中的表示,而所述解码器被设置为从输送给所述解码器的来自所述表示空间的表示中产生用于所述计算机程序的输入数据集。
90.在404中,从所述表示空间中选择表示。
91.在405中,通过将所选择的表示输送给所述解码器来产生附加输入数据集。
92.在406中,通过针对所产生的附加输入数据集执行所述计算机程序来测试所述计算机程序。
93.确定覆盖率可以是确定覆盖率度量的值和/或说明覆盖率的数据结构(特别是位图)。
94.图4的方法可以由具有一个或多个数据处理单元的一个或多个计算机执行。术语“数据处理单元”可以理解为使得能够处理数据或信号的任何类型的实体。所述数据或信号例如可以根据由数据处理单元执行的至少一个(即一个或多于一个)专用功能来处理。数据处理单元可以包括模拟电路、数字电路、逻辑电路、微处理器、微控制器、中央处理器(cpu)、图形处理单元(gpu)、数字信号处理器(dsp)、可编程门阵列(fpga)的集成电路,或它们的任何组合或由此形成。用于实现这里更详细描述的相应功能的任何其他方式也可以理解为数据处理单元或逻辑电路装置。这里详细描述的一个或多个方法步骤可以由数据处理单元通过由数据处理单元执行的一个或多个专用功能来执行(例如实现)。
95.图4的方法用于测试程序,例如用于机器人设备的控制软件。术语“机器人设备”可以理解为表示任何技术系统,例如计算机控制的机器、车辆、家用电器、电动工具、制造机器、个人助理或访问控制系统。控制软件也可以用于诸如导航设备的数据处理系统。在测试时发现的错误可以得到纠正,并且根据软件的类型可以提高相应机器人设备的可靠性和/或安全性。
96.尽管这里已经显示和描述了具体实施方式,但是本领域技术人员认识到,所示出和描述的具体实施方式可以被替换为各种替代和/或等效实现方案而不脱离本发明的保护范围。本技术应当涵盖这里所讨论的具体实施方式的任何适配或变化。因此,本发明意欲仅由权利要求及其等同物来限制。
技术特征:
1.一种用于测试计算机程序的方法,包括:针对大量输入数据集中用于所述计算机程序的每个输入数据集执行所述计算机程序,并且分别确定所述计算机程序的覆盖率,所述覆盖率是在针对相应的输入数据集执行所述计算机程序时达到的;为每个输入数据集产生训练数据元素,所述训练数据元素包含为所述输入数据集确定的覆盖率作为训练输入并且包含所述输入数据集作为目标输出;使用产生的训练数据元素借助于监督学习来训练机器学习模型,其中所述机器学习模型具有编码器和随后的解码器,其中所述编码器被设置为从覆盖率中产生表示空间中的表示,而所述解码器被设置为从输送给所述解码器的来自所述表示空间的表示中产生用于所述计算机程序的输入数据集;从所述表示空间中选择表示;通过将所选择的表示输送给所述解码器来产生附加输入数据集;以及通过针对所产生的附加输入数据集执行所述计算机程序来测试所述计算机程序。2.根据权利要求1所述的方法,其中所述表示是从所述表示空间中随机选择的。3.根据权利要求1或2所述的方法,其中从所述表示空间中选择与所述编码器将所述训练数据元素的覆盖率映射到的表示不同的表示。4.根据权利要求1至3中任一项所述的方法,其中所述机器学习模型是变分自动编码器。5.根据权利要求1至4中任一项所述的方法,其中用于所述计算机程序的每个输入数据集具有用于所述计算机程序的输入数据元素序列,并且针对所述输入数据集执行所述计算机程序具有执行所述计算机程序,其中所述输入数据元素是根据所述序列依次输送给所述计算机程序的。6.根据权利要求1至5中任一项所述的方法,其中所述表示空间是多维的,其中所述机器学习模型被训练为以解缠结的形式学习覆盖率的表示,并且其中从所述表示空间中选择表示通过在所选择的维度中设置所述表示的分量来进行。7.一种软件测试系统,其被设置为执行根据权利要求1至6中任一项所述的方法。8.一种计算机程序,具有指令,所述指令在其由处理器执行时促使所述处理器执行根据权利要求1至6中任一项所述的方法。9.一种存储指令的计算机可读介质,所述指令在其由处理器执行时促使所述处理器执行根据权利要求1至6中任一项所述的方法。
技术总结
本发明提供用于测试计算机程序的方法,具有:针对大量输入数据集中用于计算机程序的每个输入数据集执行计算机程序,分别确定计算机程序的覆盖率,其在针对相应输入数据集执行计算机程序时达到;为每个输入数据集产生训练数据元素,其包含为输入数据集确定的覆盖率作为训练输入和输入数据集作为目标输出;使用训练数据元素借助监督学习训练机器学习模型,其具有编码器和解码器,其中编码器设置为从覆盖率中产生表示空间中的表示,解码器设置为从输送给它的来自表示空间的表示中产生计算机程序的输入数据集;从表示空间中选择表示;通过将选择的表示输送给解码器产生附加输入数据集;通过针对产生的附加输入数据集执行计算机程序来测试计算机程序。序来测试计算机程序。序来测试计算机程序。
技术研发人员:I
受保护的技术使用者:罗伯特
技术研发日:2023.03.13
技术公布日:2023/9/20
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/