LCOV - code coverage report
Current view: top level - gcc/analyzer - call-details.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 100.0 % 20 20
Test Date: 2026-02-28 14:20:25 Functions: 100.0 % 4 4
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Helper class for handling a call with specific arguments.
       2              :    Copyright (C) 2019-2026 Free Software Foundation, Inc.
       3              :    Contributed by David Malcolm <dmalcolm@redhat.com>.
       4              : 
       5              : This file is part of GCC.
       6              : 
       7              : GCC is free software; you can redistribute it and/or modify it
       8              : under the terms of the GNU General Public License as published by
       9              : the Free Software Foundation; either version 3, or (at your option)
      10              : any later version.
      11              : 
      12              : GCC is distributed in the hope that it will be useful, but
      13              : WITHOUT ANY WARRANTY; without even the implied warranty of
      14              : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15              : General Public License for more details.
      16              : 
      17              : You should have received a copy of the GNU General Public License
      18              : along with GCC; see the file COPYING3.  If not see
      19              : <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : #ifndef GCC_ANALYZER_CALL_DETAILS_H
      22              : #define GCC_ANALYZER_CALL_DETAILS_H
      23              : 
      24              : #include "pending-diagnostic.h"
      25              : 
      26              : namespace ana {
      27              : 
      28              : /* Helper class for handling calls to functions with known behavior.  */
      29              : 
      30              : class call_details
      31              : {
      32              : public:
      33              :   call_details (const gcall &call, region_model *model,
      34              :                 region_model_context *ctxt);
      35              :   call_details (const call_details &cd, region_model_context *ctxt);
      36              : 
      37        51018 :   region_model *get_model () const { return m_model; }
      38              :   region_model_manager *get_manager () const;
      39        60377 :   region_model_context *get_ctxt () const { return m_ctxt; }
      40              :   logger *get_logger () const;
      41              : 
      42              :   uncertainty_t *get_uncertainty () const;
      43        17559 :   tree get_lhs_type () const { return m_lhs_type; }
      44         3259 :   const region *get_lhs_region () const { return m_lhs_region; }
      45              : 
      46              :   bool maybe_set_lhs (const svalue *result) const;
      47              :   void set_any_lhs_with_defaults () const;
      48              : 
      49              :   unsigned num_args () const;
      50       125018 :   bool arg_is_pointer_p (unsigned idx) const
      51              :   {
      52       125018 :     return POINTER_TYPE_P (get_arg_type (idx));
      53              :   }
      54              :   bool arg_is_size_p (unsigned idx) const;
      55         1225 :   bool arg_is_integral_p (unsigned idx) const
      56              :   {
      57         1225 :     return INTEGRAL_TYPE_P (get_arg_type (idx));
      58              :   }
      59              : 
      60        30023 :   const gcall &get_call_stmt () const { return m_call; }
      61              :   location_t get_location () const;
      62              : 
      63              :   tree get_arg_tree (unsigned idx) const;
      64              :   tree get_arg_type (unsigned idx) const;
      65              :   const svalue *get_arg_svalue (unsigned idx) const;
      66              :   const region *deref_ptr_arg (unsigned idx) const;
      67              :   const char *get_arg_string_literal (unsigned idx) const;
      68              : 
      69              :   tree get_fndecl_for_call () const;
      70              : 
      71              :   void dump_to_pp (pretty_printer *pp, bool simple) const;
      72              :   void dump (bool simple) const;
      73              :   void dump () const;
      74              : 
      75              :   std::unique_ptr<text_art::tree_widget>
      76              :   make_dump_widget (const text_art::dump_widget_info &dwi) const;
      77              : 
      78              :   const svalue *get_or_create_conjured_svalue (const region *) const;
      79              : 
      80              :   tree lookup_function_attribute (const char *attr_name) const;
      81              : 
      82              :   void
      83              :   check_for_null_terminated_string_arg (unsigned arg_idx) const;
      84              :   const svalue *
      85              :   check_for_null_terminated_string_arg (unsigned arg_idx,
      86              :                                         bool include_terminator,
      87              :                                         const svalue **out_sval) const;
      88              : 
      89              :   void
      90              :   complain_about_overlap (unsigned arg_idx_a,
      91              :                           unsigned arg_idx_b,
      92              :                           const svalue *num_bytes_read_sval) const;
      93              : 
      94              : private:
      95              :   const gcall &m_call;
      96              :   region_model *m_model;
      97              :   region_model_context *m_ctxt;
      98              :   tree m_lhs_type;
      99              :   const region *m_lhs_region;
     100              : };
     101              : 
     102              : /* A bundle of information about a problematic argument at a callsite
     103              :    for use by pending_diagnostic subclasses for reporting and
     104              :    for deduplication.  */
     105              : 
     106              : struct call_arg_details
     107              : {
     108              : public:
     109          172 :   call_arg_details (const call_details &cd, unsigned arg_idx)
     110          172 :   : m_call (cd.get_call_stmt ()),
     111          172 :     m_called_fndecl (cd.get_fndecl_for_call ()),
     112          172 :     m_arg_idx (arg_idx),
     113          172 :     m_arg_expr (cd.get_arg_tree (arg_idx))
     114              :   {
     115          172 :   }
     116              : 
     117          676 :   bool operator== (const call_arg_details &other) const
     118              :   {
     119          676 :     return (&m_call == &other.m_call
     120          172 :             && m_called_fndecl == other.m_called_fndecl
     121          172 :             && m_arg_idx == other.m_arg_idx
     122          848 :             && pending_diagnostic::same_tree_p (m_arg_expr, other.m_arg_expr));
     123              :   }
     124              : 
     125              :   const gcall &m_call;
     126              :   tree m_called_fndecl;
     127              :   unsigned m_arg_idx; // 0-based
     128              :   tree m_arg_expr;
     129              : };
     130              : 
     131              : } // namespace ana
     132              : 
     133              : #endif /* GCC_ANALYZER_CALL_DETAILS_H */
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.