circomspect_program_analysis/
lib.rs

1use analysis_context::AnalysisContext;
2
3use program_structure::cfg::Cfg;
4use program_structure::report::ReportCollection;
5
6extern crate num_bigint_dig as num_bigint;
7
8pub mod constraint_analysis;
9pub mod taint_analysis;
10pub mod analysis_context;
11pub mod analysis_runner;
12pub mod config;
13
14// Intra-process analysis passes.
15mod bitwise_complement;
16mod bn254_specific_circuit;
17mod constant_conditional;
18mod definition_complexity;
19mod field_arithmetic;
20mod field_comparisons;
21mod nonstrict_binary_conversion;
22mod under_constrained_signals;
23mod unconstrained_less_than;
24mod unconstrained_division;
25mod side_effect_analysis;
26mod signal_assignments;
27
28// Inter-process analysis passes.
29mod unused_output_signal;
30
31/// An analysis pass is a function which takes an analysis context and a CFG and
32/// returns a set of reports.
33type AnalysisPass = dyn Fn(&mut dyn AnalysisContext, &Cfg) -> ReportCollection;
34
35pub fn get_analysis_passes() -> Vec<Box<AnalysisPass>> {
36    vec![
37        // Intra-process analysis passes.
38        Box::new(|_, cfg| bitwise_complement::find_bitwise_complement(cfg)),
39        Box::new(|_, cfg| signal_assignments::find_signal_assignments(cfg)),
40        Box::new(|_, cfg| definition_complexity::run_complexity_analysis(cfg)),
41        Box::new(|_, cfg| side_effect_analysis::run_side_effect_analysis(cfg)),
42        Box::new(|_, cfg| field_arithmetic::find_field_element_arithmetic(cfg)),
43        Box::new(|_, cfg| field_comparisons::find_field_element_comparisons(cfg)),
44        Box::new(|_, cfg| unconstrained_division::find_unconstrained_division(cfg)),
45        Box::new(|_, cfg| bn254_specific_circuit::find_bn254_specific_circuits(cfg)),
46        Box::new(|_, cfg| unconstrained_less_than::find_unconstrained_less_than(cfg)),
47        Box::new(|_, cfg| constant_conditional::find_constant_conditional_statement(cfg)),
48        Box::new(|_, cfg| under_constrained_signals::find_under_constrained_signals(cfg)),
49        Box::new(|_, cfg| nonstrict_binary_conversion::find_nonstrict_binary_conversion(cfg)),
50        // Inter-process analysis passes.
51        Box::new(unused_output_signal::find_unused_output_signals),
52    ]
53}