Multi-file project analysis.
Builds graphs for all source files in a project, links cross-module call edges, and applies external function summaries for dependencies.
Examples
# Analyze a full Mix project
project = Reach.Project.from_mix_project()
# Analyze specific paths
project = Reach.Project.from_glob("lib/**/*.ex")
# Query across the whole project
Reach.Project.taint_analysis(project,
sources: [type: :call, function: :params],
sinks: [type: :call, module: System, function: :cmd]
)
Summary
Functions
Builds a project graph from a glob pattern.
Builds a project graph from the current Mix project.
Builds a project graph from source file paths.
Computes a function summary for a compiled dependency module.
Runs taint analysis across the entire project.
Types
@type t() :: %Reach.Project{ call_graph: Graph.t(), graph: Graph.t(), modules: %{required(module()) => map()}, nodes: %{required(Reach.IR.Node.id()) => Reach.IR.Node.t()}, plugins: [module()], summaries: %{required({module(), atom(), non_neg_integer()}) => map()} }
Functions
Builds a project graph from a glob pattern.
Builds a project graph from the current Mix project.
Uses Mix.Project.config() to discover source paths via :elixirc_paths
and :erlc_paths. Umbrella children are included automatically.
Builds a project graph from source file paths.
@spec summarize_dependency(module()) :: %{ required({module(), atom(), non_neg_integer()}) => map() }
Computes a function summary for a compiled dependency module.
Returns a map of {module, function, arity} => %{param_index => flows_to_return?}.
These summaries can be passed as the :summaries option to from_sources/2.
Runs taint analysis across the entire project.
Same interface as Reach.taint_analysis/2 but searches all modules.