Whether this arg is the sizeof of var_name.
(integer_arg: &Node, array_name: &str, visitor: &Visitor)
| 585 | |
| 586 | /// Whether this arg is the sizeof of var_name. |
| 587 | pub fn is_sizeof_expr_of_var(integer_arg: &Node, array_name: &str, visitor: &Visitor) -> bool { |
| 588 | let integer_arg = strip_prefix(integer_arg); |
| 589 | if let Clang::UnaryExprOrTypeTraitExpr(ue) = &integer_arg.kind { |
| 590 | if !ue.is_sizeof() { |
| 591 | return false; |
| 592 | } |
| 593 | if let Some(inner_name) = ue.get_dre_child_name(integer_arg) { |
| 594 | if inner_name == array_name { |
| 595 | return true; |
| 596 | } |
| 597 | } |
| 598 | if let Some(sizeof_ty) = &ue.arg_type { |
| 599 | let sizeof_ty_name = sizeof_ty.get_type_name(); |
| 600 | if let Some(var) = visitor.find_vardecl(array_name) { |
| 601 | if let Clang::VarDecl(vd) = &var.kind { |
| 602 | let array_ty_name = vd.get_type().get_type_name(); |
| 603 | if array_ty_name == sizeof_ty_name { |
| 604 | return true; |
| 605 | } |
| 606 | } |
| 607 | } |
| 608 | } |
| 609 | } else if let Clang::BinaryOperator(bo) = &integer_arg.kind { |
| 610 | let left = bo.get_lhs(integer_arg); |
| 611 | let right = bo.get_rhs(integer_arg); |
| 612 | return is_sizeof_expr_of_var(left, array_name, visitor) |
| 613 | || is_sizeof_expr_of_var(right, array_name, visitor); |
| 614 | } else if let Clang::DeclRefExpr(dre) = &integer_arg.kind { |
| 615 | if let Some(init) = dre.get_var_init(visitor) { |
| 616 | return is_sizeof_expr_of_var(init, array_name, visitor); |
| 617 | } |
| 618 | } |
| 619 | false |
| 620 | } |
| 621 | |
| 622 | fn is_size_of_var(alloc_arg: &Node, integer_arg: &Node, visitor: &Visitor) -> bool { |
| 623 | let alloc_arg = strip_prefix(alloc_arg); |
no test coverage detected