ParameterSummary — Parameter Effect Summary Analysis

Parameter effect summaries capture per-function side effects on function parameters, enabling downstream analyses to reason about interprocedural effects without re-analyzing callees.

Headers: include/Analysis/ParameterSummary/

Implementation: lib/Analysis/ParameterSummary/

Public API: - lotus::analysis::parametersummary::computeParameterEffectSummaries

— compute summaries for all functions in a module

Overview

For each function in a module, the analysis produces a ParameterEffectSummary that records three kinds of side-effect information:

  • paramFreed — whether a parameter is freed (or released / unlocked) inside the function or its callees

  • paramDereferenced — whether a parameter’s pointee is loaded from or stored to

  • returnIsAllocated — whether the return value is a freshly allocated object (from an allocator function)

Resource Table

The analysis uses a ResourceTable that maps known function names to their resource-management roles:

Allocator       — malloc, calloc, realloc, operator new, ...
Deallocator     — free, operator delete, ...
Acquire/Release — pthread_mutex_lock / pthread_mutex_unlock, ...
Dereference     — memcpy, memset, strlen, ...

The table is populated from a built-in database of standard library and POSIX functions, and can be extended via module-level annotation specs.

Transitive Composition

When the call graph has a topological ordering (no recursion), summaries are composed transitively: if a function calls a callee that frees one of its parameters, the caller’s corresponding argument is also marked as freed. This transitive propagation continues through the call chain.

Usage

#include "Analysis/ParameterSummary/ParameterEffectSummary.h"

llvm::Module &M = ...;
auto summaries = lotus::analysis::parametersummary::
    computeParameterEffectSummaries(M);

for (const auto &[func, summary] : summaries) {
  if (summary.returnIsAllocated)
    errs() << func->getName() << " returns allocated memory\n";
}