Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
5 test_scan_fn_loops.csv
20 test_scan_functions.csv
5 test_scan_input_tys.csv
17 test_scan_overall.csv
19 test_scan_overall.csv
3 test_scan_recursion.csv
9 test_scan_unsafe_distance.csv
6 test_scan_unsafe_ops.csv
Expand Down
27 changes: 27 additions & 0 deletions tools/scanner/src/analysis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ use crate::info;
use csv::WriterBuilder;
use graph_cycles::Cycles;
use petgraph::graph::Graph;
use rustc_middle::ty::TyCtxt;
use rustc_smir::rustc_internal;
use serde::{Serialize, Serializer, ser::SerializeStruct};
use stable_mir::mir::mono::Instance;
use stable_mir::mir::visit::{Location, PlaceContext, PlaceRef};
Expand Down Expand Up @@ -36,6 +38,7 @@ struct FnStats {
has_unsafe_ops: Option<bool>,
has_unsupported_input: Option<bool>,
has_loop_or_iterator: Option<bool>,
is_public: Option<bool>,
}

impl FnStats {
Expand All @@ -46,6 +49,7 @@ impl FnStats {
has_unsafe_ops: None,
has_unsupported_input: None,
has_loop_or_iterator: None,
is_public: None,
}
}
}
Expand Down Expand Up @@ -235,6 +239,29 @@ impl OverallStats {
.collect::<Vec<_>>(),
);
}

/// Iterate over all functions defined in this crate and log public vs private
pub fn public_fns(&mut self, tcx: &TyCtxt) {
let all_items = stable_mir::all_local_items();
let (public_fns, private_fns) = all_items
.into_iter()
.filter_map(|item| {
let kind = item.ty().kind();
if !kind.is_fn() {
return None;
};
let int_def_id = rustc_internal::internal(*tcx, item.def_id());
let is_public = tcx.visibility(int_def_id).is_public()
|| tcx.visibility(int_def_id).is_visible_locally();
self.fn_stats.get_mut(&item).unwrap().is_public = Some(is_public);
Some((item, is_public))
})
.partition::<Vec<(CrateItem, bool)>, _>(|(_, is_public)| *is_public);
self.counters.extend_from_slice(&[
("public_fns", public_fns.len()),
("private_fns", private_fns.len()),
]);
}
}

macro_rules! fn_props {
Expand Down
3 changes: 3 additions & 0 deletions tools/scanner/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ pub enum Analysis {
Recursion,
/// Collect information about transitive usage of unsafe.
UnsafeDistance,
/// Collect information about function visibility.
PublicFns,
}

fn info(msg: String) {
Expand Down Expand Up @@ -103,6 +105,7 @@ fn analyze_crate(tcx: TyCtxt, analyses: &[Analysis]) -> ControlFlow<()> {
Analysis::FnLoops => crate_stats.loops(out_path),
Analysis::Recursion => crate_stats.recursion(out_path),
Analysis::UnsafeDistance => crate_stats.unsafe_distance(out_path),
Analysis::PublicFns => crate_stats.public_fns(&tcx),
}
}
crate_stats.store_csv(base_path, &file_stem);
Expand Down
Loading