Professional Documents
Culture Documents
discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/312297650
CITATIONS READS
0 187
5 authors, including:
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Josef Pichler on 13 January 2017.
The user has requested enhancement of the downloaded file. All in-text references underlined in blue are added to the original document
and are linked to publications on ResearchGate, letting you access and read them immediately.
Software Analytics and Evolution
Static Code Analysis. Static code analysis is a widely used quality as-
surance measure for detecting a variety of defects, for example, violations
of coding conventions and programming rules, array boundary overruns,
division by zero, infinite loops, data races, and dead code.
1
Program Comprehension Static code analysis can be used to facilitate
program comprehension in several ways. For instance, we have developed
a toolkit to propagate domain concepts as well as physical dimensions
to cryptic local and global program identifiers along the data flow of a
program. This approach facilitates comprehension of legacy systems, for
which neither documentation nor the original author are usually available
anymore.
In the next section, we briefly describe ongoing research projects with respect
to software analysis. In these projects we usually build and enhance software
tools facilitating certain Software Engineering activities. We give an overview
of our tool landscape in Section 3. In Section 4, we highlight emerging research
topics that eventually become part of SCCHs research agenda in future.
2
the preexisting design software. By using the created DSL domain experts can
describe new types of power transformers in a very compact and efficient way.
This not only facilitates the rapid development and adaption of software com-
ponents but as well understandability and eventually maintainability of design
software for power transformers.
The achievements of the current year stimulate further insights in an iterative
user-centered development process for domain-specific languages. Furthermore,
we plan to investigate the role of domain-specific modeling and modeling in
general in the field of maintenance and evolution of software systems.
3
2.3 Program Analysis for Understanding Legacy Software
The engineering and production of steel at our COMET partner voestalpine
Stahl is typically controlled by process control software. Process control soft-
ware embeds so called process models which are continuously adapted, improved
and enhanced. Process models are implemented in Fortran, C, and C++ and
maintained over decades since the seventies and eighties of the last century and
are typically developed by a single engineer only. If this person retires, we liter-
ally encounter a legacy code problem, where a different engineer has to take over
a model implementation he/she has (in worst case) never worked with before.
This is what happened to our company partner. Frequently, the source code is
the only reliable documentation of the process model due to outdated manual
documentation. If only source code is available, it is hard to comprehend the
implemented specification, e.g. the mathematical core model.
To overcome this problem and to help our partner to regain knowledge of
some of its core assets, we created an approach and tooling to automatically
re-document process models using static and dynamic code analysis techniques
[4]. The key idea in this project was to extract how output values of a process
model, are computed from a set of input values. Therefore, we statically ana-
lyze dependencies and data-flow in process models and provide filtered views,
represented as tables, on the source code showing all program statements which
influence the computation of a single output value.
Due to the complexity of process models, these tables get very long and pro-
vide only little benefit for domain experts. To further improve understandability
and reduce the complexity of the resulting documentation, we dynamically an-
alyze the execution of process models. To do so, we execute program analysis
with concrete input values provided by domain experts. This leads to more
compact result tables, since only executed program paths are included, which
facilitate overall comprehension of process models.
4
2.5 Knowledge Extraction from Industrial User Interfaces
Human machine interfaces (HMI) play an essential role in operating industrial
facilities and machines. Depending on the range and variability of a manufac-
turers product portfolio, a huge library of GUI software may exist. This poses
quite a challenge when it comes to testing or re-engineering. Static analysis
helps to unveil valuable, inherent knowledge and prepare it for further analysis
and processing.
Our COMET partner ENGEL Austria is a large injection molding machine
manufacturer, who offers a broad portfolio of molding machines tailorable to
specific customer needs. For this purpose, each machine can be equipped and
configured with numerous different options. Since ENGEL not only builds the
machines, but also develops both machine control and HMI software, the high
product variability of course is reflected in that software as well. Currently
ENGEL is completely re-engineering his HMI framework on the base of a new
UI technology. Certainly, it is desired to reduce the effort to migrate the existing
screens to their new platform and thus ENGEL wants to automate the migration
process as far as possible.
This goal shall be reached by employing static analysis techniques: We ex-
tract the internal structure of the HMI screens and the control system context
they are used in, i.e. which PLC variables they access. This internal structure
also comprises of (hardcoded) variants depending on the presence of PLC vari-
ables or their values, which are evaluated at HMI startup time. Subsequently,
HMI screens are assembled depending on the outcome of this evaluation. Hence,
we filter out these variants and the conditions they lead to. In another step, we
analyze the usage pattern of method calls to certain UI widgets.
The resulting analysis model is then transformed (per screen) into an object
model designed for the new HMI framework and supportive code fragments.
5
corresponding file is opened at the line, that contains the rule violation. We
provided a plugin into SonarQube, that exports the metrics, and rule violations
into a SonarQube instance. Additionally this plugin contains copy-and-paste
detection.
For automatic architecture extraction, we have written an exporter into
Neo4J graph database. It exports the project structure (a project consisting
of package, programs, and libraries, and source files), the call graph between
POU (program organization units are action, function, function block, and pro-
gram), POU read/write relation to global variables, the member-relation of a
field to its containing data structure, the IEC-61131-3 software configuration
that contains the tasks that are run periodically.
3 Software
Figure 1 shows libraries, frameworks, and tools developed in various projects.
In this section, we brievly describe tools developed and used within various
projects (see previous section), mostly together with company partners.
Metamorposis RbG
frontends
The Rulebook Generator (RbG) [2] is a novel tool intended for the generation
of high-quality documentation from source code of scientific and engineering
applications. RbG extracts mathematical formulae, decision tables and function
plots from program statements by means of static code analysis and generates
corresponding documentation in different formats including the Open Document
Format and LaTeX. Annotations in source code comments are used to define the
structure of the generated documents, include additional textual and graphical
descriptions, and control extraction of formulae on a fine grained level.
6
The VARAN tool [4] is a tool that combines static and dynamic program
analysis for documentation generation. Static code analysis, which is based
on the RbG tool, extracts the input/output behavior in form of formulae and
decision tables from source code. Dynamic program analysis allows developers
to examine input/output behavior for single program executions and thereby
gain insight into standard behavior and exceptional cases.
Metamorphosis [6] is a multi-language toolkit for static code analysis in tech-
nical domains. It provides language independent data structures (e.g. abstract
syntax tree, call graph) and analysis algorithms (e.g. constructing call graph)
based on OMGs ASTM standard for abstract syntax trees. This toolkit was
designed to integrate existing (open source) parsers and to transform language-
specific parser output (e.g. parse tree) into the language-independent AST.
Furthermore, Metamorphosis is based on an annotation engine that is capable
to use annotations on (input) data for symbolic analysis of program code. For
instance, one can annotate program variables with physical units and then an-
alyze the program statements to detect inconsistencies w.r.t to physical units.
The same annotation engine is reused in the DocIO tool that forwards text given
by Doxygen annotations to printf statements to document which variables are
written to which files.
SeSy [7] is an approach and tools support to extract specifications from
source code by means of symbolic execution. Symbolic execution makes it pos-
sible to identify input and output data, the actual computation as well as con-
straints of a particular computation, independently of the program structure.
Due to dynamic symbolic execution, SeSy outperforms RbG when analyzing
unstructured source code.
The TabFlow tool [8] was developed for the reverse engineering of PL/SQL
code into a more abstract and comprehensive representation. For this, the tool
computes the data flow between database tables and reports data values con-
tained in result tables together with conditions detmined by means of symbolic
execution.
The reUI [9] tool extracts the internal structure of GUI screens of an injec-
tion molding machine, their variants and the control system context they are
used in. Furthermore, the usage pattern of method calls to certain UI widgets
are analyzed.
The StaticCodeAnalyzer tool (StaticCA) [10] is a tool for static code anal-
ysis of IEC 61131-3 programs, which is capable of detecting a range of issues
commonly occurring in PLC programming. The tool employs different analysis
methods, like pattern-matching on program structures, control flow and data
flow analysis, and, especially, call graph and pointer analysis techniques.
Our frameworks and toolkits were also used for research activities within and
outside SAE. For instance, the DAS research focus at SCCH used our frame-
works for clone detection in stored procedures (PL/SQL) by means of a tree-
based similarity measure [11]. Further frameworks calculcate simple software
metrics and analyze def/use (definition and usage) relations between (global)
data objects and procedural functions. An online demo of some tools can be
found at http://codeanalytics.scch.at/.
7
4 Future Topics
In this section we enumerate and briefly describe emerging research topics in the
context of SAE. Topics are identified by considering relevant scientific confer-
ences (e.g. SANER, ICSME, ICSE) in context of current work in our research
group. Identified topics are pursued on a strategic level and eventually become
part of our research agenda. For instance, research on source-to-source transla-
tion by statistical machine learning with correct translation results just above
50% cannot be applied to migration projects at the moment. However, we ex-
pect to improve our approaches for extracting knowledge from source code by
integration with machine learning (or software analytics in general).
8
4.2 Machine Learning from Source Code
Machine Learning gives computers the ability to learn without being explicitly
programmed. It tries to create programs that improve their performance at spe-
cific, selected task through experience. The concept and application of machine
learning techniques have been around for decades but have seen a significant
boost in recent year due to increased computational power, ubiquitous appears
of computing and new emerging application domains (i.e. big data analytics).
Today a plethora of concepts in machine learning exist, such as artificial neural
networks, deep learning, genetic algorithms, or Bayesian networks.
This trend has been picked up by software engineering research and com-
puter science and today we see numerous research activities from different re-
search fields turning towards the application of machine learning and AI in
general. Machine learning is applied to improve software maintenance tasks,
increase software reuse [21], improve detection and prediction of defaults [22]
[23], program translation [24], program comprehension and software analysis
[25], software engineering reliability predictions [26] and to improve software
development tasks [27] [28].
In code analysis, machine learning has been successfully applied for code
comment analysis. In particular unsupervised clustering techniques are used
for capturing main themes of documents. By this software artifacts can be
grouped into themes (e.g. concurrency) and sub themes [29]. Oda et al. [24] use
a learnable statistical machine translation approach to translate Python code
into pseudo code. This enables readers, unfamiliar with a certain programming
language, to understand program sources. Parr and Vinju [28] create a code
formatter that uses machine learning to abstract formatting rules from a corpus
of source code files. During training phase the formatter is provided with a
language grammar, a corpus of formatted source code files and indentation size
and derives directives on inserting white space, new line injections or indentation
of tokens.
9
According to Allen [31], NLP refers to computer systems that analyze, at-
tempt to understand, or produce one or more human languages, such as En-
glish, Japanese, Italian, or Russian. The input might be text, spoken lan-
guage, or keyboard input. The task might be to translate to another language,
to comprehend and represent the content of text, to build a database or generate
summaries, or to maintain a dialogue with a user as part of an interface for
database/information retrieval.
However, NLP not only relies on the techniques provided by TR, it also uses
methods and techniques from other scientific fields, such as artificial intelligence,
machine learning, computational linguistics, probability theory and statistics.
Amongst others, Manning and Schutze [32] provide a detailed introduction into
NLP.
NLP supports a wide range of tasks covering almost all aspects in Soft-
ware Engineering. It may be applied in Requirements Engineering tasks for a
software system as well as during design, implementation, documentation and
maintenance of a software system.
10
[36]. An example for an application of SEA in Software Engineering has
been done by Guzman and Maalej [37], who analyze user opinions on soft-
ware app features to allow developers to filter significant and/or irrelevant
reviews.
11
by Haiduc et al. [47], whose results support program comprehension by
automatic generation of source code summaries. Moreno et al. [48] have is-
sued similar efforts where they generate natural language class summaries
from Java code or deal with the automatic generation of Release Notes
[49]. Panichiella et al. [50] analyze developer communication (emails,
mailing lists, discussion boards) to enhance source code descriptions.
5. Concept Location deals with finding specific issues within the codebase of
a software system or related data, for instance finding the start of a change
to the code based on a certain change request. Other issues to be located
may also include certain functional features or specific bugs. Dit et al.
[51] have published an overview of feature location techniques, albeit not
all relying on NLP. Marcus and Haiduc [52] discuss the application of text
retrieval techniques to support concept location, specifically lightening the
context of software changes. Shepherd et al. [53] employ natural language
processing in conjunction with static analysis for feature location with
their search engine Find-Concept. Hill et al. [54] follow the idea of query
expansion and refinement in their approach to feature location based on
contextual searching. Instead of focusing on verbs and direct objects, their
analysis centers on three types of phrases: noun phrases, verb phrases, and
prepositional phrases.
6. SW Categorization aims to classify aspects of a software-system (e.g.
based on source code, binaries, usage profiles, API defintions). Examples
for work in this field are provided by Huang et al. [55], who classify defects
to aid developers in prioritizing requested changes. In [56], Escobar-Avila
et.al describe their effort, which leverages semantic information extracted
from Java bytecode and software profiles to automatically categorize Java
software projects - aiming to support the clustering of large software repos-
itories like GitHub or SourceForge.
12
To overcome these challenges, dynamic symbolic execution uses concrete
input values, for execution of a program on exactly one path, and along side
that path performs symbolic execution, with symbolic input values [7].
New concrete input values can be found, by negating the collected constraints
one by one, that can be solved by a constraint solver, that exercise different
control paths in the program [59]. The number of paths through a program can
be overwhelming. Strategies have to be applied to avoid starvation. Maximizing
code-coverage can be a goal.
Tools like SAGE, and KLEE can generated thousands of test cases. Some
might reveal a bug (the program crashes, or throws an exception). The recorded
test case can then be used for reproduction of the bug. However this approach
can not decide, whether a new test case produces a meaningful result.
References
[1] M. Mernik, J. Heering, and A. M. Sloane, When and how to develop
domain-specific languages, ACM Comput. Surv., vol. 37, pp. 316344,
Dec. 2005.
[2] M. Moser, J. Pichler, G. Fleck, and M. Witlatschil, RbG: A documenta-
tion generator for scientific and engineering software, in 2015 IEEE 22nd
International Conference on Software Analysis, Evolution, and Reengineer-
ing (SANER), Institute of Electrical and Electronics Engineers (IEEE), mar
2015.
[3] G. Fleck, W. Kirchmayr, M. Moser, L. Nocke, J. Pichler, R. Tober, and
M. Witlatschil, Experience report on building astm based tools for multi-
language reverse engineering., in SANER, pp. 683687, IEEE Computer
Society, 2016.
[4] W. Kirchmayr, M. Moser, L. Nocke, J. Pichler, and R. Tober, Integra-
tion of static and dynamic code analysis for understanding legacy source
code, in 2016 IEEE International Conference on Software Maintenance
and Evolution (ICSME), pp. 543552, Institute of Electrical and Electron-
ics Engineers (IEEE), 2016.
[5] B. Dorninger, M. Moser, and J. Pichler, Multi-language re-documentation
to support a cobol to java migration project, in 2017 IEEE International
Conference on Software Analysis, Evolution, and Reengineering (SANER
2017), Sept 2017.
[6] C. Klammer and J. Pichler, Towards tool support for analyzing legacy
systems in technical domains, in 2014 Software Evolution Week - IEEE
Conference on Software Maintenance, Reengineering, and Reverse Engi-
neering (CSMR-WCRE), pp. 371374, Feb 2014.
[7] J. Pichler, Specification extraction by symbolic execution, in Reverse
Engineering (WCRE), 2013 20th Working Conference on, pp. 462466,
IEEE, Oct. 2013.
13
[8] M. Habringer, M. Moser, and J. Pichler, Reverse engineering pl/sql legacy
code: An experience report, in 2014 IEEE International Conference on
Software Maintenance and Evolution, pp. 553556, Sept 2014.
[9] B. Dorninger, J. Pichler, and A. Kern, Using static analysis for knowl-
edge extraction from industrial user interfaces, in 2015 IEEE International
Conference on Software Maintenance and Evolution (ICSME), pp. 497500,
Sept 2015.
[10] H. Prahofer, F. Angerer, R. Ramler, and F. Grillenberger, Static code
analysis of iec 61131-3 programs: Comprehensive tool support and ex-
periences from large-scale industrial application, IEEE Transactions on
Industrial Informatics, vol. PP, no. 99, pp. 11, 2016.
[11] R. Stumptner, C. Lettner, B. Freudenthaler, J. Pichler, W. Kirchmayr, and
E. Draxler, maintaining and analyzing production process definitions us-
ing a tree-based similarity measure, in Case-Based Reasoning Research
and Development: 23rd International Conference, ICCBR 2015, Frankfurt
am Main, Germany, September 28-30, 2015. Proceedings (E. Hullermeier
and M. Minor, eds.), (Cham), pp. 366380, Springer International Publish-
ing, 2015.
[12] S. Hasan, Z. King, M. Hafiz, M. Sayagh, B. Adams, and A. Hindle, Energy
profiles of java collections classes, in Proceedings of the 38th International
Conference on Software Engineering - ICSE 16, Association for Computing
Machinery (ACM), 2016.
[13] C. Wilke, S. Richly, S. Gtz, C. Piechnick, and U. Amann, Energy con-
sumption and efficiency in mobile applications: A user feedback study,
The 2013 IEEE International Conference on Green Computing and Com-
munications (GreenCom 2013), pp. 134141, 2013.
[14] D. Li, S. Hao, W. G. Halfond, and R. Govindan, Calculating source line
level energy information for android applications, in Proceedings of the
International Symposium on Software Testing and Analysis (ISSTA), July
2013.
[15] C. Seo, S. Malek, and N. Medvidovic, Component-level energy con-
sumption estimation for distributed java-based software systems, in
Component-Based Software Engineering: 11th International Symposium,
CBSE 2008, Karlsruhe, Germany, October 14-17, 2008. Proceedings
(M. R. V. Chaudron, C. Szyperski, and R. Reussner, eds.), (Berlin, Heidel-
berg), pp. 97113, Springer Berlin Heidelberg, 2008.
[16] K. Liu, G. Pinto, and Y. D. Liu, Data-oriented characterization of
application-level energy optimization, in International Conference on Fun-
damental Approaches to Software Engineering, pp. 316331, Springer Berlin
Heidelberg, 2015.
[17] A. Hindle, A. Wilson, K. Rasmussen, E. J. Barlow, J. C. Campbell, and
S. Romansky, Greenminer: A hardware based mining software reposito-
ries software energy consumption framework, in Proceedings of the 11th
Working Conference on Mining Software Repositories, pp. 1221, ACM,
2014.
14
[18] G. Pinto, K. Liu, F. Castor, and Y. D. Liu, A comprehensive study on
the energy efficiency of java thread-safe collections, in 2016 IEEE Inter-
national Conference on Software Maintenance and Evolution - ICSME 16
- To appear, Association for Computing Machinery (IEEE), 2016.
[19] A. Litke, K. Zotos, A. Chatzigeorgiou, and G. Stephanides, Energy con-
sumption analysis of design patterns, International Journal of Electrical,
Computer, Energetic, Electronic and Communication Engineering, vol. 1,
no. 11, pp. 1655 1659, 2007.
[20] I. Manotas, L. Pollock, and J. Clause, Seeds: A software engineers energy-
optimization decision support framework, in Proceedings of the 36th In-
ternational Conference on Software Engineering, ICSE 2014, (New York,
NY, USA), pp. 503514, ACM, 2014.
[21] S. Maggo and C. Gupta, A machine learning based efficient software
reusability prediction model for java based object oriented software, Inter-
national Journal of Information Technology and Computer Science, vol. 6,
pp. 113, jan 2014.
[22] P. Kumar and Y. Singh, An empirical study of software reliability predic-
tion using machine learning techniques, International Journal of System
Assurance Engineering and Management, vol. 3, no. 3, pp. 194208, 2012.
[23] R. Malhotra, A systematic review of machine learning techniques for soft-
ware fault prediction, Appl. Soft Comput., vol. 27, pp. 504518, Feb. 2015.
[24] Y. Oda, H. Fudaba, G. Neubig, H. Hata, S. Sakti, T. Toda, and S. Naka-
mura, Learning to generate pseudo-code from source code using statistical
machine translation (t), in Proceedings of the 2015 30th IEEE/ACM In-
ternational Conference on Automated Software Engineering (ASE), ASE
15, (Washington, DC, USA), pp. 574584, IEEE Computer Society, 2015.
[25] I. Griffith, S. Wahl, and C. Izurieta, Truerefactor: An automated refac-
toring tool to improve legacy system and application comprehensibility.
[26] V. Raychev, M. Vechev, and A. Krause, Predicting program properties
from big code, in Proceedings of the 42Nd Annual ACM SIGPLAN-
SIGACT Symposium on Principles of Programming Languages, POPL 15,
(New York, NY, USA), pp. 111124, ACM, 2015.
[27] M. Bruch, M. Monperrus, and M. Mezini, Learning from examples to im-
prove code completion systems, in Proceedings of the the 7th Joint Meeting
of the European Software Engineering Conference and the ACM SIGSOFT
Symposium on The Foundations of Software Engineering, ESEC/FSE 09,
(New York, NY, USA), pp. 213222, ACM, 2009.
[28] T. Parr and J. J. Vinju, Towards a universal code formatter through
machine learning, in International Conference on Software Language En-
gineering (SLE) 2016 - To appear, Association for Computing Machinery
(IEEE), 2016.
[29] C. Zhai, A. Velivelli, and B. Yu, A cross-collection mixture model for
comparative text mining, in In Proceedings of KDD 04, pp. 743748, 2004.
15
[30] C. D. Manning, P. Raghavan, and H. Schutze, Introduction to Information
Retrieval. New York, NY, USA: Cambridge University Press, 2008.
16
[43] M. Allamanis, E. T. Barr, C. Bird, and C. Sutton, Learning natural coding
conventions, in Proceedings of the 22Nd ACM SIGSOFT International
Symposium on Foundations of Software Engineering, FSE 2014, (New York,
NY, USA), pp. 281293, ACM, 2014.
[44] M. Allamanis, E. T. Barr, C. Bird, and C. Sutton, Suggesting accurate
method and class names, in Proceedings of the 2015 10th Joint Meeting on
Foundations of Software Engineering, ESEC/FSE 2015, (New York, NY,
USA), pp. 3849, ACM, 2015.
[45] G. Bavota, A. De Lucia, A. Marcus, and R. Oliveto, Automating extract
class refactoring: an improved method and its evaluation, Empirical Soft-
ware Engineering, vol. 19, no. 6, pp. 16171664, 2014.
[46] V. Arnaoudova, M. Di Penta, and G. Antoniol, Linguistic antipatterns:
what they are and how developers perceive them, Empirical Software En-
gineering, vol. 21, no. 1, pp. 104158, 2016.
[47] S. Haiduc, J. Aponte, and A. Marcus, Supporting program comprehension
with source code summarization, in Proceedings of the 32Nd ACM/IEEE
International Conference on Software Engineering - Volume 2, ICSE 10,
(New York, NY, USA), pp. 223226, ACM, 2010.
[48] L. Moreno, J. Aponte, G. Sridhara, A. Marcus, L. Pollock, and K. Vijay-
Shanker, Automatic generation of natural language summaries for java
classes, in 2013 21st International Conference on Program Comprehension
(ICPC), pp. 2332, IEEE, 2013.
[49] L. Moreno, G. Bavota, M. D. Penta, R. Oliveto, A. Marcus, and G. Canfora,
Arena: An approach for the automated generation of release notes, IEEE
Transactions on Software Engineering, vol. PP, no. 99, pp. 11, 2016.
[50] S. Panichella, J. Aponte, M. Di Penta, A. Marcus, and G. Canfora, Min-
ing source code descriptions from developer communications, in Program
Comprehension (ICPC), 2012 IEEE 20th International Conference on,
pp. 6372, IEEE, 2012.
[51] B. Dit, M. Revelle, M. Gethers, and D. Poshyvanyk, Feature location in
source code: a taxonomy and survey, Journal of Software: Evolution and
Process, vol. 25, no. 1, pp. 5395, 2013.
[52] A. Marcus and S. Haiduc, Text Retrieval Approaches for Concept Location
in Source Code, pp. 126158. Berlin, Heidelberg: Springer Berlin Heidel-
berg, 2013.
[53] D. Shepherd, Z. P. Fry, E. Hill, L. Pollock, and K. Vijay-Shanker, Using
natural language program analysis to locate and understand action-oriented
concerns, in Proceedings of the 6th International Conference on Aspect-
oriented Software Development, AOSD 07, (New York, NY, USA), pp. 212
224, ACM, 2007.
[54] E. Hill, L. Pollock, and K. Vijay-Shanker, Automatically capturing source
code context of nl-queries for software maintenance and reuse, in 2009
IEEE 31st International Conference on Software Engineering, pp. 232242,
May 2009.
17
[55] L. Huang, V. Ng, I. Persing, M. Chen, Z. Li, R. Geng, and J. Tian, Au-
toodc: Automated generation of orthogonal defect classifications, Auto-
mated Software Engineering, vol. 22, no. 1, pp. 346, 2015.
18