General Navigation Buttons - Home | Search | Contact Us | Site Map | Whats New
products graphic
Products and Services
Software Technology Review
What's New
Background & Overview
Technology Descriptions
Defining Software Technology
Technology Categories
Template for Technology Descriptions
Taxonomies
Glossary & Indexes
Feedback & Participation
Software Engineering Information Repository (SEIR)
About SEI|Mgt|Eng|Tech Adoption |Collaboration|Prod.& Services|Pubs
Rollover Popup Hints for Topic Navigation Buttons above
Cyclomatic Complexity


Status

Advanced

Note

We recommend reading Maintenance of Operational Systems--An Overview before reading this description; it offers a view of the life cycle of software from development through reengineering. We also recommend concurrent reading of Maintainability Index Technique for Measuring Program Maintainability, which illustrates a specific application of cyclomatic complexity to quantify the maintainability of software. These descriptions provide a framework for assessing the applicability of cyclomatic complexity and other technologies to a specific environment.

Purpose and Origin

Cyclomatic complexity is the most widely used member of a class of static software metrics. Cyclomatic complexity may be considered a broad measure of soundness and confidence for a program. Introduced by Thomas McCabe in 1976, it measures the number of linearly-independent paths through a program module. This measure provides a single ordinal number that can be compared to the complexity of other programs. Cyclomatic complexity is often referred to simply as program complexity, or as McCabe's complexity. It is often used in concert with other software metrics. As one of the more widely-accepted software metrics, it is intended to be independent of language and language format [McCabe 94].

Cyclomatic complexity has also been extended to encompass the design and structural complexity of a system [McCabe 89].

Technical Detail

The cyclomatic complexity of a software module is calculated from a connected graph of the module (that shows the topology of control flow within the program):

Cyclomatic complexity (CC) = E - N + p

where E = the number of edges of the graph

N = the number of nodes of the graph

p = the number of connected components

To actually count these elements requires establishing a counting convention (tools to count cyclomatic complexity contain these conventions). The complexity number is generally considered to provide a stronger measure of a program's structural complexity than is provided by counting lines of code. Figure 6 is a connected graph of a simple program with a cyclomatic complexity of seven. Nodes are the numbered locations, which correspond to logic branch points; edges are the lines between the nodes.

Figure 6: Connected Graph of a Simple Program

A large number of programs have been measured, and ranges of complexity have been established that help the software engineer determine a program's inherent risk and stability. The resulting calibrated measure can be used in development, maintenance, and reengineering situations to develop estimates of risk, cost, or program stability. Studies show a correlation between a program's cyclomatic complexity and its error frequency. A low cyclomatic complexity contributes to a program's understandability and indicates it is amenable to modification at lower risk than a more complex program. A module's cyclomatic complexity is also a strong indicator of its testability (see Test planning under Usage Considerations).

 

A common application of cyclomatic complexity is to compare it against a set of threshold values. One such threshold set is in Table 4:

Table 4: Cyclomatic Complexity

Cyclomatic Complexity

Risk Evaluation

1-10

a simple program, without much risk

11-20

more complex, moderate risk

21-50

complex, high risk program

greater than 50

untestable program (very high risk)

Usage Considerations

Cyclomatic complexity can be applied in several areas, including

 

  • Code development risk analysis. While code is under development, it can be measured for complexity to assess inherent risk or risk buildup.
  • Change risk analysis in maintenance. Code complexity tends to increase as it is maintained over time. By measuring the complexity before and after a proposed change, this buildup can be monitored and used to help decide how to minimize the risk of the change.
  • Test Planning. Mathematical analysis has shown that cyclomatic complexity gives the exact number of tests needed to test every decision point in a program for each outcome. Thus, the analysis can be used for test planning. An excessively complex module will require a prohibitive number of test steps; that number can be reduced to a practical size by breaking the module into smaller, less-complex sub-modules.
  • Reengineering. Cyclomatic complexity analysis provides knowledge of the structure of the operational code of a system. The risk involved in reengineering a piece of code is related to its complexity. Therefore, cost and risk analysis can benefit from proper application of such an analysis.

Cyclomatic complexity can be calculated manually for small program suites, but automated tools are preferable for most operational environments. For automated graphing and complexity calculation, the technology is language-sensitive; there must be a front-end source parser for each language, with variants for dialectic differences.

Cyclomatic complexity is usually only moderately sensitive to program change. Other measures (see Complementary Technologies) may be very sensitive. It is common to use several metrics together, either as checks against each other or as part of a calculation set (see Maintainability Index Technique for Measuring Program Maintainability).

Maturity

Cyclomatic complexity measurement, an established but evolving technology, was introduced in 1976. Since that time it has been applied to tens of millions of lines of code in both Department of Defense (DoD) and commercial applications. The resulting base of empirical knowledge has allowed software developers to calibrate measurements of their own software and arrive at some understanding of its complexity. Code graphing and complexity calculation tools are available as part (or as options) of several commercial software environments.

Costs and Limitations

Cyclomatic complexity measurement tools are typically bundled inside commercially-available CASE toolsets. It is usually one of several metrics offered. Application of complexity measurements requires a small amount of training. The fact that a code module has high cyclomatic complexity does not, by itself, mean that it represents excess risk, or that it can or should be redesigned to make it simpler; more must be known about the specific application.

Alternatives

Cyclomatic complexity is one measure of structural complexity. Other metrics bring out other facets of complexity, including both structural and computational complexity, as shown in Table 5.

Table 5: Other Facets of Complexity

Complexity Measurement

Primary Measure of

Halstead Complexity Measures

Algorithmic complexity, measured by counting operators and operands

Henry and Kafura metrics

Coupling between modules (parameters, global variables, calls)

Bowles metrics

Module and system complexity; coupling via parameters and global variables

Troy and Zweben metrics

Modularity or coupling; complexity of structure (maximum depth of structure chart); calls-to and called-by

Ligier metrics

Modularity of the structure chart

Marciniak offers a more complete description of complexity measures and the complexity factors they measure [Marciniak 94].

Complementary Technologies

The following three metrics are specialized measures that are used in specific situations:

 

  1. Essential complexity. This measures how much unstructured logic exists in a module (e.g., a loop with an exiting GOTO statement).
  2. The program in Figure 6 has no such unstructured logic, so its essential complexity value is one.
  3. Design complexity. This measures interaction between decision logic and subroutine or function calls.
  4. The program in Figure 6 has a design complexity value of 4, which is well within the range of desirability.
  5. Data complexity. This measures interaction between data references and decision logic.

Other metrics that are "related" to Cyclomatic complexity in general intent are also available in some CASE toolsets.

The metrics listed in Alternatives are also complementary; each metric highlights a different facet of the source code.

Index Categories

This technology is classified under the following categories. Select a category for a list of related topics.

Name of technology

Cyclomatic Complexity

Application category

Test (AP.1.4.3)
Reapply Software Lifecyle (AP.1.9.3)
Reverse Engineering (AP.1.9.4)
Reengineering (AP.1.9.5)

Quality measures category

Maintainability (QM.3.1)
Testability (QM.1.4.1)
Complexity (QM.3.2.1)
Structuredness (QM.3.2.3)

Computing reviews category

Software Engineering Metrics (D.2.8)
Complexity Classes (F.1.3)
Tradeoffs Among Complexity Measures (F.2.3)

References and Information Sources

[Marciniak 94]

Marciniak, John J., ed. Encyclopedia of Software Engineering, 131-165. New York, NY: John Wiley & Sons, 1994.

[McCabe 89]

McCabe, Thomas J. & Butler, Charles W. "Design Complexity Measurement and Testing." Communications of the ACM 32, 12 (December 1989): 1415-1425.

[McCabe 94]

McCabe, Thomas J. & Watson, Arthur H. "Software Complexity." Crosstalk, Journal of Defense Software Engineering 7, 12 (December 1994): 5-9.

[Perry 88]

Perry, William E. A Structured Approach to Systems Testing. Wellesley, MA: QED Information Sciences, 1988.

[Watson 96]

Watson, Arthur H. & McCabe, Thomas J. "Structured Testing: A Testing Methodology Using the Cyclomatic Complexity Metric." [online]. Available WWW,
<URL:
http://hissa.ncsl.nist.gov/HHRFdata/Artifacts/ITLdoc/235/mccabe.html> (1996).

Current Author/Maintainer

Edmond VanDoren, Kaman Sciences, Colorado Springs

Modifications

12 Jul 2000: Updated reference list

 

10 Jan 1997 (original)


The Software Engineering Institute (SEI) is a federally funded research and development center sponsored by the U.S. Department of Defense and operated by Carnegie Mellon University.

Copyright 2001 by Carnegie Mellon University
URL: http://www.sei.cmu.edu/str/descriptions/cyclomatic_body.html
Last Modified: 22 September 2000