skip to main content
research-article
Free Access

Program Synthesis for Program Analysis

Published:28 May 2018Publication History
Skip Abstract Section

Abstract

In this article, we propose a unified framework for designing static analysers based on program synthesis. For this purpose, we identify a fragment of second-order logic with restricted quantification that is expressive enough to model numerous static analysis problems (e.g., safety proving, bug finding, termination and non-termination proving, refactoring). As our focus is on programs that use bit-vectors, we build a decision procedure for this fragment over finite domains in the form of a program synthesiser. We provide instantiations of our framework for solving a diverse range of program verification tasks such as termination, non-termination, safety and bug finding, superoptimisation, and refactoring. Our experimental results show that our program synthesiser compares positively with specialised tools in each area as well as with general-purpose synthesisers.

Skip Supplemental Material Section

Supplemental Material

References

  1. Alessandro Abate, Iury Bessa, Dario Cattaruzza, Lucas Cordeiro, Cristina David, Pascal Kesseli, and Daniel Kroening. 2017. Sound and automated synthesis of digital stabilizing controllers for continuous plants. In Proceedings of the 20th International Conference on Hybrid Systems: Computation and Control (HSCC’17). ACM, New York, 197--206. Google ScholarGoogle ScholarDigital LibraryDigital Library
  2. Alessandro Abate, Iury Bessa, Dario Cattaruzza, Lucas C. Cordeiro, Cristina David, Pascal Kesseli, Daniel Kroening, and Elizabeth Polgreen. 2017. Automated formal synthesis of digital controllers for state-space physical plants. In Proceedings of the 29th International Conference on Computer Aided Verification (CAV’17). 462--482.Google ScholarGoogle ScholarCross RefCross Ref
  3. Rajeev Alur, Rastislav Bodík, Garvit Juniwal, Milo M. K. Martin, Mukund Raghothaman, Sanjit A. Seshia, Rishabh Singh, Armando Solar-Lezama, Emina Torlak, and Abhishek Udupa. 2013. Syntax-guided synthesis. In Proceedings on Formal Methods in Computer-Aided Design (FMCAD’13). 1--8.Google ScholarGoogle ScholarCross RefCross Ref
  4. Rajeev Alur, Rastislav Bodík, Garvit Juniwal, Milo M. K. Martin, Mukund Raghothaman, Sanjit A. Seshia, Rishabh Singh, Armando Solar-Lezama, Emina Torlak, and Abhishek Udupa. 2013. Syntax-guided synthesis. In Proceedings on Formal Methods in Computer-Aided Design (FMCAD’13). IEEE, 1--8.Google ScholarGoogle ScholarCross RefCross Ref
  5. Karl Johan Astrom and Richard M. Murray. 2008. Feedback Systems: An Introduction for Scientists and Engineers. Princeton University Press, Princeton, NJ. Google ScholarGoogle ScholarDigital LibraryDigital Library
  6. Karl J. Åström and Björn Wittenmark. 1990. Computer-Controlled Systems: Theory and Design. Prentice-Hall, Inc., Upper Saddle River, NJ. Google ScholarGoogle ScholarDigital LibraryDigital Library
  7. James Avery. 2006. Size-change termination and bound analysis. In Proceedings of the 8th International Conference on Functional and Logic Programming (FLOPS’06). Springer, 192--207. Google ScholarGoogle ScholarDigital LibraryDigital Library
  8. Thomas Ball, Ella Bounimova, Vladimir Levin, Rahul Kumar, and Jakob Lichtenberg. 2010. The static driver verifier research platform. In Proceedings on Computer Aided Verification (CAV’10). Springer, 119--122. Google ScholarGoogle ScholarDigital LibraryDigital Library
  9. Amir M. Ben-Amram. 2010. Size-change termination, monotonicity constraints and ranking functions. Logical Methods in Computer Science 6, 3 (2010).Google ScholarGoogle Scholar
  10. Amir M. Ben-Amram and Samir Genaim. 2013. On the linear ranking problem for integer linear-constraint loops. In Proceedings of the 40th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (POPL’13). ACM, New York, 51--62. Google ScholarGoogle ScholarDigital LibraryDigital Library
  11. Tewodros A. Beyene, Marc Brockschmidt, and Andrey Rybalchenko. 2014. CTL+FO verification as constraint solving. In Proceedings of the 2014 International SPIN Symposium on Model Checking of Software (SPIN’14). ACM, New York, 101--104. Google ScholarGoogle ScholarDigital LibraryDigital Library
  12. Tewodros A. Beyene, Corneliu Popeea, and Andrey Rybalchenko. 2013. Solving existentially quantified horn clauses. In Proceedings of the 25th International Conference on Computer Aided Verification (CAV’13). Springer, 869--882.Google ScholarGoogle ScholarCross RefCross Ref
  13. Dirk Beyer and M. Erkan Keremoglu. 2011. CPAchecker: A tool for configurable software verification. In Computer Aided Verification, Ganesh Gopalakrishnan and Shaz Qadeer (Eds.). Lecture Notes in Computer Science, Vol. 6806. Springer, 184--190. Google ScholarGoogle ScholarDigital LibraryDigital Library
  14. Aaron R. Bradley, Zohar Manna, and Henny B. Sipma. 2005. Linear ranking with reachability. In Proceedings of the 17th International Conference on Computer Aided Verification (CAV’05). Springer, 491--504. Google ScholarGoogle ScholarDigital LibraryDigital Library
  15. Aaron R. Bradley, Zohar Manna, and Henny B. Sipma. 2005. The polyranking principle. In Proceedings of the 32nd International Conference on Automata, Languages and Programming (ICALP’05). Springer, 1349--1361. Google ScholarGoogle ScholarDigital LibraryDigital Library
  16. Aaron R. Bradley, Zohar Manna, and Henny B. Sipma. 2005. Termination of polynomial programs. In Proceedings of the 6th International Conference on Verification, Model Checking, and Abstract Interpretation (VMCAI’05). Springer, 113--129. Google ScholarGoogle ScholarDigital LibraryDigital Library
  17. Martin Brain and others. 2006. TOAST: Applying answer set programming to superoptimisation. In Proceedings of ICLP. Google ScholarGoogle ScholarDigital LibraryDigital Library
  18. M. F. Brameier and W. Banzhaf. 2007. Linear Genetic Programming. Springer. Google ScholarGoogle ScholarDigital LibraryDigital Library
  19. Marc Brockschmidt, Byron Cook, and Carsten Fuhs. 2013. Better termination proving through cooperation. In Proceedings of the 25th International Conference on Computer Aided Verification (CAV’13). Springer, 413--429.Google ScholarGoogle ScholarCross RefCross Ref
  20. Hong-Yi Chen, Byron Cook, Carsten Fuhs, Kaustubh Nimkar, and Peter O’Hearn. 2014. Proving Nontermination via Safety. Springer, 156--171.Google ScholarGoogle Scholar
  21. Hong Yi Chen, Shaked Flur, and Supratik Mukhopadhyay. 2012. Termination proofs for linear simple loops. In Proceedings of Static Analysis (SAS’12). Springer, 422--438. Google ScholarGoogle ScholarDigital LibraryDigital Library
  22. Alvin Cheung, Armando Solar-Lezama, and Samuel Madden. 2013. Optimizing database-backed applications with query synthesis. In Proceedings of the 34th ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI’13). ACM, New York, 3--14. Google ScholarGoogle ScholarDigital LibraryDigital Library
  23. Alonzo Church. 1962. Logic, arithmetic, automata. In Proceedings of the International Congress of Mathematicians. 23--35.Google ScholarGoogle Scholar
  24. Edmund Clarke, Armin Biere, Richard Raimi, and Yunshan Zhu. 2001. Bounded model checking using satisfiability solving. Formal Methods in Systems Design. 19, 1 (July 2001), 7--34. Google ScholarGoogle ScholarDigital LibraryDigital Library
  25. Edmund Clarke, Daniel Kroening, and Karen Yorav. 2003. Behavioral consistency of C and verilog programs using bounded model checking. In Proceedings of the 40th Annual Design Automation Conference (DAC’03). ACM, New York, 368--371. Google ScholarGoogle ScholarDigital LibraryDigital Library
  26. Edmund M. Clarke, Orna Grumberg, and David E. Long. 1994. Model checking and abstraction. ACM Transactions on Programming Languages and Systems 16, 5 (Sept. 1994), 1512--1542. Google ScholarGoogle ScholarDigital LibraryDigital Library
  27. Michael Codish and Samir Genaim. 2003. Proving termination one loop at a time. In Proceedings of the 13th Workshop on Logic Programming Environments. 48--59.Google ScholarGoogle Scholar
  28. Byron Cook, Daniel Kroening, Philipp Rümmer, and Christoph M. Wintersteiger. 2010. Ranking function synthesis for bit-vector relations. In Proceedings of the 16th International Conference on Tools and Algorithms for the Construction and Analysis of Systems (TACAS’10). Springer, 236--250. Google ScholarGoogle ScholarDigital LibraryDigital Library
  29. Byron Cook, Andreas Podelski, and Andrey Rybalchenko. 2006. Termination proofs for systems code. In Proceedings of the ACM SIGPLAN 2006 Conference on Programming Language Design and Implementation. 415--426. Google ScholarGoogle ScholarDigital LibraryDigital Library
  30. Byron Cook, Abigail See, and Florian Zuleger. 2013. Ramsey vs. lexicographic termination proving. In Proceedings of the 19th International Coference on Tools and Algorithms for the Construction and Analysis of Systems (TACAS’13). 47--61. Google ScholarGoogle ScholarDigital LibraryDigital Library
  31. Patrick Cousot and Radhia Cousot. 1977. Abstract interpretation: A unified lattice model for static analysis of programs by construction or approximation of fixpoints. In Conference Record of the 4th ACM Symposium on Principles of Programming Languages (POPL’77). 238--252. Google ScholarGoogle ScholarDigital LibraryDigital Library
  32. Cristina David, Pascal Kesseli, and Daniel Kroening. 2016. Kayak: Safe Semantic Refactoring to Java Streams. Technical Report. University of Oxford. https://www.cs.ox.ac.uk/files/9156/stream-extended.pdf.Google ScholarGoogle Scholar
  33. Cristina David, Pascal Kesseli, Daniel Kroening, and Matt Lewis. 2016. Danger invariants. In Proceedings of the 21st International Symposium on Formal Methods (FM’16). 182--198.Google ScholarGoogle ScholarCross RefCross Ref
  34. Cristina David and Daniel Kroening. 2017. Program synthesis: Challenges and opportunities. In Philosophical Transactions of the Royal Society A. To appear.Google ScholarGoogle Scholar
  35. Cristina David, Daniel Kroening, and Matt Lewis. 2015. Unrestricted termination and non-termination arguments for bit-vector programs. In Proceedings of the 24th European Symposium on Programming Languages and Systems (ESOP’15). 183--204.Google ScholarGoogle ScholarCross RefCross Ref
  36. Cristina David, Daniel Kroening, and Matt Lewis. 2015. Using program synthesis for program analysis. In Proceedings of the 20th International Conference on Logic for Programming, Artificial Intelligence, and Reasoning (LPAR-20). 483--498. Google ScholarGoogle ScholarDigital LibraryDigital Library
  37. Leonardo Mendonça de Moura and Nikolaj Bjørner. 2008. Deciding effectively propositional logic using DPLL and substitution sets. In Proceedings of the 4th International Joint Conference on Automated Reasoning (IJCAR’08). 410--425.Google ScholarGoogle ScholarDigital LibraryDigital Library
  38. Nachum Dershowitz, Naomi Lindenstrauss, Yehoshua Sagiv, and Alexander Serebrenik. 2001. A general framework for automatic termination analysis of logic programs. Applicable Algebra in Engineering, Communication and Computing 12, 1/2 (2001), 117--156.Google ScholarGoogle ScholarCross RefCross Ref
  39. Ronald Fagin. 1974. Generalized first-order spectra and polynomial-time recognizable sets. In Complexity of Computation, R. Karp (Ed.).Google ScholarGoogle Scholar
  40. Robert W. Floyd. 1993. Assigning Meanings to Programs. Springer, Dordrecht, Netherlands, 65--81.Google ScholarGoogle Scholar
  41. Gene F. Franklin, David J. Powell, and Abbas Emami-Naeini. 2001. Feedback Control of Dynamic Systems (4th ed.). Prentice Hall PTR, Upper Saddle River, NJ. Google ScholarGoogle ScholarDigital LibraryDigital Library
  42. Pranav Garg, Christof Löding, P. Madhusudan, and Daniel Neider. 2014. ICE: A Robust Framework for Learning Invariants. Springer International Publishing, Cham, 69--87.Google ScholarGoogle Scholar
  43. Benny Godlin and Ofer Strichman. 2010. Inference rules for proving the equivalence of recursive procedures, Time for Verification. Springer, 167--184. http://dl.acm.org/citation.cfm?id=1880443.1880451 Google ScholarGoogle ScholarDigital LibraryDigital Library
  44. Faustino Gomez and Risto Miikkulainen. 1997. Incremental evolution of complex general behavior. Adaptive Behavior 5, 3--4 (1997), 317--342. Google ScholarGoogle ScholarDigital LibraryDigital Library
  45. Sergey Grebenshchikov, Nuno P. Lopes, Corneliu Popeea, and Andrey Rybalchenko. 2012. Synthesizing software verifiers from proof rules. In Proceedings of the ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI’12). 405--416. Google ScholarGoogle ScholarDigital LibraryDigital Library
  46. Sumit Gulwani. 2010. Dimensions in program synthesis. In Proceedings of the 12th International ACM SIGPLAN Symposium on Principles and Practice of Declarative Programming (PPDP’10). ACM, New York, 13--24. Google ScholarGoogle ScholarDigital LibraryDigital Library
  47. Sumit Gulwani, Sagar Jain, and Eric Koskinen. 2009. Control-flow refinement and progress invariants for bound analysis. In Proceedings of the 2009 ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI’09). 375--385. Google ScholarGoogle ScholarDigital LibraryDigital Library
  48. Sumit Gulwani, Susmit Jha, Ashish Tiwari, and Ramarathnam Venkatesan. 2011. Synthesis of loop-free programs. In Proceedings of the 32nd ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI’11). ACM, New York, 62--73. Google ScholarGoogle ScholarDigital LibraryDigital Library
  49. Sumit Gulwani, Saurabh Srivastava, and Ramarathnam Venkatesan. 2008. Program analysis as constraint solving. In Proceedings of the ACM SIGPLAN 2008 Conference on Programming Language Design and Implementation (PLDI’08). 281--292. Google ScholarGoogle ScholarDigital LibraryDigital Library
  50. Ashutosh Gupta, Thomas A. Henzinger, Rupak Majumdar, Andrey Rybalchenko, and Ru-Gang Xu. 2008. Proving non-termination. SIGPLAN Notices 43, 1 (Jan. 2008), 147--158. Google ScholarGoogle ScholarDigital LibraryDigital Library
  51. Arie Gurfinkel, Temesghen Kahsai, and Jorge A. Navas. 2015. SeaHorn: A framework for verifying C programs (competition contribution). In Tools and Algorithms for the Construction and Analysis of Systems, Christel Baier and Cesare Tinelli (Eds.). Lecture Notes in Computer Science, Vol. 9035. Springer, 447--450. Google ScholarGoogle ScholarDigital LibraryDigital Library
  52. Arvind Haran, Montgomery Carter, Michael Emmi, Akash Lal, Shaz Qadeer, and Zvonimir Rakamarić. 2015. SMACK+Corral: A modular verifier (competition contribution). In Proceedings of the 21st International Conference on Tools and Algorithms for the Construction and Analysis of Systems (TACAS’15), Lecture Notes in Computer Science, Vol. 9035, Christel Baier and Cesare Tinelli (Eds.). Springer, 450--453. Google ScholarGoogle ScholarDigital LibraryDigital Library
  53. William R. Harris, Akash Lal, Aditya V. Nori, and Sriram K. Rajamani. 2010. Alternation for termination. In Proceedings of the 17th International Symposium on Static Analysis (SAS’10). 304--319. Google ScholarGoogle ScholarDigital LibraryDigital Library
  54. Matthias Heizmann, Jochen Hoenicke, Jan Leike, and Andreas Podelski. 2013. Linear Ranking for Linear Lasso Programs. Springer International Publishing, Cham, 365--380.Google ScholarGoogle Scholar
  55. Georg Hofferek, Ashutosh Gupta, Bettina Könighofer, Jie-Hong Roland Jiang, and Roderick Bloem. 2013. Synthesizing multiple Boolean functions using interpolation on a single proof. http://arxiv.org/abs/1308.4767, CoRR abs/1308.4767.Google ScholarGoogle Scholar
  56. Ming-Yee Iu, Emmanuel Cecchet, and Willy Zwaenepoel. 2010. JReq: Database queries in imperative languages. In Proceedings of the 19th Joint European Conference on Theory and Practice of Software and International Conference on Compiler Construction (CC’10/ETAPS’10). Springer, 84--103. Google ScholarGoogle ScholarDigital LibraryDigital Library
  57. Susmit Jha, Sumit Gulwani, Sanjit A. Seshia, and Ashish Tiwari. 2010. Oracle-guided component-based program synthesis. In Proceedings of the 32nd ACM/IEEE International Conference on Software Engineering - Volume 1 (ICSE’10). ACM, New York, 215--224. Google ScholarGoogle ScholarDigital LibraryDigital Library
  58. Lee H. Keel and Shankar P. Bhattacharyya. 1997. Robust, fragile, or optimal? IEEE Transactions on Automatic Control 42, 8 (1997), 1098--1105.Google ScholarGoogle ScholarCross RefCross Ref
  59. Lee H. Keel and Shankar P. Bhattacharyya. 1998. Stability margins and digital implementation of controllers. In Proceedings of the American Control Conference, Vol. 5. 2852--2856.Google ScholarGoogle Scholar
  60. Soonho Kong, Yungbum Jung, Cristina David, Bow-Yaw Wang, and Kwangkeun Yi. 2010. Automatically Inferring Quantified Loop Invariants by Algorithmic Learning from Simple Templates. Springer, 328--343.Google ScholarGoogle Scholar
  61. Ina Kraan, David Basin, and Alan Bundy. 1993. Logic program synthesis via proof planning. In Logic Program Synthesis and Transformation. 1--14.Google ScholarGoogle Scholar
  62. Daniel Kroening, Matt Lewis, and Georg Weissenbacher. 2013. Under-approximating loops in C programs for fast counterexample detection. In Proceedings of the 25th International Conference on Computer Aided Verification (CAV’13). Springer, 381--396.Google ScholarGoogle ScholarCross RefCross Ref
  63. Daniel Kroening, Matt Lewis, and Georg Weissenbacher. 2015. Proving safety with trace automata and bounded model checking. In Proceedings of the 20th International Symposium on Formal Methods (FM’15). 325--341.Google ScholarGoogle ScholarCross RefCross Ref
  64. Daniel Kroening, Natasha Sharygina, Aliaksei Tsitovich, and Christoph M. Wintersteiger. 2010. Termination analysis with compositional transition invariants. In Proceedings of the 22nd International Conference on Computer Aided Verification (CAV’10). 89--103. Google ScholarGoogle ScholarDigital LibraryDigital Library
  65. William B. Langdon and Riccardo Poli. 2002. Foundations of Genetic Programming. Springer. Google ScholarGoogle ScholarDigital LibraryDigital Library
  66. Daniel Larraz, Albert Oliveras, Enric Rodríguez-Carbonell, and Albert Rubio. 2013. Proving termination of imperative programs using Max-SMT. In Proceedings of 2013 Formal Methods in Computer-Aided Design. 218--225.Google ScholarGoogle ScholarCross RefCross Ref
  67. Zohar Manna and Richard J. Waldinger. 1971. Toward automatic program synthesis. Communications of the ACM 14, 3 (March 1971), 151--165. Google ScholarGoogle ScholarDigital LibraryDigital Library
  68. Kenneth L. McMillan. 2006. Lazy abstraction with interpolants. In Proceedings of the 18th International Conference on Computer Aided Verification (CAV’06). Springer, 123--136. Google ScholarGoogle ScholarDigital LibraryDigital Library
  69. Aditya V. Nori and Sriram K. Rajamani. 2010. An empirical study of optimizations in yogi. In Proceedings of the International Conference on Software Engineering (ICSE’10). Association for Computing Machinery, Inc. http://research.microsoft.com/apps/pubs/default.aspx?id=117670 Google ScholarGoogle ScholarDigital LibraryDigital Library
  70. Aditya V. Nori and Rahul Sharma. 2013. Termination proofs from tests. In Proceedings of the 2013 9th Joint Meeting on Foundations of Software Engineering (ESEC/FSE’13). ACM, New York, 246--256. Google ScholarGoogle ScholarDigital LibraryDigital Library
  71. Andreas Podelski and Andrey Rybalchenko. 2004. A complete method for the synthesis of linear ranking functions. In Proceedings of the, 5th International Conference on Verification, Model Checking, and Abstract Interpretation (VMCAI’04). 239--251.Google ScholarGoogle ScholarCross RefCross Ref
  72. Andreas Podelski and Andrey Rybalchenko. 2004. Transition invariants. In Proceedings of the 19th Annual IEEE Symposium on Logic in Computer Science (LICS’04). IEEE Computer Society, 32--41. Google ScholarGoogle ScholarDigital LibraryDigital Library
  73. Phillip Porras, Hassen Saïdi, and Vinod Yegneswaran. 2009. A foray into conficker’s logic and rendezvous points. In Proceedings of the 2nd USENIX Conference on Large-Scale Exploits and Emergent Threats: Botnets, Spyware, Worms, and More (LEET’09). USENIX Association, 7--7. http://dl.acm.org/citation.cfm?id=1855676.1855683 Google ScholarGoogle ScholarDigital LibraryDigital Library
  74. Andrew Reynolds, Morgan Deters, Viktor Kuncak, Cesare Tinelli, and Clark Barrett. 2015. Counterexample-Guided Quantifier Instantiation for Synthesis in SMT. Springer International Publishing, Cham, 198--216.Google ScholarGoogle Scholar
  75. Andrey Rybalchenko. 2011. ARMC. Retrieved November 2014 from http://www7.in.tum.de/rybal/armc.Google ScholarGoogle Scholar
  76. Armando Solar-Lezama, Liviu Tancau, Rastislav Bodík, Sanjit A. Seshia, and Vijay A. Saraswat. 2006. Combinatorial sketching for finite programs. In Proceedings of the 12th International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS’06). 404--415. Google ScholarGoogle ScholarDigital LibraryDigital Library
  77. SV-COMP. 2015. Retrieved November 2014 from http://sv-comp.sosy-lab.org/2015/.Google ScholarGoogle Scholar
  78. SV-COMP. 2016. Retrieved November 2015 from http://sv-comp.sosy-lab.org/2016/.Google ScholarGoogle Scholar
  79. Alan Turing. 1936. On computable numbers with an application to the Entscheidungsproblem. Proceedings of the London Mathematical Society 2 (1936), 230–265.Google ScholarGoogle Scholar
  80. Caterina Urban. 2013. The abstract domain of segmented ranking functions. In Proceedings of the 20th International Symposium on Static Analysis (SAS’13). 43--62.Google ScholarGoogle ScholarCross RefCross Ref
  81. Timothy E. Wang, Pierre-Loïc Garoche, Pierre Roux, Romain Jobredeaux, and Eric Feron. 2016. Formal analysis of robustness at model and code level. In Proceedings of the 19th International Conference on Hybrid Systems: Computation and Control (HSCC’16). 125--134. Google ScholarGoogle ScholarDigital LibraryDigital Library
  82. Henry S. Warren. 2002. Hacker’s Delight. Addison-Wesley Longman Publishing Co., Inc., Boston, MA.Google ScholarGoogle Scholar
  83. Christoph M. Wintersteiger, Youssef Hamadi, and Leonardo Moura. 2013. Efficiently solving quantified bit-vector formulas. Formal Methods in System. Design 42, 1 (Feb. 2013), 3--23. Google ScholarGoogle ScholarDigital LibraryDigital Library

Index Terms

  1. Program Synthesis for Program Analysis

          Recommendations

          Comments

          Login options

          Check if you have access through your login credentials or your institution to get full access on this article.

          Sign in

          Full Access

          • Published in

            cover image ACM Transactions on Programming Languages and Systems
            ACM Transactions on Programming Languages and Systems  Volume 40, Issue 2
            June 2018
            223 pages
            ISSN:0164-0925
            EISSN:1558-4593
            DOI:10.1145/3229520
            Issue’s Table of Contents

            Copyright © 2018 ACM

            Publisher

            Association for Computing Machinery

            New York, NY, United States

            Publication History

            • Published: 28 May 2018
            • Accepted: 1 December 2017
            • Revised: 1 August 2017
            • Received: 1 April 2016
            Published in toplas Volume 40, Issue 2

            Permissions

            Request permissions about this article.

            Request Permissions

            Check for updates

            Qualifiers

            • research-article
            • Research
            • Refereed

          PDF Format

          View or Download as a PDF file.

          PDF

          eReader

          View online with eReader.

          eReader

          HTML Format

          View this article in HTML Format .

          View HTML Format
          About Cookies On This Site

          We use cookies to ensure that we give you the best experience on our website.

          Learn more

          Got it!