Skip to main content

McCabe++ (mcpp): cyclomatic complexity and other vulnerability-related code metrics

Project description

McCabe++ (mcpp)

mcpp measures typical code complexity metrics like McCabe's cyclomatic complexity.

The goal of this project is to provide a re-usable script to analyze C/C++ source code and extract complexity metrics from it. The implemented metrics are taken from the paper

LEOPARD: Identifying Vulnerable Code for Vulnerability Assessment through Program Metrics

This tool is released as part of our research in vulnerability discovery and has been used in our paper

SoK: Where to Fuzz? Assessing Target Selection Methods in Directed Fuzzing"

See also the corresponding repo.

Complexity Metrics

Dimension ID Metric Description
CD1: Function C1 cyclomatic complexity
CD2: Loop Structures C2 number of loops
C3 number of nested loops
C4 maximum nesting level of loops

Vulnerability Metrics

Dimension ID Metric Description
VD1: Dependency V1 number of parameter variables
V2 number of variables as parameters for callee function
VD2: Pointers V3 number of pointer arithmetic
V4 number of variables involved in pointer arithmetic
V5 maximum number of pointer arithmetic operations a variable is involved in
VD3: Control Structures V6 number of nested control structures
V7 maximum nesting level of control structures
V8 maximum number of control-dependent control structures
V9 maximum number of data-dependent control structures
V10 number of if structures without else
V11 number of variables involved in control predicates

Additional Metrics

Dimension ID Metric Description
XD: Extra x1 number of return statements
x2 number of cast expressions
x3 number of variable declarations
x4 maximum number of operands in an expression
TD: AST Structure t1 number of AST nodes (descendants)
t2 height of the AST
t3 average branching factor of the AST
SD: Code Smells s1 number of non-trivial numeric constants (magic numbers)
s2 number of goto statements
s3 number of function pointers
s4 number of function calls without return value usage
MD: Memory Ops m1 number of memory allocations (malloc, alloc, new, etc.)
m2 number of pointer dereferences (*, [], ->)

Setup

Build a docker container which performs the setup automatically or run the installation on your local machine:

pip install .

Note: It is recommended to install packages in virtual environments.

Usage

From Python

Simply import mcpp and then use the extract function (or one of its variants).

from pathlib import Path
from mcpp import extract

input_dir = Path("some/dir")
in_files = list(input_dir.glob("**/*.c"))
result = extract(in_files)

# to extract only a subset of the metrics
result = extract(in_files, ["V1", "C3"])

# full list of metrics:
from mcpp import METRICS
print(list(METRICS.keys()))

CLI

Configuration parameters can be changed in config.yaml or directly on the CLI with e.g. mcpp paths.out_root=some/dir.

Using all defaults:

mcpp                # with default params like input directory, see config.yaml

Changing params from command line:

mcpp in_path=/some/dir/single_source out_path=single_source_metrics.json
mcpp metrics=\[C1,C2,V4\]

Or by passing a changed config.yaml:

  • -cp (config_path) specifies the absolute path to the directory where the config file is located
  • -cn (config_name) specifies the name of the config file
mcpp -cp /some/other/dir -cn myconfig.yaml

Try out the example:

mcpp in_path=examples/data/source paths.out_root=examples/data-out
cat examples/data-out/complexity.json

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcpp-1.3.4.tar.gz (14.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcpp-1.3.4-py3-none-any.whl (15.2 kB view details)

Uploaded Python 3

File details

Details for the file mcpp-1.3.4.tar.gz.

File metadata

  • Download URL: mcpp-1.3.4.tar.gz
  • Upload date:
  • Size: 14.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for mcpp-1.3.4.tar.gz
Algorithm Hash digest
SHA256 0c5d43372e7cd1f8624a85ec73d76573b1129b94312bd768c2c8a4ea93bc7489
MD5 3b716dffdea644612ef5b2fa8b85e917
BLAKE2b-256 8e4d9b11b7e88820c25226cdbfacbef89bdebaf584ca2f5f28453d7c06eb6894

See more details on using hashes here.

File details

Details for the file mcpp-1.3.4-py3-none-any.whl.

File metadata

  • Download URL: mcpp-1.3.4-py3-none-any.whl
  • Upload date:
  • Size: 15.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for mcpp-1.3.4-py3-none-any.whl
Algorithm Hash digest
SHA256 5280c89eef94be85292679b47769c7c4e4c84d55073c9d7ad782829f9df1e144
MD5 3f70d4ae9bf872fb1e0691c4cb8d3988
BLAKE2b-256 33b9b53bb91c698f87fb7f7d7c7835b62d205bfcc25bfd4eef16f96770096e09

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page