Is this arg returned by calls
(func: &str, arg_pos: usize, visitor: &Visitor)
| 1577 | |
| 1578 | // Is this arg returned by calls |
| 1579 | pub fn is_ret_by_call(func: &str, arg_pos: usize, visitor: &Visitor) -> bool { |
| 1580 | if let Some(call) = visitor.find_callexpr(func, 0) { |
| 1581 | if let Clang::CallExpr(ce) = &call.kind { |
| 1582 | let call_args = ce.get_childs(call); |
| 1583 | if arg_pos >= call_args.len() { |
| 1584 | return false; |
| 1585 | } |
| 1586 | let arg = ce.get_childs(call)[arg_pos]; |
| 1587 | if crate::ast::utils::is_integer_literal(arg) { |
| 1588 | return false; |
| 1589 | } |
| 1590 | if matches!( |
| 1591 | &arg.kind, |
| 1592 | Clang::CallExpr(_) | Clang::CXXNewExpr(_) | Clang::CXXMemberCallExpr |
| 1593 | ) { |
| 1594 | return true; |
| 1595 | } |
| 1596 | |
| 1597 | if let Clang::DeclRefExpr(dre) = &arg.kind { |
| 1598 | if let Some(init) = dre.get_var_init(visitor) { |
| 1599 | if matches!( |
| 1600 | &init.kind, |
| 1601 | Clang::CallExpr(_) | Clang::CXXNewExpr(_) | Clang::CXXMemberCallExpr |
| 1602 | ) { |
| 1603 | return true; |
| 1604 | } |
| 1605 | } |
| 1606 | } |
| 1607 | } |
| 1608 | } |
| 1609 | false |
| 1610 | } |
| 1611 | } |
| 1612 | |
| 1613 | pub fn transform( |
no test coverage detected