๐Ÿ“ฆ qarmin / Automated-Fuzzer

๐Ÿ“„ main.rs ยท 81 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81#![allow(clippy::upper_case_acronyms)]
#![allow(clippy::borrowed_box)]
#![allow(clippy::too_many_arguments)]
#![allow(clippy::format_push_string)]

use std::fs;
use std::path::Path;
use std::sync::RwLock;

use log::info;

use crate::common::{TIMEOUT_SECS, calculate_number_of_files, check_files_number};
use crate::finding_different_output::find_broken_files_by_different_output;
use crate::finding_text_status::find_broken_files_by_text_status;
use crate::obj::USE_ASAN_ENVS;
use crate::settings::{StabilityMode, get_object, load_settings};

pub mod apps;
mod broken_files;
mod common;
mod finding_different_output;
mod finding_text_status;
mod obj;
mod remove_non_crashing_files;
mod settings;

fn main() {
    USE_ASAN_ENVS.set(RwLock::new(false));

    handsome_logger::init().unwrap();

    let first_arg: u64 = std::env::args()
        .nth(1)
        .map_or(999_999_999_999_999, |x| x.parse().unwrap());
    info!("Timeout set to {first_arg} seconds");
    TIMEOUT_SECS.set(first_arg).unwrap();

    // rayon::ThreadPoolBuilder::new()
    //     .num_threads(8)
    //     .build_global()
    //     .unwrap();

    let settings = load_settings();

    // info!("{settings:#?}");

    let mut obj = get_object(settings.clone());

    obj.init();

    let _ = fs::create_dir_all(&settings.temp_folder);
    let _ = fs::create_dir_all(&settings.broken_files_dir);
    let _ = fs::create_dir_all(&settings.custom_folder_path);

    if settings.remove_non_crashing_items_from_broken_files {
        info!("RUNNING REMOVE NON CRASHING FILES");
        remove_non_crashing_files::remove_non_crashing_files(&settings, &obj);
        return;
    }

    check_files_number("Valid input dir", &settings.valid_input_files_dir);
    check_files_number("Broken files dir", &settings.broken_files_dir);
    check_files_number(
        "Temp possible broken files dir", &settings.temp_possible_broken_files_dir,
    );

    assert!(Path::new(&settings.valid_input_files_dir).exists());
    assert!(Path::new(&settings.broken_files_dir).exists());

    info!(
        "Found {} files in valid input dir",
        calculate_number_of_files(&settings.valid_input_files_dir)
    );

    if settings.check_for_stability && obj.get_stability_mode() != StabilityMode::None {
        find_broken_files_by_different_output(&settings, &obj);
    } else {
        find_broken_files_by_text_status(&settings, &obj);
    }
}