Common LISP: the language (2nd ed.)
Common LISP: the language (2nd ed.)
The C programming language
PLDI '93 Proceedings of the ACM SIGPLAN 1993 conference on Programming language design and implementation
C, a reference manual (4th ed.)
C, a reference manual (4th ed.)
The design and evolution of C++
The design and evolution of C++
LCLint: a tool for using specifications to check code
SIGSOFT '94 Proceedings of the 2nd ACM SIGSOFT symposium on Foundations of software engineering
An empirical study of static call graph extractors
Proceedings of the 18th international conference on Software engineering
Program generalization for software reuse: from C to C++
SIGSOFT '96 Proceedings of the 4th ACM SIGSOFT symposium on Foundations of software engineering
On the inference of configuration structures from source code
ICSE '94 Proceedings of the 16th international conference on Software engineering
Revised5 report on the algorithmic language scheme
ACM SIGPLAN Notices
Using version control data to evaluate the impact of software tools
Proceedings of the 21st international conference on Software engineering
LFP '86 Proceedings of the 1986 ACM conference on LISP and functional programming
A framework for preprocessor-aware C source code analyses
Software—Practice & Experience
GNU EMACS Manual
Designing and Coding Reusable C++
Designing and Coding Reusable C++
The Art of the Metaobject Protocol
The Art of the Metaobject Protocol
Object-Oriented Programming; An Evolutionary Approach
Object-Oriented Programming; An Evolutionary Approach
A Framework for Source Code Search Using Program Patterns
IEEE Transactions on Software Engineering
Preprocessors from an Abstract Point of View
ICSM '96 Proceedings of the 1996 International Conference on Software Maintenance
Using Partial Evaluation in Support of Portability, Reusability, and Maintainability
CC '96 Proceedings of the 6th International Conference on Compiler Construction
Fast, Flexible Syntactic Pattern Matching and Processing
WPC '96 Proceedings of the 4th International Workshop on Program Comprehension (WPC '96)
Global Analysis and Transformations in Preprocessed Languages
IEEE Transactions on Software Engineering
Beyond templates: a study of clones in the STL and some general implications
Proceedings of the 27th international conference on Software engineering
ASTEC: a new approach to refactoring C
Proceedings of the 10th European software engineering conference held jointly with 13th ACM SIGSOFT international symposium on Foundations of software engineering
Compile-time meta-programming in a dynamically typed OO language
DLS '05 Proceedings of the 2005 symposium on Dynamic languages
CViMe: viewing conditionally compiled C/C++ sources through Java
Companion to the 21st ACM SIGPLAN symposium on Object-oriented programming systems, languages, and applications
Modular information hiding and type-safe linking for C
TLDI '07 Proceedings of the 2007 ACM SIGPLAN international workshop on Types in languages design and implementation
C-CLR: a tool for navigating highly configurable system software
Proceedings of the 6th workshop on Aspects, components, and patterns for infrastructure software
Surrendering to the need for speed while maintaining visibility in adverse code conditions
Proceedings of the 3rd workshop on Linking aspect technology and evolution
Rapidly implementing languages to compile as C++ without crafting a compiler
Software—Practice & Experience
On the feasibility of an AOSD approach to Linux kernel extensions
Proceedings of the 2008 AOSD workshop on Aspects, components, and patterns for infrastructure software
Aspect mining in the presence of the C preprocessor
Proceedings of the 2008 AOSD workshop on Linking aspect technology and evolution
Can we refactor conditional compilation into aspects?
Proceedings of the 8th ACM international conference on Aspect-oriented software development
On reconciling patches and aspects
Proceedings of the 8th workshop on Aspects, components, and patterns for infrastructure software
Combining preprocessor slicing with C/C++ language slicing
Science of Computer Programming
Generating Rewritable Abstract Syntax Trees
Software Language Engineering
Parsing C/C++ Code without Pre-processing
CC '09 Proceedings of the 18th International Conference on Compiler Construction: Held as Part of the Joint European Conferences on Theory and Practice of Software, ETAPS 2009
C preprocessor use in numerical tools: an empirical analysis
Proceedings of the 47th Annual Southeast Regional Conference
Optimizing header file include directives
Journal of Software Maintenance and Evolution: Research and Practice
A model of refactoring physically and virtually separated features
GPCE '09 Proceedings of the eighth international conference on Generative programming and component engineering
CScout: A refactoring browser for C
Science of Computer Programming
An analysis of the variability in forty preprocessor-based software product lines
Proceedings of the 32nd ACM/IEEE International Conference on Software Engineering - Volume 1
Analysis of preprocessor constructs in Erlang
Proceedings of the 9th ACM SIGPLAN workshop on Erlang
A language for software variation research
GPCE '10 Proceedings of the ninth international conference on Generative programming and component engineering
Partial preprocessing C code for variability analysis
Proceedings of the 5th Workshop on Variability Modeling of Software-Intensive Systems
Analyzing the discipline of preprocessor annotations in 30 million lines of C code
Proceedings of the tenth international conference on Aspect-oriented software development
On the impact of feature dependencies when maintaining preprocessor-based software product lines
Proceedings of the 10th ACM international conference on Generative programming and component engineering
Variability-aware parsing in the presence of lexical macros and conditional compilation
Proceedings of the 2011 ACM international conference on Object oriented programming systems languages and applications
The Choice Calculus: A Representation for Software Variation
ACM Transactions on Software Engineering and Methodology (TOSEM)
Streams that compose using macros that oblige
PEPM '12 Proceedings of the ACM SIGPLAN 2012 workshop on Partial evaluation and program manipulation
Intraprocedural dataflow analysis for software product lines
Proceedings of the 11th annual international conference on Aspect-oriented Software Development
Type checking annotation-based product lines
ACM Transactions on Software Engineering and Methodology (TOSEM)
SuperC: parsing all of C by taming the preprocessor
Proceedings of the 33rd ACM SIGPLAN conference on Programming Language Design and Implementation
Marco: safe, expressive macros for any language
ECOOP'12 Proceedings of the 26th European conference on Object-Oriented Programming
mbeddr: an extensible C-based programming language and IDE for embedded systems
Proceedings of the 3rd annual conference on Systems, programming, and applications: software for humanity
An empirical study of PHP feature usage: a static analysis perspective
Proceedings of the 2013 International Symposium on Software Testing and Analysis
Coevolution of variability models and related artifacts: a case study from the Linux kernel
Proceedings of the 17th International Software Product Line Conference
Do background colors improve program comprehension in the #ifdef hell?
Empirical Software Engineering
Does the discipline of preprocessor annotations matter?: a controlled experiment
Proceedings of the 12th international conference on Generative programming: concepts & experiences
Investigating preprocessor-based syntax errors
Proceedings of the 12th international conference on Generative programming: concepts & experiences
Intraprocedural dataflow analysis for software product lines
Transactions on Aspect-Oriented Software Development X
Hi-index | 0.00 |
This is the first empirical study of the use of the C macro preprocessor, Cpp. To determine how the preprocessor is used in practice, this paper analyzes 26 packages comprising 1.4 million lines of publicly available C code. We determine the incidence of C preprocessor usage驴whether in macro definitions, macro uses, or dependences upon macros驴that is complex, potentially problematic, or inexpressible in terms of other C or C++ language features. We taxonomize these various aspects of preprocessor use and particularly note data that are material to the development of tools for C or C++, including translating from C to C++ to reduce preprocessor usage. Our results show that, while most Cpp usage follows fairly simple patterns, an effective program analysis tool must address the preprocessor. The intimate connection between the C programming language and Cpp, and Cpp's unstructured transformations of token streams often hinder both programmer understanding of C programs and tools built to engineer C programs, such as compilers, debuggers, call graph extractors, and translators. Most tools make no attempt to analyze macro usage, but simply preprocess their input, which results in a number of negative consequences; an analysis that takes Cpp into account is preferable, but building such tools requires an understanding of actual usage. Differences between the semantics of Cpp and those of C can lead to subtle bugs stemming from the use of the preprocessor, but there are no previous reports of the prevalence of such errors. Use of C++ can reduce some preprocessor usage, but such usage has not been previously measured. Our data and analyses shed light on these issues and others related to practical understanding or manipulation of real C programs. The results are of interest to language designers, tool writers, programmers, and software engineers.