Skip to content
Snippets Groups Projects
Select Git revision
  • 9fd1a1942f76e1c376ac561f295fe5dfc9c2bb0a
  • master default protected
2 results

Cargo.toml

Blame
  • This project manages its dependencies using Cargo. Learn more
    seer.rs 2.56 KiB
    extern crate seer;
    extern crate env_logger;
    extern crate log_settings;
    extern crate log;
    
    const SEER_HELP: &str = r#"Attempts to find all possible execution paths in a program.
    
    Usage:
        seer <opts>
    
    The options are passed to rustc.
    "#;
    
    
    fn show_help() {
        println!("{}", SEER_HELP);
    }
    
    fn show_version() {
        println!("{}", env!("CARGO_PKG_VERSION"));
    }
    
    fn init_logger() {
        use std::io::Write;
        let format = |formatter: &mut env_logger::fmt::Formatter, record: &log::Record| {
            if record.level() == log::Level::Trace {
                // prepend spaces to indent the final string
                let indentation = log_settings::settings().indentation;
                writeln!(
                    formatter,
                    "{lvl}:{module}:{indent:<indentation$} {text}",
                    lvl = record.level(),
                    module = record.module_path().unwrap_or("<unknown module>"),
                    indentation = indentation,
                    indent = "",
                    text = record.args(),
                )
            } else {
                writeln!(
                    formatter,
                    "{lvl}:{module}: {text}",
                    lvl = record.level(),
                    module = record.module_path().unwrap_or("<unknown module>"),
                    text = record.args(),
                )
            }
        };
    
        let mut builder = env_logger::Builder::new();
        builder.format(format).filter(None, log::LevelFilter::Info);
    
        if std::env::var("MIRI_LOG").is_ok() {
            builder.parse(&std::env::var("MIRI_LOG").unwrap());
        }
    
        builder.init();
    }
    
    fn main() {
        let mut args: Vec<String> = ::std::env::args().collect();
    
        if args.iter().any(|a| a == "--version" || a == "-V") {
            show_version();
            return;
        }
    
        if args.iter().any(|a| a == "--help" || a == "-h") {
            show_help();
            return;
        }
    
        init_logger();
        let consumer = |complete: ::seer::ExecutionComplete | {
            println!("{:?}", complete);
            println!("as string: {:?}", ::std::str::from_utf8(&complete.input));
            if let Err(_) = complete.result {
                println!("hit an error. halting");
                false
            } else {
                true
            }
        };
    
        let mut config = ::seer::ExecutionConfig::new();
    
        let mut emit_error_idx = None;
        for (idx, arg) in args.iter().enumerate() {
            if arg == "--emit-error" {
                emit_error_idx = Some(idx);
                break;
            }
        }
        if let Some(idx) = emit_error_idx {
            config.emit_error(true);
            args.remove(idx);
        } else {
            config.consumer(consumer);
        }
    
        config.run(args);
    }