Advertisement

Empirical Software Engineering

, Volume 20, Issue 6, pp 1785–1830 | Cite as

Charting the API minefield using software telemetry data

  • Maria Kechagia
  • Dimitris Mitropoulos
  • Diomidis Spinellis
Article

Abstract

Programs draw significant parts of their functionality through the use of Application Programming Interfaces (APIs). Apart from the way developers incorporate APIs in their software, the stability of these programs depends on the design and implementation of the APIs. In this work, we report how we used software telemetry data to analyze the causes of API failures in Android applications. Specifically, we got 4.9 gb worth of crash data that thousands of applications sent to a centralized crash report management service. We processed that data to extract approximately a million stack traces, stitching together parts of chained exceptions, and established heuristic rules to draw the border between applications and the API calls. We examined a set of more than a half million stack traces associated with risky API calls to map the space of the most common application failure reasons. Our findings show that the top ones can be attributed to memory exhaustion, race conditions or deadlocks, and missing or corrupt resources. Given the classes of the crash causes we identified, we recommend API design and implementation choices, such as specific exceptions, default resources, and non-blocking algorithms, that can eliminate common failures. In addition, we argue that development tools like memory analyzers, thread debuggers, and static analyzers can prevent crashes through early code testing and analysis. Finally, some execution platform and framework designs for process and memory management can also eliminate some application crashes.

Keywords

Application programming interfaces Stack traces Reliability Mobile applications 

Notes

Acknowledgments

We would like to thank the founders of BugSense Inc. Panos Papadopoulos and John Vlachogiannis for the data and information they provided us, as well as Alexandros Kompotis, who downloaded and gave us the data set. In addition, we would like to thank Konstantinos Polychronis and Antonis Lilis for the valuable information they gave us regarding Android application development. Also, we want to thank Panos Louridas, Georgios Gousios, Marios Fragkoulis, and Vassilios Karakoidas for their suggestions and internal reviews.

This research has been co-financed by the European Union (European Social Fund—esf) and Greek national funds through the Operational Program “Education and Lifelong Learning” of the National Strategic Reference Framework (nsrf)—Research Funding Program: Thalis—Athens University of Economics and Business—Software Engineering Research Platform.

References

  1. Aftandilian EE, Kelley S, Gramazio C, Ricci N, Su SL, Guyer SZ (2010) Heapviz: interactive heap visualization for program understanding and debugging. In: Proceedings of the 5th international symposium on software visualization, ACM, New York, NY, USA, SOFTVIS ’10, pp 53–62Google Scholar
  2. Agarwal R, Wang L, Stoller S (2006) Detecting potential deadlocks with static analysis and run-time monitoring. In: Ur S, Bin E, Wolfsthal Y (eds) Hardware and Software, Verification and Testing, Lecture Notes in Computer Science, vol 3875. Springer, Berlin Heidelberg, pp 191–207Google Scholar
  3. Alsallakh B, Bodesinsky P, Miksch S, Nasseri D (2012) Visualizing arrays in the Eclipse Java IDE. In: Proceedings of the 2012 16th European Conference on Software Maintenance and Reengineering, IEEE Computer Society, Washington, DC, USA, CSMR ’12, pp 541–544Google Scholar
  4. Amalfitano D, Fasolino AR, Tramontana P (2011) A GUI crawling-based technique for Android mobile application testing. In: Proceedings of the 2011 IEEE Fourth International Conference on Software Testing, Verification and Validation Workshops, IEEE Computer Society, Washington, DC, USA, ICSTW ’11, pp 252–261Google Scholar
  5. Amalfitano D, Fasolino AR, Tramontana P, De Carmine S, Memon AM (2012) Using GUI ripping for automated testing of Android applications. In: Proceedings of the 27th IEEE/ACM International Conference on Automated Software Engineering, ACM, New York, NY, USA, ASE, 2012Google Scholar
  6. Artho C, Biere A (2001) Applying static analysis to large-scale multi-threaded Java programs. In: Proceedings of the 13th Australian Conference on Software Engineering, IEEE Computer Society, Washington, DC, USA, ASWEC ’01, pp 68–75Google Scholar
  7. Avizienis A, Laprie JC, Randell B, Landwehr C (2004) Basic concepts and taxonomy of dependable and secure computing. Dependable and Secure Computing, IEEE Trans on 1(1):11–33. doi: 10.1109/TDSC.2004.2 Google Scholar
  8. Ayewah N, Hovemeyer D, Morgenthaler J, Penix J, Pugh W (2008) Using static analysis to find bugs. IEEE Softw 25 (5):22–29.  10.1109/MS.2008.130 CrossRefGoogle Scholar
  9. Bacchelli A (2013). Mining challenge 2013: Stack overflow. In: The 10th Working Conference on Mining Software RepositoriesGoogle Scholar
  10. Bacon DF, Cheng P, Grove D (2004) Garbage collection for embedded systems. In: Proceedings of the 4th ACM international conference on Embedded software, ACM, New York, NY, USA, EMSOFT ’04, pp 125–136Google Scholar
  11. Beizer B (2003) Software Testing Techniques. Dreamtech PressGoogle Scholar
  12. Bloch J (2006) How to design a good API and why it matters. In: Companion to the 21st ACM SIGPLAN symposium on Object-oriented programming systems, languages, and applications, ACM, New York, NY, USA, OOPSLA ’06, pp 506–507Google Scholar
  13. Bond MD, McKinley KS (2008) Tolerating memory leaks. In: Proceedings of the 23rd ACM SIGPLAN conference on Object-oriented programming systems languages and applications, ACM, New York, NY, USA, OOPSLA ’08, pp 109–126Google Scholar
  14. Bovet D, Cesati M (2005) Understanding The Linux Kernel. Oreilly & Associates IncGoogle Scholar
  15. Buse RPL, Weimer W (2012) Synthesizing API usage examples. In: Proceedings of the 2012 International Conference on Software Engineering, ICSE 2012. IEEE Press, Piscataway, pp 782–792. doi:  10.1109/ICSE.2012.6227140 Google Scholar
  16. Candes E, Wakin M (2008) An introduction to compressive sampling. IEEE Signal Proc Mag 25(2):21–30. doi: 10.1109/MSP.2007.914731 CrossRefGoogle Scholar
  17. Chang TH, Yeh T, Miller RC (2010) GUI testing using computer vision. In: Proceedings of the SIGCHI Conference on Human Factors in Computing Systems. ACM, New York, NY, USA, CHI ’10, pp 1535–1544Google Scholar
  18. Chen G, Kandemir M, Vijaykrishnan N, Irwin MJ, Mathiske B, Wolczko M (2003) Heap compression for memory-constrained Java environments. In: Proceedings of the 18th annual ACM SIGPLAN conference on Object-oriented programing, systems, languages, and applications, ACM, New York, NY, USA, OOPSLA ’03, pp 282–301. doi: 10.1145/949305.949330
  19. Chen MC, Chen JL, Chang TW (2011) Android/OSGi-based vehicular network management system. Comput Commun 34(2):169–183. doi:  10.1016/j.comcom.2010.03.032 CrossRefGoogle Scholar
  20. Chillarege R, Bhandari IS, Chaar JK, Halliday MJ, Moebus DS, Ray BK, Wong MY (1992) Orthogonal defect classification—a concept for in-process measurements. IEEE Trans Softw Eng 18(11): 943–956CrossRefGoogle Scholar
  21. Choe H, Baek J, Jeong H, Park S (2011) MetaService: an object transfer platform between Android applications. In: Proceedings of the 2011 ACM Symposium on Research in Applied Computation, ACM, New York, NY, USA, RACS ’11, pp 56–60Google Scholar
  22. Clarke S (2004) Measuring API usability. Dr Dobb’s Journal 29:S6–S9. http://www.drdobbs.com/windows/184405654 Google Scholar
  23. Dang Y, Wu R, Zhang H, Zhang D, Nobel P (2012) ReBucket: a method for clustering duplicate crash reports based on call stack similarity. In: Proceedings of the 2012 International Conference on Software Engineering, ICSE 2012. IEEE Press, Piscataway, pp 1084–1093Google Scholar
  24. DeMillo RA, Mathur AP (1995) A grammar based fault classification scheme and its application to the classification of the errors of TEX. Tech. rep., CiteseerGoogle Scholar
  25. Eisenstadt M (1997) My hairiest bug war stories. Commun ACM 40(4):30–37.  10.1145/248448.248456 CrossRefGoogle Scholar
  26. Ellis B, Stylos J, Myers B (2007) The factory pattern in API design: a usability evaluation. In: Proceedings of the 29th international conference on Software Engineering, IEEE Computer Society, Washington, DC, USA, ICSE ’07, pp 302–312Google Scholar
  27. Enck W, Ongtang M, McDaniel P (2009) Understanding Android security. IEEE Security Privacy 7 (1):50–57. doi: 10.1109/MSP.2009.26 CrossRefGoogle Scholar
  28. Endres A (1975) An analysis of errors and their causes in system programs. SIGPLAN Not 10(6):327–336.  10.1145/390016.808455 CrossRefGoogle Scholar
  29. Engler D, Ashcraft K (2003) RacerX: effective, static detection of race conditions and deadlocks. SIGOPS Oper Syst Rev 37(5):237–252. doi: 10.1145/1165389.945468 CrossRefGoogle Scholar
  30. Faghri F, Bazarbayev S, Overholt M, Farivar R, Campbell RH, Sanders WH (2012) Failure scenario as a service (FSaaS) for Hadoop clusters. In: Proceedings of the Workshop on Secure and Dependable Middleware for Cloud Monitoring and Management, ACM, New York, NY, USA, SDMCMM ’12, pp 5:1–5:6Google Scholar
  31. Farooq U, Welicki L, Zirkler D (2010) API usability peer reviews: a method for evaluating the usability of application programming interfaces. In: Proceedings of the 28th international conference on Human factors in computing systems, ACM, New York, NY, USA, CHI ’10, pp 2327–2336Google Scholar
  32. Felt AP, Chin E, Hanna S, Song D, Wagner D (2011) Android permissions demystified. In: Proceedings of the 18th ACM conference on Computer and communications security, ACM, New York, NY, USA, CCS ’11, pp 627–638Google Scholar
  33. Fraboulet A, Kodary K, Mignotte A (2001) Loop fusion for memory space optimization. In: Proceedings of the 14th international symposium on Systems synthesis, ACM, New York, NY, USA, ISSS ’01, pp 95–100Google Scholar
  34. Ganapathi A, Patterson D (2005) Crash data collection: a Windows case study. In: Proceedings of the 2005 International Conference on Dependable Systems and Networks, IEEE Computer Society, Washington, DC, USA, DSN ’05, pp 280–285Google Scholar
  35. Ganapathi A, Ganapathi V, Patterson DA (2006) Windows XP kernel crash analysis. In: LISA, vol 6, pp 49–159Google Scholar
  36. Gavalas D, Economou D (2011) Development platforms for mobile applications: status and trends. IEEE Softw 28 (1):77–86. doi:  10.1109/MS.2010.155 CrossRefGoogle Scholar
  37. Gerken J, Jetter HC, Zöllner M, Mader M, Reiterer H (2011) The concept maps method as a tool to evaluate the usability of APIs. In: Proceedings of the 2011 annual conference on Human factors in computing systems CHI ’11. ACM, New York, pp 3373–3382Google Scholar
  38. Gray J (1986) Why do computers stop and what can be done about it? In: Symposium on reliability in distributed software and database systems, Los Angeles, CA, USA, pp 3–12Google Scholar
  39. Gross KC, Bhardwaj V, Bickford R (2002) Proactive detection of software aging mechanisms in performance critical computers. In: Proceedings of the 27th Annual NASA Goddard Software Engineering Workshop (SEW-27’02). IEEE Computer Society, Washington, pp 17–23Google Scholar
  40. Gross KC, Urmanov A, Votta LG, McMaster S, Porter A (2006) Towards dependability in everyday software using software telemetry. In: Proceedings of the Third IEEE International Workshop on Engineering of Autonomic & Autonomous Systems, EASE ’06. IEEE Computer Society, Washington, pp 9–18CrossRefGoogle Scholar
  41. Guo P, Zimmermann T, Nagappan N, Murphy B (2010) Characterizing and predicting which bugs get fixed: an empirical study of Microsoft Windows. In: ACM/IEEE 32nd International Conference on Software Engineering, vol 1, pp 495–504. doi: 10.1145/1806799.1806871
  42. Havelund K, Pressburger T (2000) Model checking Java programs using Java PathFinder. Int J Softw Tools Technol Transfer 2:366–381. doi: 10.1007/s100090050043 CrossRefzbMATHGoogle Scholar
  43. Havelund K, Roşu G (2004) An overview of the runtime verification tool Java PathExplorer. Form Methods Syst Des 24(2):189–215. doi:  10.1023/B:FORM.0000017721.39909.4b CrossRefzbMATHGoogle Scholar
  44. Henning M (2009) API design matters. Commun ACM 52(5):46–56. doi: 10.1145/1506409.1506424 CrossRefGoogle Scholar
  45. Hovemeyer D, Pugh W (2004) Finding bugs is easy. SIGPLAN Not 39(12):92–106. doi: 10.1145/1052883.1052895 CrossRefGoogle Scholar
  46. Johnson P M, Kou H, Paulding M, Zhang Q, Kagawa A, Yamashita T (2005) Improving software development management through software project telemetry. IEEE Softw 22(4):76–85CrossRefGoogle Scholar
  47. Jula H, Tralamazza D, Zamfir C, Candea G (2008) Deadlock immunity: enabling systems to defend against deadlocks. In: Proceedings of the 8th USENIX conference on Operating systems design and implementation, USENIX Association, Berkeley, CA, USA, OSDI’08, pp 295–308. http://dl.acm.org/citation.cfm?id=1855741.1855762
  48. Jula H, Rensch T, Candea G (2011) Platform-wide deadlock immunity for mobile phones. In: IEEE/IFIP 41st International Conference on Dependable Systems and Networks Workshops (DSN-W), pp 205–210. doi: 10.1109/DSNW.2011.5958814
  49. Kähkönen K, Launiainen T, Saarikivi O, Kauttio J, Heljanko K, Niemelä I (2011) LCT: an open source concolic testing tool for Java programs. In: Proceedings of the 6th Workshop on Bytecode Semantics, Verification, Analysis and Transformation (BYTECODE’2011), Saarbrücken, Germany, pp 75–80Google Scholar
  50. Kawrykow D, Robillard M (2009) Detecting inefficient API usage. In: 31st International Conference on Software Engineering - Companion (ICSE-Companion 2009), pp 183–186 doi: 10.1109/ICSE-COMPANION.2009.5070977
  51. Kim D, Wang X, Kim S, Zeller A, Cheung S, Park S (2011a) Which crashes should I fix first?: Predicting top crashes at an early stage to prioritize debugging efforts. IEEE Trans Softw Eng 37(3):430–447. doi: 10.1109/TSE.2011.20 CrossRefGoogle Scholar
  52. Kim H, Lee M, Han W, Lee K, Shin I (2011b) Aciom: application characteristics-aware disk and network I/O management on Android platform. In: Proceedings of the ninth ACM international conference on Embedded software EMSOFT ’11. ACM, New York, pp 49–58CrossRefGoogle Scholar
  53. Kim H, Agrawal N, Ungureanu C (2012) Revisiting storage for smartphones. ACM Trans on Storage 8(4):14:1–14:25. doi:  10.1145/2385603.2385607 CrossRefGoogle Scholar
  54. Kim K (2006) A non-blocking buffer mechanism for real-time event message communication. Real-Time Systems 32:197–211. doi:  10.1007/s11241-005-4680-7 CrossRefzbMATHGoogle Scholar
  55. Kim S, Zimmermann T, Nagappan N (2011c) Crash graphs: an aggregated view of multiple crashes to improve crash triage. In: Proceedings of the 2011 IEEE/IFIP 41st International Conference on Dependable Systems & Networks DSN ’11. IEEE Computer Society, Washington, pp 486–493Google Scholar
  56. Knuth DE (1989) The Errors of TeX. Software: Practice and Experience 19(7):607–685. doi: 10.1002/spe.4380190702 zbMATHGoogle Scholar
  57. Lee I, Iyer R (1995) Software dependability in the tandem guardian system. IEEE Trans Softw Eng 21(5):455–467. doi: 10.1109/32.387474 CrossRefGoogle Scholar
  58. Li Z, Tan L, Wang X, Lu S, Zhou Y, Zhai C (2006) Have things changed now? An empirical study of bug characteristics in modern open source software. In: Proceedings of the 1st workshop on Architectural and system support for improving software dependability, ACM, New York, NY, USA, ASID ’06, pp 25–33Google Scholar
  59. Liblit B, Aiken A (2002) Building a better backtrace: techniques for postmortem program analysis. Tech. rep., BerkeleyGoogle Scholar
  60. Linares-Vásquez M, Bavota G, Bernal-Cárdenas C, Di Penta M, Oliveto R, Poshyvanyk D (2013) API change and fault proneness: a threat to the success of Android apps. In: Proceedings of the 2013 9th Joint Meeting on Foundations of Software Engineering ESEC/FSE 2013. ACM, New York, pp 477–487. doi: 10.1145/2491411.2491428
  61. Long B, Hoffman D, Strooper P (2003) Tool support for testing concurrent Java components. IEEE Trans Softw Eng 29(6):555–566. doi: 10.1109/TSE.2003.1205182 CrossRefGoogle Scholar
  62. Maalej W, Robillard MP (2013) Patterns of knowledge in API reference documentation. IEEE Trans Softw Eng 99 (PrePrints):1. doi: 10.1109/TSE.2013.12 Google Scholar
  63. Maia C, Nogueira LM, Pinho LM (2010) Evaluating Android OS for embedded real-time systems. In: Petters SM, Zijlstra P (eds) 6th International Workshop on Operating Systems Platforms for Embedded Real-Time Applications (OSPERT 2010), Politécnico do Porto, pp 63–70Google Scholar
  64. Maji AK, Hao K, Sultana S, Bagchi S (2010) Characterizing failures in mobile OSes: a case study with Android and Symbian. In: Proceedings of the 2010 IEEE 21st International Symposium on Software Reliability Engineering ISSRE ’10. IEEE Computer Society, Washington, pp 249–258Google Scholar
  65. Mandelin D, Xu L, Bodík R, Kimelman D (2005) Jungloid mining: helping to navigate the API jungle. SIGPLAN Not 40(6):48–61. doi: 10.1145/1064978.1065018 CrossRefGoogle Scholar
  66. McKinley KS, Carr S, Tseng CW (1996) Improving data locality with loop transformations. ACM Trans Program Lang Syst 18(4):424–453. doi: 10.1145/233561.233564 CrossRefGoogle Scholar
  67. Meijer E, Beckman B, Bierman G (2006) LINQ: reconciling object, relations and XML in the NET framework. In: Proceedings of the 2006 ACM SIGMOD international conference on Management of data SIGMOD ’06. ACM, New York, pp 706–706. doi: 10.1145/1142473.1142552
  68. Mernik M, Heering J, Sloane AM (2005) When and how to develop domain-specific languages. ACM Comput Surv 37(4):316–344. doi: 10.1145/1118890.1118892 CrossRefGoogle Scholar
  69. van der Merwe H, van der Merwe B, Visse W (2012) Verifying Android applications using Java PathFinder. SIGSOFT Softw Eng Notes 37(6):1–5. doi: 10.1145/2382756.2382797 CrossRefGoogle Scholar
  70. Michael MM, Scott ML (1996) Simple, fast, and practical non-blocking and blocking concurrent queue algorithms. In: Proceedings of the fifteenth annual ACM symposium on Principles of distributed computing PODC ’96. ACM, New York, pp 267–275. doi: 10.1145/248052.248106 CrossRefGoogle Scholar
  71. Ongtang M, Butler K, McDaniel P (2010) Porscha: policy oriented secure content handling in Android. In: Proceedings of the 26th Annual Computer Security Applications Conference ACSAC ’10. ACM, New York, pp 221–230. doi: 10.1145/1920261.1920295 CrossRefGoogle Scholar
  72. Panda PR, Catthoor F, Dutt ND, Danckaert K, Brockmeyer E, Kulkarni C, Vandercappelle A, Kjeldsberg PG (2001) Data and memory optimization techniques for embedded systems. ACM Trans Des Autom Electron Syst 6(2):149–206. doi: 10.1145/375977.375978 CrossRefGoogle Scholar
  73. Payet T, Spoto F (2012) Static analysis of Android programs. Inf Softw Technol 54(11):1192–1201. doi: 10.1016/j.infsof.2012.05.003 CrossRefGoogle Scholar
  74. Pheatt C (2008) Intel threading building blocks. J Comput Sci Coll 23(4):298–298. http://dl.acm.org/citation.cfm?id=1352079.1352134 Google Scholar
  75. Ploski J, Rohr M, Schwenkenberg P, Hasselbring W (2007) Research issues in software fault categorization. ACM SIGSOFT Softw Eng Notes 32(6). doi: 10.1145/1317471.1317478
  76. Podgurski A, Leon D, Francis P, Masri W, Minch M, Sun J, Wang B (2003) Automated support for classifying software failure reports. In: Proceedings of the 25th International Conference on Software Engineering 2003. IEEE Computer Society, Washington, pp 465–475. doi: 10.1109/ICSE.2003.1201224 CrossRefGoogle Scholar
  77. Robillard M, DeLine R (2011) A field study of API learning obstacles. Empir Softw Eng 16(6):703–732. doi: 10.1007/s10664-010-9150-8 CrossRefGoogle Scholar
  78. Robillard M, Bodden E, Kawrykow D, Mezini M, Ratchford T (2013) Automated API property inference techniques. IEEE Trans Softw Eng 39(5):613–637. doi: 10.1109/TSE.2012.63 CrossRefGoogle Scholar
  79. Robillard MP (2009) What makes APIs hard to learn? Answers from developers. IEEE Softw 26(6):27–34. doi: 10.1109/MS.2009.193 CrossRefGoogle Scholar
  80. Schoeberl M (2004) Restrictions of Java for embedded real-time systems. In: Proceedings of the Seventh IEEE International Symposium on Object-Oriented Real-Time Distributed Computing, 2004, pp 93–100. doi: 10.1109/ISORC.2004.1300334
  81. Sen K, Agha G (2006) CUTE and jCUTE: concolic unit testing and explicit path model-checking tools In: CAV. Springer, pp 419–423Google Scholar
  82. Seo J, Choi B, Yang S (2011) A profiling method by PCB hooking and its application for memory fault detection in embedded system operational test. Inf Softw Technol 53(1):106–119. doi: 10.1016/j.infsof.2010.09.003 CrossRefGoogle Scholar
  83. Shabtai A, Fledel Y, Kanonov U, Elovici Y, Dolev S, Glezer C (2010) Google Android: a comprehensive security assessment. IEEE Security Privacy 8(2):35–44. doi: 10.1109/MSP.2010.2 CrossRefGoogle Scholar
  84. Shabtai A, Kanonov U, Elovici Y, Glezer C, Weiss Y (2012) “Andromaly”: a behavioral malware detection framework for Android devices. J Intell Inf Syst 38(1):161–190. doi: 10.1007/s10844-010-0148-x CrossRefGoogle Scholar
  85. Shelton C, Koopman P, Devale K (2000) Robustness testing of the Microsoft Win32 API. In: Proceedings of the International Conference on Dependable Systems and Networks. DSN 2000, pp 261–270  10.1109/ICDSN.2000.857548
  86. Shi L, Zhong H, Xie T, Li M (2011) An empirical study on evolution of API documentation. In: Giannakopoulou D, Orejas F (eds) Fundamental Approaches to Software Engineering, Lecture Notes in Computer Science, vol 6603. Springer, Berlin, pp 416–431. doi: 10.1007/978-3-642-19811-3%5F29 Google Scholar
  87. Shihab E, Kamei Y, Bhattacharya P (2012) Mining challenge 2012: The Android platform. In: The 9th Working Conference on Mining Software RepositoriesGoogle Scholar
  88. de Souza C, Bentolila D (2009) Automatic evaluation of API usability using complexity metrics and visualizations. In: 31st International Conference on Software Engineering - Companion, (ICSE-Companion 2009), pp 299–302. doi: 10.1109/ICSE-COMPANION.2009.5071006
  89. Sproull R, Waldo J (2014) The API performance contract. Queue 12(1):10:10–10:20. doi: 10.1145/2576966.2576968  10.1145/2576966.2576968 CrossRefGoogle Scholar
  90. Stylos J (2009) Making APIs More Usable with Improved API Designs, Documentation and Tools. Carnegie Mellon University. http://books.google.co.uk/books?id=MQYoWv0nsy8C
  91. Stylos J, Clarke S (2007) Usability implications of requiring parameters in objects’ constructors. In: Proceedings of the 29th international conference on Software Engineering ICSE ’07. IEEE Computer Society, Washington, pp 529–539>. doi: 10.1109/ICSE.2007.92 Google Scholar
  92. Stylos J, Myers BA (2008) The implications of method placement on API learnability. In: Proceedings of the 16th ACM SIGSOFT International Symposium on Foundations of software engineering SIGSOFT ’08/FSE-16. ACM, New York, pp 105–112. doi: 10.1145/1453101.1453117 CrossRefGoogle Scholar
  93. Sullivan M, Chillarege R (1991) Software defects and their impact on system availability—a study of field failures in operating systems. In: 21st International Symposium Fault-Tolerant Computing, FTCS-21. Digest of Papers, p 29. doi: 10.1109/FTCS.1991.146625
  94. Tan L, Liu C, Li Z, Wang X, Zhou Y, Zhai C (2013) Bug characteristics in open source software. Empirical Software Engineering pp 1–41Google Scholar
  95. Tulach J (2012) Practical API Design: Confessions of a Java Framework Architect. Apressus Series, Apress. http://books.google.co.uk/books?id=5DmYpwAACAAJ
  96. Vallina-Rodriguez N, Crowcroft J (2013) Energy management techniques in modern mobile handsets. IEEE Communications Surveys Tutorials 15(1):179–198. doi: 10.1109/SURV.2012.021312.00045 CrossRefGoogle Scholar
  97. Valois J D (1995) Lock-free linked lists using compare-and-swap. In: Proceedings of the fourteenth annual ACM symposium on Principles of distributed computing PODC ’95. ACM, New York, pp 214–222. doi: 10.1145/224964.224988
  98. Vaughan-Nichols SJ (2001) Technology news. Computer 34(12):22–24. doi: 10.1109/2.970549 CrossRefGoogle Scholar
  99. Xie T, Pei J (2006) MAPO: mining API usages from open source repositories. In: Proceedings of the 2006 international workshop on Mining software repositories MSR ’06. ACM, New York, pp 54–57CrossRefGoogle Scholar
  100. Yang L, Dick R P, Lekatsas H, Chakradhar S (2010) Online memory compression for embedded systems. ACM Trans Embed Comput Syst 9(3):27:1–27:30. doi: 10.1145/1698772.1698785 CrossRefGoogle Scholar
  101. Yang T, Hertz M, Berger ED, Kaplan SF, Moss JEB (2004) Automatic heap sizing: taking real memory into account. In: Proceedings of the 4th international symposium on Memory management ISMM ’04. ACM, New York, pp 61–72. doi: 10.1145/1029873.1029881 Google Scholar

Copyright information

© Springer Science+Business Media New York 2014

Authors and Affiliations

  • Maria Kechagia
    • 1
  • Dimitris Mitropoulos
    • 1
  • Diomidis Spinellis
    • 1
  1. 1.Department of Management Science and TechnologyAthens University of Economics and BusinessAthensGreece

Personalised recommendations