(root)/
gcc-13.2.0/
gcc/
diagnostic-metadata.h
       1  /* Additional metadata for a diagnostic.
       2     Copyright (C) 2019-2023 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 under
       8  the terms of the GNU General Public License as published by the Free
       9  Software Foundation; either version 3, or (at your option) any later
      10  version.
      11  
      12  GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13  WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15  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_DIAGNOSTIC_METADATA_H
      22  #define GCC_DIAGNOSTIC_METADATA_H
      23  
      24  /* A bundle of additional metadata that can be associated with a
      25     diagnostic.
      26  
      27     This supports an optional CWE identifier, and zero or more
      28     "rules".  */
      29  
      30  class diagnostic_metadata
      31  {
      32   public:
      33    /* Abstract base class for referencing a rule that has been violated,
      34       such as within a coding standard, or within a specification.  */
      35    class rule
      36    {
      37    public:
      38      virtual char *make_description () const = 0;
      39      virtual char *make_url () const = 0;
      40    };
      41  
      42    /* Concrete subclass.  */
      43    class precanned_rule : public rule
      44    {
      45    public:
      46      precanned_rule (const char *desc, const char *url)
      47      : m_desc (desc), m_url (url)
      48      {}
      49  
      50      char *make_description () const final override
      51      {
      52        return m_desc ? xstrdup (m_desc) : NULL;
      53      }
      54  
      55      char *make_url () const final override
      56      {
      57        return m_url ? xstrdup (m_url) : NULL;
      58      }
      59  
      60    private:
      61      const char *m_desc;
      62      const char *m_url;
      63    };
      64  
      65    diagnostic_metadata () : m_cwe (0) {}
      66  
      67    void add_cwe (int cwe) { m_cwe = cwe; }
      68    int get_cwe () const { return m_cwe; }
      69  
      70    /* Associate R with the diagnostic.  R must outlive
      71       the metadata.  */
      72    void add_rule (const rule &r)
      73    {
      74      m_rules.safe_push (&r);
      75    }
      76  
      77    unsigned get_num_rules () const { return m_rules.length (); }
      78    const rule &get_rule (unsigned idx) const { return *(m_rules[idx]); }
      79  
      80   private:
      81    int m_cwe;
      82    auto_vec<const rule *> m_rules;
      83  };
      84  
      85  #endif /* ! GCC_DIAGNOSTIC_METADATA_H */