code. In Proceedings of the 2000 International Con-
ference on Software Engineering, pages 439–448.
Crew, R. F. (1997). Astlog: A language for examin-
ing abstract syntax trees. In Proceedings of the
USENIX Conference on Domain-Specific Languages,
pages 229–242.
Ferrante, J., Ottenstein, K. J., and Warren, J. D. (1987). The
program dependence graph and its use in optimiza-
tion. ACM Trans. Program. Lang. Syst., 9(3):319–349.
Fowler, M. (2013). Refactoring: improving the design of
existing code. Addison-Wesley Professional.
Grossman, D., Hicks, M., Jim, T., and Morrisett, G. (2005).
Cyclone: A type-safe dialect of c. C/C++ Users Jour-
nal, 23(1):112–139.
Harel, D. (1987). Statecharts: a visual formalism for com-
plex systems. Sci. Comput. Program., 8(3):231–274.
Jiresal, R., Makkapati, H., and Naik, R. (2011). Statechart
extraction from code – an approach using static pro-
gram analysis and heuristics based abstractions. In
Proc. of 2nd India Workshop on Reverse Engineering.
K
¨
astner, C., Giarrusso, P. G., Rendel, T., Erdweg, S., Os-
termann, K., and Berger, T. (2011). Variability-aware
parsing in the presence of lexical macros and condi-
tional compilation. SIGPLAN Not., 46(10):805–824.
Knor, R., Trausmuth, G., and Weidl, J. (1998). Reengineer-
ing c/c++ source code by transforming state machines.
In Development and Evolution of Software Architec-
tures for Product Families, pages 97–105.
Kung, D., Suchak, N., Gao, J., Hsia, P., Toyoshima, Y., and
Chen, C. (1994). On object state testing. In Proceed-
ings Eighteenth Annual International Computer Soft-
ware and Applications Conference, pages 222–227.
Ladd, D. A. and Ramming, J. C. (1995). A*: a language
for implementing language processors. IEEE Trans-
actions on Software Engineering, 21(11):894–901.
Necula, G. C., McPeak, S., Rahul, S. P., and Weimer, W.
(2002). Cil: Intermediate language and tools for anal-
ysis and transformation of c programs. In Proceedings
of Conference on Compilier Construction, pages 213–
228.
Paul, S. and Prakash, A. (1994). A framework for source
code search using program patterns. IEEE Transac-
tions on Software Engineering, 20(6):463–475.
Prywes, N. and Rehmet, P. (1996). Recovery of software
design, state-machines and specifications from source
code. In Proceedings 2nd IEEE International Confer-
ence on Engineering of Complex Computer Systems,
pages 279–288.
Ricca, F., Torchiano, M., Leotta, M., Tiso, A., Guerrini, G.,
and Reggio, G. (2018). On the impact of state-based
model-driven development on maintainability: a fam-
ily of experiments using unimod. Empirical Software
Engineering, 23(3):1743–1790.
Said, W., Quante, J., and Koschke, R. (2018). Towards
interactive mining of understandable state machine
models from embedded software. In Proceedings
of the 6th International Conference on Model-Driven
Engineering and Software Development, pages 117–
128.
Said, W., Quante, J., and Koschke, R. (2019). Do extracted
state machine models help to understand embedded
software? In Proceedings of the 27th International
Conference on Program Comprehension, pages 191–
196.
Samek, M. (2009). Practical uml statecharts in c/c++:
Event-driven programming for embedded systems.
Sen, T. and Mall, R. (2016). Extracting finite state repre-
sentation of java programs. Software & Systems Mod-
eling, 15(2):497–511.
Shaohui Wang, Srinivasan Dwarakanathan, Oleg Sokolsky,
and Insup Lee (2012). High-level model extraction via
symbolic execution.
Som
´
e, S. S. and Lethbridge, T. C. (2002). Enhancing pro-
gram comprehension with recovered state models. In
Proceedings of the 10th International Workshop on
Program Comprehension, pages 85–93.
Thums, A. and Quante, J. (2012). Reengineering embed-
ded automotive software. In Proceedings of the 28th
IEEE International Conference on Software Mainte-
nance, pages 493–502.
van den Brand, M., Serebrenik, A., and van Zeeland, D.
(2008). Extraction of state machines of legacy c code
with cpp2xmi. In Proceedings of the 7th Belgian-
Netherlands Software Evolution Workshop, pages 28–
30.
Voelter, M., Kolb, B., Szab
´
o, T., Ratiu, D., and van Deursen,
A. (2019). Lessons learned from developing mbeddr:
a case study in language engineering with mps. Soft-
ware & Systems Modeling, 18(1):585–630.
von Mayrhauser, A. and Vans, A. M. (1995). Program com-
prehension during software maintenance and evolu-
tion. IEEE Computer, 28(8):44–55.
Walkinshaw, N., Bogdanov, K., Ali, S., and Holcombe, M.
(2008). Automated discovery of state transitions and
their functions in source code. Software Testing, Veri-
fication and Reliability, 18(2):99–121.
Walkinshaw, N. and Hall, M. (2016). Inferring computa-
tional state machine models from program executions.
In Proceedings of the IEEE International Conference
on Software Maintenance and Evolution, pages 122–
132.
Xiao, H., Sun, J., Liu, Y., Lin, S.-W., and Sun, C. (2013).
Tzuyu: Learning stateful typestates. In Proceedings
of the 28th IEEE/ACM International Conference on
Automated Software Engineering, pages 432–442.
Xie, T., Martin, E., and Yuan, H. (2006). Automatic extrac-
tion of abstract-object-state machines from unit-test
executions. In Proceedings of the 28th International
Conference on Software Engineering, pages 835–838.
Xu, S. and Chee, Y. S. (2003). Transformation-based diag-
nosis of student programs for programming tutoring
systems. IEEE Transactions on Software Engineer-
ing, 29(4):360–384.
Transformation- and Pattern-based State Machine Mining from Embedded C Code
115