checker/src/lib.rs (65 lines of code) (raw):
// Copyright (c) Facebook, Inc. and its affiliates.
//
// This source code is licensed under the MIT license found in the
// LICENSE file in the root directory of this source tree.
//
// In an ideal world there would be a stable well documented set of crates containing a specific
// version of the Rust compiler along with its sources and debug information. We'd then just get
// those from crates.io and merely go on our way as just another Rust application. Rust compiler
// upgrades will be non events for Mirai until it is ready to jump to another release and old
// versions of Mirai will continue to work just as before.
//
// In the current world, however, we have to use the following hacky feature to get access to a
// private and not very stable set of APIs from whatever compiler is in the path when we run Mirai.
// While pretty bad, it is a lot less bad than having to write our own compiler, so here goes.
#![feature(rustc_private)]
#![feature(box_patterns)]
#![feature(box_syntax)]
#![feature(core_intrinsics)]
#![allow(clippy::mutable_key_type)]
extern crate rustc_data_structures;
extern crate rustc_driver;
extern crate rustc_errors;
extern crate rustc_hir;
extern crate rustc_index;
extern crate rustc_interface;
extern crate rustc_middle;
extern crate rustc_session;
extern crate rustc_span;
extern crate rustc_target;
#[macro_use]
extern crate log;
/// If the currently analyzed function has been marked as angelic because was discovered
/// to do something that cannot be analyzed, or if the time taken to analyze the current
/// function exceeded options.max_analysis_time_for_body, break out of the current loop.
/// When a timeout happens, currently analyzed function is marked as angelic.
macro_rules! check_for_early_break {
($sel:expr) => {
if $sel.analysis_is_incomplete {
break;
}
let elapsed_time_in_seconds = $sel.start_instant.elapsed().as_secs();
if elapsed_time_in_seconds >= $sel.cv.options.max_analysis_time_for_body {
$sel.analysis_is_incomplete = true;
break;
}
};
}
/// If the currently analyzed function has been marked as angelic because was discovered
/// to do something that cannot be analyzed, or if the time taken to analyze the current
/// function exceeded options.max_analysis_time_for_body, return to the caller.
/// When a timeout happens, currently analyzed function is marked as angelic.
macro_rules! check_for_early_return {
($sel:expr) => {
if $sel.analysis_is_incomplete {
return;
}
let elapsed_time_in_seconds = $sel.start_instant.elapsed().as_secs();
if elapsed_time_in_seconds >= $sel.cv.options.max_analysis_time_for_body {
$sel.analysis_is_incomplete = true;
return;
}
};
}
pub mod abstract_value;
pub mod block_visitor;
pub mod body_visitor;
pub mod bool_domain;
pub mod call_graph;
pub mod call_visitor;
pub mod callbacks;
pub mod constant_domain;
pub mod crate_visitor;
pub mod environment;
pub mod expected_errors;
pub mod expression;
pub mod fixed_point_visitor;
pub mod interval_domain;
pub mod k_limits;
pub mod known_names;
pub mod options;
pub mod path;
pub mod smt_solver;
pub mod summaries;
pub mod tag_domain;
pub mod type_visitor;
pub mod utils;
pub mod z3_solver;