Skip to content

Commit f0180ab

Browse files
authored
[libcasr] Refactor init_ignored_frames! macro (#162)
1 parent 2e21c12 commit f0180ab

File tree

10 files changed

+121
-94
lines changed

10 files changed

+121
-94
lines changed

casr/src/bin/casr-cluster.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use casr::util;
2-
use libcasr::constants::*;
3-
use libcasr::init_ignored_frames;
4-
use libcasr::stacktrace::*;
2+
use libcasr::{init_ignored_frames, stacktrace::*};
53

64
use anyhow::{bail, Context, Result};
75
use clap::{Arg, ArgAction};

casr/src/bin/casr-dojo.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
use casr::util;
2-
use libcasr::constants::*;
3-
use libcasr::init_ignored_frames;
4-
use libcasr::report::CrashReport;
5-
use libcasr::stacktrace::*;
2+
use libcasr::{init_ignored_frames, report::CrashReport, stacktrace::*};
63

74
use anyhow::{bail, Result};
85
use clap::error::{ContextKind, ContextValue, ErrorKind};

casr/src/bin/casr-gdb.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
use casr::util;
2-
use libcasr::constants::*;
3-
use libcasr::cpp::CppException;
4-
use libcasr::exception::Exception;
5-
use libcasr::gdb::exploitable::{GdbContext, MachineInfo};
6-
use libcasr::gdb::GdbStacktrace;
7-
use libcasr::init_ignored_frames;
8-
use libcasr::report::CrashReport;
9-
use libcasr::rust::RustPanic;
10-
use libcasr::severity::Severity;
11-
use libcasr::stacktrace::*;
2+
use libcasr::{
3+
cpp::CppException,
4+
exception::Exception,
5+
gdb::exploitable::{GdbContext, MachineInfo},
6+
gdb::GdbStacktrace,
7+
init_ignored_frames,
8+
report::CrashReport,
9+
rust::RustPanic,
10+
severity::Severity,
11+
stacktrace::*,
12+
};
1213

1314
use anyhow::{bail, Context, Result};
1415
use clap::{Arg, ArgAction, ArgGroup};

casr/src/bin/casr-java.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
use casr::util;
2-
use libcasr::constants::*;
3-
use libcasr::exception::Exception;
4-
use libcasr::init_ignored_frames;
5-
use libcasr::java::*;
6-
use libcasr::report::CrashReport;
7-
use libcasr::stacktrace::*;
2+
use libcasr::{
3+
exception::Exception, init_ignored_frames, java::*, report::CrashReport, stacktrace::*,
4+
};
85

96
use anyhow::{bail, Result};
107
use clap::{Arg, ArgAction, ArgGroup};

casr/src/bin/casr-python.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use casr::util;
2-
use libcasr::constants::*;
3-
use libcasr::exception::Exception;
4-
use libcasr::init_ignored_frames;
5-
use libcasr::python::{PythonException, PythonStacktrace};
6-
use libcasr::report::CrashReport;
7-
use libcasr::stacktrace::*;
2+
use libcasr::{
3+
exception::Exception,
4+
init_ignored_frames,
5+
python::{PythonException, PythonStacktrace},
6+
report::CrashReport,
7+
stacktrace::*,
8+
};
89

910
use anyhow::{bail, Result};
1011
use clap::{Arg, ArgAction, ArgGroup};

casr/src/bin/casr-san.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
use casr::util;
2-
use libcasr::asan::{AsanContext, AsanStacktrace};
3-
use libcasr::constants::*;
4-
use libcasr::cpp::CppException;
5-
use libcasr::exception::Exception;
6-
use libcasr::execution_class::*;
7-
use libcasr::gdb::*;
8-
use libcasr::go::*;
9-
use libcasr::init_ignored_frames;
10-
use libcasr::report::CrashReport;
11-
use libcasr::rust::{RustPanic, RustStacktrace};
12-
use libcasr::severity::Severity;
13-
use libcasr::stacktrace::*;
2+
use libcasr::{
3+
asan::{AsanContext, AsanStacktrace},
4+
constants::{
5+
SIGINFO_SIGABRT, SIGINFO_SIGBUS, SIGINFO_SIGILL, SIGINFO_SIGSEGV, SIGINFO_SIGSYS,
6+
SIGINFO_SIGTRAP,
7+
},
8+
cpp::CppException,
9+
exception::Exception,
10+
execution_class::*,
11+
gdb::*,
12+
go::*,
13+
init_ignored_frames,
14+
report::CrashReport,
15+
rust::{RustPanic, RustStacktrace},
16+
severity::Severity,
17+
stacktrace::*,
18+
};
1419

1520
use anyhow::{bail, Context, Result};
1621
use clap::{Arg, ArgAction, ArgGroup};

libcasr/fuzz/fuzz_targets/parse_stacktrace.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,12 @@ use libfuzzer_sys::fuzz_target;
44

55
use libcasr::{
66
asan::AsanStacktrace,
7-
constants::{
8-
STACK_FRAME_FILEPATH_IGNORE_REGEXES_CPP, STACK_FRAME_FILEPATH_IGNORE_REGEXES_GO,
9-
STACK_FRAME_FILEPATH_IGNORE_REGEXES_JAVA, STACK_FRAME_FILEPATH_IGNORE_REGEXES_PYTHON,
10-
STACK_FRAME_FILEPATH_IGNORE_REGEXES_RUST, STACK_FRAME_FUNCTION_IGNORE_REGEXES_CPP,
11-
STACK_FRAME_FUNCTION_IGNORE_REGEXES_GO, STACK_FRAME_FUNCTION_IGNORE_REGEXES_JAVA,
12-
STACK_FRAME_FUNCTION_IGNORE_REGEXES_PYTHON, STACK_FRAME_FUNCTION_IGNORE_REGEXES_RUST,
13-
},
147
gdb::GdbStacktrace,
158
go::GoStacktrace,
169
init_ignored_frames,
1710
java::JavaStacktrace,
1811
python::PythonStacktrace,
19-
stacktrace::{
20-
CrashLineExt, ParseStacktrace, STACK_FRAME_FILEPATH_IGNORE_REGEXES,
21-
STACK_FRAME_FUNCTION_IGNORE_REGEXES,
22-
},
12+
stacktrace::{CrashLineExt, Filter, ParseStacktrace, Stacktrace},
2313
};
2414

2515
fuzz_target!(|data: &[u8]| {

libcasr/src/rust.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,17 +108,8 @@ mod tests {
108108

109109
use super::*;
110110
use crate::{
111-
constants::{
112-
STACK_FRAME_FILEPATH_IGNORE_REGEXES_CPP, STACK_FRAME_FILEPATH_IGNORE_REGEXES_GO,
113-
STACK_FRAME_FILEPATH_IGNORE_REGEXES_JAVA, STACK_FRAME_FILEPATH_IGNORE_REGEXES_PYTHON,
114-
STACK_FRAME_FILEPATH_IGNORE_REGEXES_RUST, STACK_FRAME_FUNCTION_IGNORE_REGEXES_CPP,
115-
STACK_FRAME_FUNCTION_IGNORE_REGEXES_GO, STACK_FRAME_FUNCTION_IGNORE_REGEXES_JAVA,
116-
STACK_FRAME_FUNCTION_IGNORE_REGEXES_PYTHON, STACK_FRAME_FUNCTION_IGNORE_REGEXES_RUST,
117-
},
118111
init_ignored_frames,
119-
stacktrace::{
120-
Filter, STACK_FRAME_FILEPATH_IGNORE_REGEXES, STACK_FRAME_FUNCTION_IGNORE_REGEXES,
121-
},
112+
stacktrace::{Filter, Stacktrace},
122113
};
123114

124115
#[test]

libcasr/src/sarif.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
//! Sarif module contains `Sarif` struct that contains multiple `CrashReport`
22
//! structs in SARIF format.
33
4-
use crate::constants::*;
5-
use crate::error::{Error, Result};
6-
use crate::execution_class::{ExecutionClass, CLASSES};
7-
use crate::init_ignored_frames;
8-
use crate::report::CrashReport;
9-
use crate::stacktrace::{STACK_FRAME_FILEPATH_IGNORE_REGEXES, STACK_FRAME_FUNCTION_IGNORE_REGEXES};
4+
use crate::{
5+
error::{Error, Result},
6+
execution_class::{ExecutionClass, CLASSES},
7+
init_ignored_frames,
8+
report::CrashReport,
9+
stacktrace::{Filter, Stacktrace},
10+
};
1011

1112
use serde_json::{Map, Value};
1213

libcasr/src/stacktrace.rs

Lines changed: 72 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22
extern crate kodama;
33
extern crate lazy_static;
44

5+
use crate::constants::{
6+
STACK_FRAME_FILEPATH_IGNORE_REGEXES_CPP, STACK_FRAME_FILEPATH_IGNORE_REGEXES_GO,
7+
STACK_FRAME_FILEPATH_IGNORE_REGEXES_JAVA, STACK_FRAME_FILEPATH_IGNORE_REGEXES_PYTHON,
8+
STACK_FRAME_FILEPATH_IGNORE_REGEXES_RUST, STACK_FRAME_FUNCTION_IGNORE_REGEXES_CPP,
9+
STACK_FRAME_FUNCTION_IGNORE_REGEXES_GO, STACK_FRAME_FUNCTION_IGNORE_REGEXES_JAVA,
10+
STACK_FRAME_FUNCTION_IGNORE_REGEXES_PYTHON, STACK_FRAME_FUNCTION_IGNORE_REGEXES_RUST,
11+
};
512
use crate::error::*;
613
use kodama::{linkage, Method};
714
use regex::Regex;
@@ -31,18 +38,7 @@ lazy_static::lazy_static! {
3138
macro_rules! init_ignored_frames {
3239
( $( $x:expr ),* ) => {
3340
{
34-
let (funcs, files): (Vec<_>, Vec<_>) = [$($x,)*].iter().map(|&x|
35-
match x {
36-
"python" => (STACK_FRAME_FUNCTION_IGNORE_REGEXES_PYTHON, STACK_FRAME_FILEPATH_IGNORE_REGEXES_PYTHON),
37-
"rust" => (STACK_FRAME_FUNCTION_IGNORE_REGEXES_RUST, STACK_FRAME_FILEPATH_IGNORE_REGEXES_RUST),
38-
"cpp" => (STACK_FRAME_FUNCTION_IGNORE_REGEXES_CPP, STACK_FRAME_FILEPATH_IGNORE_REGEXES_CPP),
39-
"go" => (STACK_FRAME_FUNCTION_IGNORE_REGEXES_GO, STACK_FRAME_FILEPATH_IGNORE_REGEXES_GO),
40-
"java" => (STACK_FRAME_FUNCTION_IGNORE_REGEXES_JAVA, STACK_FRAME_FILEPATH_IGNORE_REGEXES_JAVA),
41-
&_ => (["^[^.]$"].as_slice(), ["^[^.]$"].as_slice()),
42-
}
43-
).unzip();
44-
*STACK_FRAME_FUNCTION_IGNORE_REGEXES.write().unwrap() = funcs.concat().iter().map(|x| x.to_string()).collect::<Vec<String>>();
45-
*STACK_FRAME_FILEPATH_IGNORE_REGEXES.write().unwrap() = files.concat().iter().map(|x| x.to_string()).collect::<Vec<String>>();
41+
<Stacktrace as Filter>::init_frame_filter(&[$($x,)*]);
4642
}
4743
};
4844
}
@@ -257,27 +253,77 @@ pub fn cluster_stacktraces(stacktraces: &[Stacktrace]) -> Result<Vec<u32>> {
257253
pub trait Filter {
258254
/// Filter frames from the stack trace that are not related to analyzed code containing crash.
259255
fn filter(&mut self);
256+
257+
/// Initialize global variables for stacktrace filtering
258+
///
259+
/// # Arguments
260+
///
261+
/// * `languages` - list of program languages for filtering
262+
fn init_frame_filter(languages: &[&str]) {
263+
let (funcs, files): (Vec<_>, Vec<_>) = languages
264+
.iter()
265+
.map(|&x| match x {
266+
"python" => (
267+
STACK_FRAME_FUNCTION_IGNORE_REGEXES_PYTHON,
268+
STACK_FRAME_FILEPATH_IGNORE_REGEXES_PYTHON,
269+
),
270+
"rust" => (
271+
STACK_FRAME_FUNCTION_IGNORE_REGEXES_RUST,
272+
STACK_FRAME_FILEPATH_IGNORE_REGEXES_RUST,
273+
),
274+
"cpp" => (
275+
STACK_FRAME_FUNCTION_IGNORE_REGEXES_CPP,
276+
STACK_FRAME_FILEPATH_IGNORE_REGEXES_CPP,
277+
),
278+
"go" => (
279+
STACK_FRAME_FUNCTION_IGNORE_REGEXES_GO,
280+
STACK_FRAME_FILEPATH_IGNORE_REGEXES_GO,
281+
),
282+
"java" => (
283+
STACK_FRAME_FUNCTION_IGNORE_REGEXES_JAVA,
284+
STACK_FRAME_FILEPATH_IGNORE_REGEXES_JAVA,
285+
),
286+
&_ => (["^[^.]$"].as_slice(), ["^[^.]$"].as_slice()),
287+
})
288+
.unzip();
289+
*STACK_FRAME_FUNCTION_IGNORE_REGEXES.write().unwrap() = funcs
290+
.concat()
291+
.iter()
292+
.map(|x| x.to_string())
293+
.collect::<Vec<String>>();
294+
*STACK_FRAME_FILEPATH_IGNORE_REGEXES.write().unwrap() = files
295+
.concat()
296+
.iter()
297+
.map(|x| x.to_string())
298+
.collect::<Vec<String>>();
299+
}
260300
}
261301

262302
impl Filter for Stacktrace {
263303
fn filter(&mut self) {
264304
// Compile function regexp.
265-
let rstring = STACK_FRAME_FUNCTION_IGNORE_REGEXES
266-
.read()
267-
.unwrap()
268-
.iter()
269-
.map(|s| format!("({s})|"))
270-
.collect::<String>();
271-
let rfunction = Regex::new(&rstring[0..rstring.len() - 1]).unwrap();
305+
let function_regexes = STACK_FRAME_FUNCTION_IGNORE_REGEXES.read().unwrap();
306+
let rfunction = if !function_regexes.is_empty() {
307+
let rstring = function_regexes
308+
.iter()
309+
.map(|s| format!("({s})|"))
310+
.collect::<String>();
311+
Regex::new(&rstring[0..rstring.len() - 1]).unwrap()
312+
} else {
313+
Regex::new(r"^[^.]$").unwrap()
314+
};
272315

273316
// Compile file regexp.
274-
let rstring = STACK_FRAME_FILEPATH_IGNORE_REGEXES
275-
.read()
276-
.unwrap()
277-
.iter()
278-
.map(|s| format!("({s})|"))
279-
.collect::<String>();
280-
let rfile = Regex::new(&rstring[0..rstring.len() - 1]).unwrap();
317+
let file_regexes = STACK_FRAME_FILEPATH_IGNORE_REGEXES.read().unwrap();
318+
let rfile = if !file_regexes.is_empty() {
319+
let rstring = file_regexes
320+
.iter()
321+
.map(|s| format!("({s})|"))
322+
.collect::<String>();
323+
Regex::new(&rstring[0..rstring.len() - 1]).unwrap()
324+
} else {
325+
Regex::new(r"^[^.]$").unwrap()
326+
};
281327

282328
// For libfuzzer: delete functions below LLVMFuzzerTestOneInput
283329
if let Some(pos) = &self

0 commit comments

Comments
 (0)