Advertisement

Abstract Execution

  • Dominic SteinhöfelEmail author
  • Reiner Hähnle
Conference paper
Part of the Lecture Notes in Computer Science book series (LNCS, volume 11800)

Abstract

We propose a new static software analysis principle called Abstract Execution, generalizing Symbolic Execution: While the latter analyzes all possible execution paths of a specific program, Abstract Execution analyzes a partially unspecified program by permitting abstract symbols representing unknown contexts. For each abstract symbol, we faithfully represent each possible concrete execution resulting from its substitution with concrete code. There is a wide range of applications of Abstract Execution, especially for verifying relational properties of schematic programs. We implemented Abstract Execution in a deductive verification framework and proved correctness of eight well-known statement-level refactoring rules, including two with loops. For each refactoring we characterize the preconditions that make it semantics-preserving. Most preconditions are not mentioned in the literature.

References

  1. 1.
    Ahrendt, W., Beckert, B., Bubel, R., Hähnle, R., Schmitt, P., Ulbrich, M. (eds.): Deductive Software Verification-The KeY Book: From Theory to Practice. LNCS, vol. 10001. Springer, Heidelberg (2016).  https://doi.org/10.1007/978-3-319-49812-6CrossRefGoogle Scholar
  2. 2.
    Barthe, G., Crespo, J.M., Kunz, C.: Relational verification using product programs. In: Butler, M., Schulte, W. (eds.) FM 2011. LNCS, vol. 6664, pp. 200–214. Springer, Heidelberg (2011).  https://doi.org/10.1007/978-3-642-21437-0_17CrossRefGoogle Scholar
  3. 3.
    Barthe, G., D’Argenio, P.R., Rezk, T.: Secure information flow by self-composition. In: 17th IEEE Computer Security Foundations Workshop, CSFW-17, Pacific Grove, CA, USA, pp. 100–114. IEEE Computer Society (2004)Google Scholar
  4. 4.
    Beckert, B., Ulbrich, M.: Trends in relational program verification. In: Principled Software Development - Essays Dedicated to Arnd Poetzsch-Heffter on the Occasion of his 60th Birthday, pp. 41–58 (2018)Google Scholar
  5. 5.
    Boyer, R.S., Elspas, B., Levitt, K.N.: SELECT–a formal system for testing and debugging programs by symbolic execution. ACM SIGPLAN Not. 10(6), 234–245 (1975)CrossRefGoogle Scholar
  6. 6.
    Bubel, R., Hähnle, R., Pelevina, M.: Fully abstract operation contracts. In: Margaria, T., Steffen, B. (eds.) ISoLA 2014. LNCS, vol. 8803, pp. 120–134. Springer, Heidelberg (2014).  https://doi.org/10.1007/978-3-662-45231-8_9CrossRefGoogle Scholar
  7. 7.
    Burstall, R.M.: Proving properties of programs by structural induction. Comput. J. 12(1), 41–48 (1969)CrossRefGoogle Scholar
  8. 8.
    Burstall, R.M.: Program proving as hand simulation with a little induction. In: Information Processing 1974, pp. 308–312. Elsevier/North-Holland (1974)Google Scholar
  9. 9.
    Darvas, Á., Hähnle, R., Sands, D.: A theorem proving approach to analysis of secure information flow. In: Hutter, D., Ullmann, M. (eds.) SPC 2005. LNCS, vol. 3450, pp. 193–209. Springer, Heidelberg (2005).  https://doi.org/10.1007/978-3-540-32004-3_20CrossRefGoogle Scholar
  10. 10.
    Eilertsen, A.M., Bagge, A.H., Stolz, V.: Safer refactorings. In: Proceedings of 7th International Symposium on Leveraging Applications of Formal Methods, ISoLA, pp. 517–531 (2016)Google Scholar
  11. 11.
    Fowler, M.: Refactoring: Improving the Design of Existing Code. Object Technology Series. Addison-Wesley (1999)Google Scholar
  12. 12.
    Fowler, M.: Refactoring: Improving the Design of Existing Code. Addison-Wesley Signature Series, 2nd edn. Addison-Wesley Professional (2018)Google Scholar
  13. 13.
    Garrido, A., Meseguer, J.: Formal specification and verification of Java refactorings. In: Proceedings of 6th IEEE International Workshop on Source Code Analysis and Manipulation, SCAM 2006, pp. 165–174. IEEE Computer Society (2006)Google Scholar
  14. 14.
    Godlin, B., Strichman, O.: Regression verification: proving the equivalence of similar programs. Softw. Test. Verif. Reliab. 23(3), 241–258 (2013)CrossRefGoogle Scholar
  15. 15.
    Hähnle, R., Schaefer, I., Bubel, R.: Reuse in software verification by abstract method calls. In: Bonacina, M.P. (ed.) CADE 2013. LNCS (LNAI), vol. 7898, pp. 300–314. Springer, Heidelberg (2013).  https://doi.org/10.1007/978-3-642-38574-2_21CrossRefGoogle Scholar
  16. 16.
    Kiefer, M., Klebanov, V., Ulbrich, M.: Relational program reasoning using compiler ir - combining static verification and dynamic analysis. J. Autom. Reas. 60(3), 337–363 (2018)MathSciNetCrossRefGoogle Scholar
  17. 17.
    King, J.C.: Symbolic execution and program testing. Commun. ACM 19(7), 385–394 (1976)MathSciNetCrossRefGoogle Scholar
  18. 18.
    Kundu, S., Tatlock, Z., Lerner, S.: Proving optimizations correct using parameterized program equivalence. Proc. PLDI 2009, 327–337 (2009)CrossRefGoogle Scholar
  19. 19.
    Lanzinger, F.: A divide-and-conquer strategy with block and loop contracts for deductive program verification. Bachelor thesis, Institute of Theoretical Informatics, Karlsruhe Institute of Technology, April 2018Google Scholar
  20. 20.
    Leavens, G.T., et al.: JML reference manual, draft revision 2344, May 2013. http://www.eecs.ucf.edu/ leavens/JML//OldReleases/jmlrefman.pdf
  21. 21.
    Leroy, X.: Formal verification of a realistic compiler. Commun. ACM 52(7), 107–115 (2009)CrossRefGoogle Scholar
  22. 22.
    London, R.L.: Correctness of a compiler for a LISP subset. In: Proceedings of ACM Conference on Proving Assertions About Programs, pp. 121–127. ACM (1972)Google Scholar
  23. 23.
    Lopes, N.P., Menendez, D., Nagarakatte, S., Regehr, J.: Practical verification of peephole optimizations with alive. Commun. ACM 61(2), 84–91 (2018)CrossRefGoogle Scholar
  24. 24.
    McCarthy, J., Painter, J.: Correctness of a compiler for arithmetic expressions. Math. Aspects Comput. Sci. 1, 33–41 (1967)MathSciNetCrossRefGoogle Scholar
  25. 25.
    Mechtaev, S., Griggio, A., Cimatti, A., Roychoudhury, A.: Symbolic execution with existential second-order constraints. In: Proceedings of 2018 Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering, pp. 389–399 (2018)Google Scholar
  26. 26.
    Necula, G.C.: Proof-carrying code. In: Proceedings of 24th ACM Symposium on Principles of Programming Languages, Paris, France, pp. 106–119. ACM Press, January 1997Google Scholar
  27. 27.
    Scheurer, D., Hähnle, R., Bubel, R.: A general lattice model for merging symbolic execution branches. In: Ogata, K., Lawford, M., Liu, S. (eds.) ICFEM 2016. LNCS, vol. 10009, pp. 57–73. Springer, Cham (2016).  https://doi.org/10.1007/978-3-319-47846-3_5CrossRefGoogle Scholar
  28. 28.
    Srivastava, S., Gulwani, S., Foster, J.S.: From program verification to program synthesis. In: Proceedings of 37th POPL, pp. 313–326 (2010)Google Scholar
  29. 29.
    Steinhöfel, D., Hähnle, R.: Modular, correct compilation with automatic soundness proofs. In: Margaria, T., Steffen, B. (eds.) ISoLA 2018. LNCS, vol. 11244, pp. 424–447. Springer, Cham (2018).  https://doi.org/10.1007/978-3-030-03418-4_25CrossRefGoogle Scholar
  30. 30.
    Steinhöfel, D., Wasser, N.: A new invariant rule for the analysis of loops with non-standard control flows. In: Polikarpova, N., Schneider, S. (eds.) IFM 2017. LNCS, vol. 10510, pp. 279–294. Springer, Cham (2017).  https://doi.org/10.1007/978-3-319-66845-1_18CrossRefGoogle Scholar
  31. 31.
    Tan, Y.K., Myreen, M.O., Kumar, R., Fox, A., Owens, S., Norrish, M.: A new verified compiler backend for CakeML. In: Proceedings of 21st International Conference on Functional Programming, pp. 60–73. ACM (2016)Google Scholar

Copyright information

© Springer Nature Switzerland AG 2019

Authors and Affiliations

  1. 1.Department of Computer ScienceTU DarmstadtDarmstadtGermany

Personalised recommendations