(deopt: &Deopt)
| 357 | use super::*; |
| 358 | |
| 359 | pub fn parse_func_gadgets(deopt: &Deopt) -> Result<Vec<FuncGadget>> { |
| 360 | let headers = deopt.obtain_library_include_headers()?; |
| 361 | let mut gadgets = Vec::new(); |
| 362 | for header in headers { |
| 363 | if let Some(ext) = header.extension() { |
| 364 | if ext != "h" && ext != "hpp" && ext != "hxx" { |
| 365 | continue; |
| 366 | } |
| 367 | } |
| 368 | let ast_res = Executor::parse_header_ast(&header, deopt); |
| 369 | if let Err(err) = ast_res { |
| 370 | log::error!("{}", err.to_string()); |
| 371 | log::error!("Meet a error during parse header's ast. Some headers are prevent to be included. IF that is the case, please just ignore it."); |
| 372 | continue; |
| 373 | } |
| 374 | let ast = ast_res.unwrap(); |
| 375 | let header_gadgets: Vec<FuncGadget> = parse_func_gadgets_from_ast(&ast, deopt)?; |
| 376 | gadgets.extend(header_gadgets); |
| 377 | } |
| 378 | let mut visited: HashSet<String> = HashSet::new(); |
| 379 | gadgets.retain(|x| { |
| 380 | if visited.contains(&x.name) { |
| 381 | false |
| 382 | } else { |
| 383 | visited.insert(x.name.clone()); |
| 384 | true |
| 385 | } |
| 386 | }); |
| 387 | Ok(gadgets) |
| 388 | } |
| 389 | |
| 390 | fn parse_func_gadgets_from_ast(ast: &Node, deopt: &Deopt) -> Result<Vec<FuncGadget>> { |
| 391 | let mut gadgets = Vec::new(); |
no test coverage detected