{"status":"ok","message-type":"work","message-version":"1.0.0","message":{"indexed":{"date-parts":[[2026,6,19]],"date-time":"2026-06-19T17:11:54Z","timestamp":1781889114311,"version":"3.54.5"},"reference-count":57,"publisher":"Springer Science and Business Media LLC","issue":"3","license":[{"start":{"date-parts":[[2020,3,7]],"date-time":"2020-03-07T00:00:00Z","timestamp":1583539200000},"content-version":"tdm","delay-in-days":0,"URL":"https:\/\/creativecommons.org\/licenses\/by\/4.0"},{"start":{"date-parts":[[2020,3,7]],"date-time":"2020-03-07T00:00:00Z","timestamp":1583539200000},"content-version":"vor","delay-in-days":0,"URL":"https:\/\/creativecommons.org\/licenses\/by\/4.0"}],"content-domain":{"domain":["link.springer.com"],"crossmark-restriction":false},"short-container-title":["Empir Software Eng"],"published-print":{"date-parts":[[2020,5]]},"abstract":"<jats:title>Abstract<\/jats:title><jats:p>Finding and fixing buggy code is an important and cost-intensive maintenance task, and static analysis (SA) is one of the methods developers use to perform it. SA tools warn developers about potential bugs by scanning their source code for commonly occurring bug patterns, thus giving those developers opportunities to fix the warnings (potential bugs) before they release the software. Typically, SA tools scan for general bug patterns that are common to any software project (such as null pointer dereference), and not for project specific patterns. However, past research has pointed to this lack of customizability as a severe limiting issue in SA. Accordingly, in this paper, we propose an approach called , which is based on statically analyzing changes across the development history of a project, as a means to identify project-specific bug patterns. Furthermore, the bug patterns identified by our tool do not relate to just one developer or one specific commit, they reflect the project as a whole and compliment the warnings from other SA tools that identify general bug patterns. Herein, we report on the application of our implemented tool and approach to four Java projects: , , , and . The results obtained show that our tool could detect 19 project specific bug patterns across those four projects. Next, through manual analysis, we determined that six of those change patterns were actual bugs and submitted pull requests based on those bug patterns. As a result, five of the pull requests were merged.<\/jats:p>","DOI":"10.1007\/s10664-020-09807-w","type":"journal-article","created":{"date-parts":[[2020,3,7]],"date-time":"2020-03-07T06:02:58Z","timestamp":1583560978000},"page":"1951-1979","update-policy":"https:\/\/doi.org\/10.1007\/springer_crossmark_policy","source":"Crossref","is-referenced-by-count":12,"title":["Ammonia: an approach for deriving project-specific bug patterns"],"prefix":"10.1007","volume":"25","author":[{"ORCID":"https:\/\/orcid.org\/0000-0002-8278-8975","authenticated-orcid":false,"given":"Yoshiki","family":"Higo","sequence":"first","affiliation":[],"role":[{"vocabulary":"crossref","role":"author"}]},{"given":"Shinpei","family":"Hayashi","sequence":"additional","affiliation":[],"role":[{"vocabulary":"crossref","role":"author"}]},{"given":"Hideaki","family":"Hata","sequence":"additional","affiliation":[],"role":[{"vocabulary":"crossref","role":"author"}]},{"given":"Meiyappan","family":"Nagappan","sequence":"additional","affiliation":[],"role":[{"vocabulary":"crossref","role":"author"}]}],"member":"297","published-online":{"date-parts":[[2020,3,7]]},"reference":[{"key":"9807_CR1","doi-asserted-by":"crossref","unstructured":"Avgustinov P, Baars AI, Henriksen AS, Lavender G, Menzel G, de Moor O, Sch\u00e4fer M, Tibble J (2015) Tracking static analysis violations over time to capture developer characteristics. In: Proceedings of the 37th International Conference on Software Engineering, vol 1, pp 437\u2013447","DOI":"10.1109\/ICSE.2015.62"},{"key":"9807_CR2","doi-asserted-by":"crossref","unstructured":"Ayewah N, Pugh W (2010) The Google FindBugs fixit. In: Proceedings of the 19th International Symposium on Software Testing and Analysis, pp 241\u2013252","DOI":"10.1145\/1831708.1831738"},{"key":"9807_CR3","doi-asserted-by":"crossref","unstructured":"Barr ET, Brun Y, Devanbu P, Harman M, Sarro F (2014) The plastic surgery hypothesis. In: Proceedings of the 22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering, pp 306\u2013317","DOI":"10.1145\/2635868.2635898"},{"key":"9807_CR4","doi-asserted-by":"crossref","unstructured":"Carlson B, Leach K, Marinov D, Nagappan M, Prakash A (2019) Open source vulnerability notification. In: Open Source Systems, Springer International Publishing, pp 12\u201323","DOI":"10.1007\/978-3-030-20883-7_2"},{"key":"9807_CR5","unstructured":"Clang Static Analyzer. http:\/\/clang-analyzer.llvm.org\/, 2016. [Online; accessed 1-February-2016]"},{"key":"9807_CR6","unstructured":"Cppcheck. http:\/\/cppcheck.sourceforge.net\/, 2016. [Online; accessed 2-February-2016]"},{"key":"9807_CR7","doi-asserted-by":"crossref","unstructured":"Dang Y, Zhang D, Ge S, Chu C, Qiu Y, Xie T (2012) Xiao: Tuning code clones at hands of engineers in practice. In: Proceedings of the 28th Annual Computer Security Applications Conference, pp 369\u2013378","DOI":"10.1145\/2420950.2421004"},{"key":"9807_CR8","unstructured":"Falleri J-R, Morandat F, Blanc X, Martinez M, Monperrus M (2014) Fine-grained and accurate source code differencing. In: Proceedings of the 29th ACM\/IEEE International Conference on Automated Software Engineering, pp 313\u2013324"},{"key":"9807_CR9","unstructured":"FindBugs. http:\/\/findbugs.sourceforge.net\/, 2015. [Online; accessed 2-February-2016]"},{"key":"9807_CR10","doi-asserted-by":"crossref","unstructured":"Fluri B, Giger E, Gall HC (2008) Discovering patterns of change types. In: Proceedings of the 23rd IEEE\/ACM International Conference on Automated Software Engineering, pp 463\u2013466","DOI":"10.1109\/ASE.2008.74"},{"issue":"11","key":"9807_CR11","doi-asserted-by":"publisher","first-page":"725","DOI":"10.1109\/TSE.2007.70731","volume":"33","author":"B Fluri","year":"2007","unstructured":"Fluri B, Wuersch M, PInzger M, Gall H (2007) Change distilling: tree differencing for fine-grained source code change extraction. IEEE Trans Softw Eng 33 (11):725\u2013743","journal-title":"IEEE Trans Softw Eng"},{"issue":"12","key":"9807_CR12","doi-asserted-by":"publisher","first-page":"1236","DOI":"10.1109\/TSE.2015.2454513","volume":"41","author":"CL Goues","year":"2015","unstructured":"Goues CL, Holtschulte N, Smith EK, Brun Y, Devanbu P, Forrest S, Weimer W (2015) The ManyBugs and IntroClass benchmarks for automated repair of C programs. IEEE Trans Softw Eng 41(12):1236\u20131256","journal-title":"IEEE Trans Softw Eng"},{"issue":"6","key":"9807_CR13","doi-asserted-by":"publisher","first-page":"1276","DOI":"10.1109\/TSE.2011.103","volume":"38","author":"T Hall","year":"2012","unstructured":"Hall T, Beecham S, Bowes D, Gray D, Counsell S (2012) A systematic literature review on fault prediction performance in software engineering. IEEE Trans Softw Eng 38(6):1276\u20131304","journal-title":"IEEE Trans Softw Eng"},{"key":"9807_CR14","doi-asserted-by":"crossref","unstructured":"Hanam Q, Brito FSdM, Mesbah A (2016) Discovering bug patterns in JavaScript. In: Proceedings of the 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering, pp 144\u2013156","DOI":"10.1145\/2950290.2950308"},{"key":"9807_CR15","doi-asserted-by":"crossref","unstructured":"Higo Y, Kusumoto S (2012) How often do unintended inconsistencies happen? Deriving modification patterns and detecting overlooked code fragments. In: Proceedings of the 28th IEEE International Conference on Software Maintenance, pp 222\u2013231","DOI":"10.1109\/ICSM.2012.6405275"},{"key":"9807_CR16","unstructured":"Hoare T (2009) Null references: The billion dollar mistake. In: QCOn Conference"},{"key":"9807_CR17","unstructured":"Inexpensive Program Analysis Group at University of Virginia, Department of Computer Science. Splint \u2013 Secure Programming Lint. http:\/\/www.splint.org\/, 2010. [Online; accessed 2-February-2016]"},{"key":"9807_CR18","doi-asserted-by":"crossref","unstructured":"Inoue K, Higo Y, Yoshida N, Choi E, Kusumoto S, Kim K, Park W, Lee E (2012) Experience of finding inconsistently-changed bugs in code clones of mobile software. In: Proceedings of the 6th International Workshop on Software Clones, pp 94\u201395","DOI":"10.1109\/IWSC.2012.6227882"},{"key":"9807_CR19","doi-asserted-by":"crossref","unstructured":"Johnson B, Song Y, Murphy-Hill E, Bowdidge R (2013) Why don\u2019t software developers use static analysis tools to find bugs? In: Proceedings of the 35th International Conference on Software Engineering, pp 672\u2013681","DOI":"10.1109\/ICSE.2013.6606613"},{"key":"9807_CR20","doi-asserted-by":"crossref","unstructured":"Kagdi H, Yusuf S, Maletic JI (2006) Mining sequences of changed-files from version histories. In: Proceedings of the 3th International Workshop on Mining Software Repositories, pp 47\u201353","DOI":"10.1145\/1137983.1137996"},{"key":"9807_CR21","doi-asserted-by":"crossref","unstructured":"Ke Y, Stolee KT, Goues CL, Brun Y (2015) Repairing programs with semantic code search (t). In: Proceedings of the 30th IEEE\/ACM International Conference on Automated Software Engineering, pp 295\u2013306","DOI":"10.1109\/ASE.2015.60"},{"issue":"3","key":"9807_CR22","doi-asserted-by":"publisher","first-page":"430","DOI":"10.1109\/TSE.2011.20","volume":"37","author":"D Kim","year":"2011","unstructured":"Kim D, Wang X, Kim S, Zeller A, Cheung SC, Park S (2011) Which crashes should I fix first?: Predicting top crashes at an early stage to prioritize debugging efforts. IEEE Trans Softw Eng 37(3):430\u2013447","journal-title":"IEEE Trans Softw Eng"},{"key":"9807_CR23","doi-asserted-by":"crossref","unstructured":"Kim M, Notkin D (2009) Discovering and representing systematic code changes. In: Proceedings of the 31st International Conference on Software Engineering, pp 309\u2013319","DOI":"10.1109\/ICSE.2009.5070531"},{"key":"9807_CR24","doi-asserted-by":"crossref","unstructured":"Kim S, Pan K, Whitehead EEJ Jr (2006) Memories of bug fixes. In: Proceedings of the 14th ACM SIGSOFT International Symposium on Foundations of Software Engineering, pp 35\u201345","DOI":"10.1145\/1181775.1181781"},{"key":"9807_CR25","unstructured":"Kim S, Pan K, Whitehead EJ Jr (2005) When functions change their names: Automatic detection of origin relationships. In: Proceedings of the 12th Working Conference on Reverse Engineering, pp 143\u2013152"},{"issue":"1","key":"9807_CR26","doi-asserted-by":"publisher","first-page":"54","DOI":"10.1109\/TSE.2011.104","volume":"38","author":"C Le Goues","year":"2012","unstructured":"Le Goues C, Nguyen T, Forrest S, Weimer W (2012) GenProg: A generic method for automatic software repair. IEEE Trans Softw Eng 38(1):54\u201372","journal-title":"IEEE Trans Softw Eng"},{"issue":"3","key":"9807_CR27","doi-asserted-by":"publisher","first-page":"176","DOI":"10.1109\/TSE.2006.28","volume":"32","author":"Z Li","year":"2006","unstructured":"Li Z, Lu S, Myagmar S, Zhou Y (2006) CP-Miner: Finding copy-paste and related bugs in large-scale software code. IEEE Trans Softw Eng 32(3):176\u2013192","journal-title":"IEEE Trans Softw Eng"},{"key":"9807_CR28","doi-asserted-by":"crossref","unstructured":"Li Z, Zhou Y (2005) PR-Miner: Automatically extracting implicit programming rules and detecting violations in large software code. In: Proceedings of the 10th European Software Engineering Conference Held Jointly with 13th ACM SIGSOFT International Symposium on Foundations of Software Engineering, pp 306\u2013315","DOI":"10.1145\/1081706.1081755"},{"key":"9807_CR29","doi-asserted-by":"crossref","unstructured":"Liang B, Bian P, Zhang Y, Shi W, You W, Cai Y (2016) AntMiner: Mining more bugs by reducing noise interference. In: Proceedings of the 38th International Conference on Software Engineering, pp 333\u2013344","DOI":"10.1145\/2884781.2884870"},{"key":"9807_CR30","doi-asserted-by":"crossref","unstructured":"Liang G, Wang Q, Xie T, Mei H (2013) Inferring project-specific bug patterns for detecting sibling bugs. In: Proceedings of the 9th Joint Meeting on Foundations of Software Engineering, pp 565\u2013575","DOI":"10.1145\/2491411.2491422"},{"key":"9807_CR31","doi-asserted-by":"publisher","unstructured":"Liu K, Kim D, Bissyand\u00e8 TF, Yoo S, Traon YL (2018) Mining fix patterns for FindBugs violations. IEEE Transactions on Software Engineering. https:\/\/doi.org\/10.1109\/TSE.2018.2884955","DOI":"10.1109\/TSE.2018.2884955"},{"key":"9807_CR32","doi-asserted-by":"crossref","unstructured":"Livshits B, Zimmermann T (2005) DynaMine: Finding common error patterns by mining software revision histories. In: Proceedings of the 10th European Software Engineering Conference Held Jointly with 13th ACM SIGSOFT International Symposium on Foundations of Software Engineering, pp 296\u2013305","DOI":"10.1145\/1081706.1081754"},{"key":"9807_CR33","doi-asserted-by":"crossref","unstructured":"Loh A, Kim M (2010) LSdiff: A program differencing tool to identify systematic structural differences. In: Proceedings of the 32nd ACM\/IEEE International Conference on Software Engineering, vol 2, pp 263\u2013266","DOI":"10.1145\/1810295.1810348"},{"key":"9807_CR34","doi-asserted-by":"crossref","unstructured":"Long F, Rinard M (2015) Staged program repair with condition synthesis. In: Proceedings of the 10th Joint Meeting on Foundations of Software Engineering, pp 166\u2013178","DOI":"10.1145\/2786805.2786811"},{"key":"9807_CR35","doi-asserted-by":"crossref","unstructured":"Mahouachi R, Kessentini M, Cinn\u00e9ide M\u00d3 (2013) Search-based refactoring detection. In: Proceedings of the 15th Annual Conference Companion on Genetic and Evolutionary Computation, pp 205\u2013206","DOI":"10.1145\/2464576.2464680"},{"key":"9807_CR36","doi-asserted-by":"crossref","unstructured":"Mechtaev S, Yi J, Roychoudhury A (2016) Angelix: Scalable multiline program patch synthesis via symbolic analysis. In: Proceedings of the 38th International Conference on Software Engineering, pp 691\u2013701","DOI":"10.1145\/2884781.2884807"},{"key":"9807_CR37","doi-asserted-by":"crossref","unstructured":"Meng N, Kim M, McKinley KS (2011) Sydit: Creating and applying a program transformation from an example. In: Proceedings of the 19th ACM SIGSOFT Symposium and the 13th European Conference on Foundations of Software Engineering, pp 440\u2013443","DOI":"10.1145\/2025113.2025185"},{"key":"9807_CR38","doi-asserted-by":"crossref","unstructured":"Meng N, Kim M, McKinley KS (2013) LASE: Locating and applying systematic edits by learning from examples. In: Proceedings of the 35th International Conference on Software Engineering, pp 502\u2013511","DOI":"10.1109\/ICSE.2013.6606596"},{"key":"9807_CR39","doi-asserted-by":"crossref","unstructured":"Murakami H, Hotta K, Higo Y, Igaki H, Kusumoto S (2013) Gapped code clone detection with lightweight source code analysis. In: Proceedings of the 21st International Conference on Program Comprehension, pp 93\u2013102","DOI":"10.1109\/ICPC.2013.6613837"},{"key":"9807_CR40","doi-asserted-by":"crossref","unstructured":"Nguyen HDT, Qi D, Roychoudhury A, Chandra S (2013) SemFix: Program repair via semantic analysis. In: Proceedings of the 35th International Conference on Software Engineering, pp 772\u2013781","DOI":"10.1109\/ICSE.2013.6606623"},{"key":"9807_CR41","doi-asserted-by":"crossref","unstructured":"Nguyen TT, Nguyen HA, Pham NH, Al-Kofahi J, Nguyen TN (2010) Recurring bug fixes in object-oriented programs. In: Proceedings of the 32nd ACM\/IEEE International Conference on Software Engineering, vol 1, pp 315\u2013324","DOI":"10.1145\/1806799.1806847"},{"key":"9807_CR42","unstructured":"PMD. https:\/\/pmd.github.io\/, 2015. [Online; accessed 2-February-2016]"},{"key":"9807_CR43","doi-asserted-by":"crossref","unstructured":"Prete K, Rachatasumrit N, Sudan N, Kim M (2010) Template-based reconstruction of complex refactorings. In: Proceedings of the 26th IEEE International Conference on Software Maintenance, pp 1\u201310","DOI":"10.1109\/ICSM.2010.5609577"},{"key":"9807_CR44","doi-asserted-by":"crossref","unstructured":"Rahman F, Khatri S, Barr ET, Devanbu P (2014) Comparing static bug finders and statistical prediction. In: Proceedings of the 36th International Conference on Software Engineering, pp 424\u2013434","DOI":"10.1145\/2568225.2568269"},{"key":"9807_CR45","doi-asserted-by":"crossref","unstructured":"Ray B, Kim M, Person S, Rungta N (2013) Detecting and characterizing semantic inconsistencies in ported code. In: Proceedings of the 28th IEEE\/ACM International Conference on Automated Software Engineering, pp 367\u2013377","DOI":"10.1109\/ASE.2013.6693095"},{"key":"9807_CR46","doi-asserted-by":"crossref","unstructured":"Ray B, Nagappan M, Bird C, Nagappan N, Zimmermann T (2015) The uniqueness of changes: Characteristics and applications. In: Proceedings of the 12th Working Conference on Mining Software Repositories, pp 34\u201344","DOI":"10.1109\/MSR.2015.11"},{"key":"9807_CR47","doi-asserted-by":"crossref","unstructured":"Rigby PC, German DM, Storey M-A (2008) Open source software peer review practices: A case study of the Apache server. in: Proceedings of the 30th International Conference on Software Engineering, pp 541\u2013550","DOI":"10.1145\/1368088.1368162"},{"key":"9807_CR48","unstructured":"Roy CK, Cordy JR (2008) NICAD: Accurate detection of near-miss intentional clones using flexible pretty-printing and code normalization. In: Proceedings of the 16th IEEE International Conference on Program Comprehension, pp 172\u2013181"},{"key":"9807_CR49","doi-asserted-by":"crossref","unstructured":"Sadowski C, van Gogh J, Jaspan C, S\u00f6derberg E, Winter C (2015) Tricorder: Building a program analysis ecosystem. In: Proceedings of the 37th International Conference on Software Engineering, vol 1, pp 598\u2013608","DOI":"10.1109\/ICSE.2015.76"},{"issue":"1","key":"9807_CR50","doi-asserted-by":"publisher","first-page":"1","DOI":"10.1007\/s10664-013-9274-8","volume":"20","author":"W Shang","year":"2015","unstructured":"Shang W, Nagappan M, Hassan AE (2015) Studying the relationship between logging characteristics and the code quality of platform software. Empir Softw Eng 20 (1):1\u201327","journal-title":"Empir Softw Eng"},{"key":"9807_CR51","doi-asserted-by":"crossref","unstructured":"Wohlin C, Runeson P, Hst M, Ohlsson MC, Regnell B, Wessln A (2012) Experimentation in software engineering. Springer Publishing Company, Incorporated","DOI":"10.1007\/978-3-642-29044-2"},{"issue":"8","key":"9807_CR52","doi-asserted-by":"publisher","first-page":"707","DOI":"10.1109\/TSE.2016.2521368","volume":"42","author":"WE Wong","year":"2016","unstructured":"Wong WE, Gao R, Li Y, Abreu R, Wotawa F (2016) A survey on software fault localization. IEEE Trans Softw Eng 42(8):707\u2013740","journal-title":"IEEE Trans Softw Eng"},{"key":"9807_CR53","unstructured":"Xie T (2016) Software testing research survey bibliography. http:\/\/taoxie.cs.illinois.edu\/testingresearchsurvey.htm, 2016. [Online; accessed 12-October-2016]"},{"key":"9807_CR54","doi-asserted-by":"crossref","unstructured":"Xing Z, Stroulia E (2006) Refactoring detection based on UMLDiff change-facts queries. In: Proceedings of the 13th Working Conference on Reverse Engineering, pp 263\u2013274","DOI":"10.1109\/WCRE.2006.48"},{"issue":"2","key":"9807_CR55","doi-asserted-by":"publisher","first-page":"87","DOI":"10.1109\/MSP.2009.56","volume":"7","author":"M Zhivich","year":"2009","unstructured":"Zhivich M, Cunningham RK (2009) The real cost of software errors. IEEE Secur Priv 7(2):87\u201390","journal-title":"IEEE Secur Priv"},{"key":"9807_CR56","doi-asserted-by":"crossref","unstructured":"Zhong H, Xie T, Zhang L, Pei J, Mei H (2009) MAPO: Mining and recommending API usage patterns. In: Proceedings of the 23rd European Conference on Object-Oriented Programming, pp 318\u2013343","DOI":"10.1007\/978-3-642-03013-0_15"},{"issue":"6","key":"9807_CR57","doi-asserted-by":"publisher","first-page":"429","DOI":"10.1109\/TSE.2005.72","volume":"31","author":"T Zimmermann","year":"2005","unstructured":"Zimmermann T, Weissgerber P, Diehl S, Zeller A (2005) Mining version histories to guide software changes. IEEE Trans Softw Eng 31(6):429\u2013445","journal-title":"IEEE Trans Softw Eng"}],"container-title":["Empirical Software Engineering"],"original-title":[],"language":"en","link":[{"URL":"http:\/\/link.springer.com\/content\/pdf\/10.1007\/s10664-020-09807-w.pdf","content-type":"application\/pdf","content-version":"vor","intended-application":"text-mining"},{"URL":"http:\/\/link.springer.com\/article\/10.1007\/s10664-020-09807-w\/fulltext.html","content-type":"text\/html","content-version":"vor","intended-application":"text-mining"},{"URL":"http:\/\/link.springer.com\/content\/pdf\/10.1007\/s10664-020-09807-w.pdf","content-type":"application\/pdf","content-version":"vor","intended-application":"similarity-checking"}],"deposited":{"date-parts":[[2021,3,7]],"date-time":"2021-03-07T01:01:22Z","timestamp":1615078882000},"score":1,"resource":{"primary":{"URL":"http:\/\/link.springer.com\/10.1007\/s10664-020-09807-w"}},"subtitle":[],"short-title":[],"issued":{"date-parts":[[2020,3,7]]},"references-count":57,"journal-issue":{"issue":"3","published-print":{"date-parts":[[2020,5]]}},"alternative-id":["9807"],"URL":"https:\/\/doi.org\/10.1007\/s10664-020-09807-w","relation":{},"ISSN":["1382-3256","1573-7616"],"issn-type":[{"value":"1382-3256","type":"print"},{"value":"1573-7616","type":"electronic"}],"subject":[],"published":{"date-parts":[[2020,3,7]]},"assertion":[{"value":"7 March 2020","order":1,"name":"first_online","label":"First Online","group":{"name":"ArticleHistory","label":"Article History"}}]}}