(root)/
gcc-13.2.0/
gcc/
rust/
checks/
errors/
rust-unsafe-checker.h
       1  // Copyright (C) 2020-2023 Free Software Foundation, Inc.
       2  
       3  // This file is part of GCC.
       4  
       5  // GCC is free software; you can redistribute it and/or modify it under
       6  // the terms of the GNU General Public License as published by the Free
       7  // Software Foundation; either version 3, or (at your option) any later
       8  // version.
       9  
      10  // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      11  // WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12  // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      13  // for more details.
      14  
      15  // You should have received a copy of the GNU General Public License
      16  // along with GCC; see the file COPYING3.  If not see
      17  // <http://www.gnu.org/licenses/>.
      18  
      19  #ifndef RUST_UNSAFE_CHECKER_H
      20  #define RUST_UNSAFE_CHECKER_H
      21  
      22  #include "rust-hir-visitor.h"
      23  #include "rust-name-resolver.h"
      24  #include "rust-hir-type-check.h"
      25  #include "rust-stacked-contexts.h"
      26  
      27  namespace Rust {
      28  namespace HIR {
      29  class UnsafeChecker : public HIRFullVisitor
      30  {
      31  public:
      32    UnsafeChecker ();
      33  
      34    void go (HIR::Crate &crate);
      35  
      36  private:
      37    /**
      38     * Check if a mutable static or external static item is used outside of an
      39     * unsafe context
      40     */
      41    void check_use_of_static (HirId node_id, Location locus);
      42  
      43    /**
      44     * Check if a call to an unsafe or external function is outside of an unsafe
      45     * context
      46     */
      47    void check_function_call (HirId node_id, Location locus);
      48  
      49    /**
      50     * Check if any unsafe attributes are present on a function
      51     */
      52    void check_function_attr (HirId node_id, Location locus);
      53  
      54    StackedContexts<HirId> unsafe_context;
      55  
      56    Resolver::TypeCheckContext &context;
      57    Resolver::Resolver &resolver;
      58    Analysis::Mappings &mappings;
      59  
      60    virtual void visit (Lifetime &lifetime) override;
      61    virtual void visit (LifetimeParam &lifetime_param) override;
      62    virtual void visit (PathInExpression &path) override;
      63    virtual void visit (TypePathSegment &segment) override;
      64    virtual void visit (TypePathSegmentGeneric &segment) override;
      65    virtual void visit (TypePathSegmentFunction &segment) override;
      66    virtual void visit (TypePath &path) override;
      67    virtual void visit (QualifiedPathInExpression &path) override;
      68    virtual void visit (QualifiedPathInType &path) override;
      69    virtual void visit (LiteralExpr &expr) override;
      70    virtual void visit (BorrowExpr &expr) override;
      71    virtual void visit (DereferenceExpr &expr) override;
      72    virtual void visit (ErrorPropagationExpr &expr) override;
      73    virtual void visit (NegationExpr &expr) override;
      74    virtual void visit (ArithmeticOrLogicalExpr &expr) override;
      75    virtual void visit (ComparisonExpr &expr) override;
      76    virtual void visit (LazyBooleanExpr &expr) override;
      77    virtual void visit (TypeCastExpr &expr) override;
      78    virtual void visit (AssignmentExpr &expr) override;
      79    virtual void visit (CompoundAssignmentExpr &expr) override;
      80    virtual void visit (GroupedExpr &expr) override;
      81    virtual void visit (ArrayElemsValues &elems) override;
      82    virtual void visit (ArrayElemsCopied &elems) override;
      83    virtual void visit (ArrayExpr &expr) override;
      84    virtual void visit (ArrayIndexExpr &expr) override;
      85    virtual void visit (TupleExpr &expr) override;
      86    virtual void visit (TupleIndexExpr &expr) override;
      87    virtual void visit (StructExprStruct &expr) override;
      88    virtual void visit (StructExprFieldIdentifier &field) override;
      89    virtual void visit (StructExprFieldIdentifierValue &field) override;
      90    virtual void visit (StructExprFieldIndexValue &field) override;
      91    virtual void visit (StructExprStructFields &expr) override;
      92    virtual void visit (StructExprStructBase &expr) override;
      93    virtual void visit (CallExpr &expr) override;
      94    virtual void visit (MethodCallExpr &expr) override;
      95    virtual void visit (FieldAccessExpr &expr) override;
      96    virtual void visit (ClosureExpr &expr) override;
      97    virtual void visit (BlockExpr &expr) override;
      98    virtual void visit (ContinueExpr &expr) override;
      99    virtual void visit (BreakExpr &expr) override;
     100    virtual void visit (RangeFromToExpr &expr) override;
     101    virtual void visit (RangeFromExpr &expr) override;
     102    virtual void visit (RangeToExpr &expr) override;
     103    virtual void visit (RangeFullExpr &expr) override;
     104    virtual void visit (RangeFromToInclExpr &expr) override;
     105    virtual void visit (RangeToInclExpr &expr) override;
     106    virtual void visit (ReturnExpr &expr) override;
     107    virtual void visit (UnsafeBlockExpr &expr) override;
     108    virtual void visit (LoopExpr &expr) override;
     109    virtual void visit (WhileLoopExpr &expr) override;
     110    virtual void visit (WhileLetLoopExpr &expr) override;
     111    virtual void visit (ForLoopExpr &expr) override;
     112    virtual void visit (IfExpr &expr) override;
     113    virtual void visit (IfExprConseqElse &expr) override;
     114    virtual void visit (IfExprConseqIf &expr) override;
     115    virtual void visit (IfExprConseqIfLet &expr) override;
     116    virtual void visit (IfLetExpr &expr) override;
     117    virtual void visit (IfLetExprConseqElse &expr) override;
     118    virtual void visit (IfLetExprConseqIf &expr) override;
     119    virtual void visit (IfLetExprConseqIfLet &expr) override;
     120    virtual void visit (MatchExpr &expr) override;
     121    virtual void visit (AwaitExpr &expr) override;
     122    virtual void visit (AsyncBlockExpr &expr) override;
     123    virtual void visit (TypeParam &param) override;
     124    virtual void visit (ConstGenericParam &param) override;
     125    virtual void visit (LifetimeWhereClauseItem &item) override;
     126    virtual void visit (TypeBoundWhereClauseItem &item) override;
     127    virtual void visit (Module &module) override;
     128    virtual void visit (ExternCrate &crate) override;
     129    virtual void visit (UseTreeGlob &use_tree) override;
     130    virtual void visit (UseTreeList &use_tree) override;
     131    virtual void visit (UseTreeRebind &use_tree) override;
     132    virtual void visit (UseDeclaration &use_decl) override;
     133    virtual void visit (Function &function) override;
     134    virtual void visit (TypeAlias &type_alias) override;
     135    virtual void visit (StructStruct &struct_item) override;
     136    virtual void visit (TupleStruct &tuple_struct) override;
     137    virtual void visit (EnumItem &item) override;
     138    virtual void visit (EnumItemTuple &item) override;
     139    virtual void visit (EnumItemStruct &item) override;
     140    virtual void visit (EnumItemDiscriminant &item) override;
     141    virtual void visit (Enum &enum_item) override;
     142    virtual void visit (Union &union_item) override;
     143    virtual void visit (ConstantItem &const_item) override;
     144    virtual void visit (StaticItem &static_item) override;
     145    virtual void visit (TraitItemFunc &item) override;
     146    virtual void visit (TraitItemConst &item) override;
     147    virtual void visit (TraitItemType &item) override;
     148    virtual void visit (Trait &trait) override;
     149    virtual void visit (ImplBlock &impl) override;
     150    virtual void visit (ExternalStaticItem &item) override;
     151    virtual void visit (ExternalFunctionItem &item) override;
     152    virtual void visit (ExternBlock &block) override;
     153    virtual void visit (LiteralPattern &pattern) override;
     154    virtual void visit (IdentifierPattern &pattern) override;
     155    virtual void visit (WildcardPattern &pattern) override;
     156    virtual void visit (RangePatternBoundLiteral &bound) override;
     157    virtual void visit (RangePatternBoundPath &bound) override;
     158    virtual void visit (RangePatternBoundQualPath &bound) override;
     159    virtual void visit (RangePattern &pattern) override;
     160    virtual void visit (ReferencePattern &pattern) override;
     161    virtual void visit (StructPatternFieldTuplePat &field) override;
     162    virtual void visit (StructPatternFieldIdentPat &field) override;
     163    virtual void visit (StructPatternFieldIdent &field) override;
     164    virtual void visit (StructPattern &pattern) override;
     165    virtual void visit (TupleStructItemsNoRange &tuple_items) override;
     166    virtual void visit (TupleStructItemsRange &tuple_items) override;
     167    virtual void visit (TupleStructPattern &pattern) override;
     168    virtual void visit (TuplePatternItemsMultiple &tuple_items) override;
     169    virtual void visit (TuplePatternItemsRanged &tuple_items) override;
     170    virtual void visit (TuplePattern &pattern) override;
     171    virtual void visit (SlicePattern &pattern) override;
     172    virtual void visit (EmptyStmt &stmt) override;
     173    virtual void visit (LetStmt &stmt) override;
     174    virtual void visit (ExprStmtWithoutBlock &stmt) override;
     175    virtual void visit (ExprStmtWithBlock &stmt) override;
     176    virtual void visit (TraitBound &bound) override;
     177    virtual void visit (ImplTraitType &type) override;
     178    virtual void visit (TraitObjectType &type) override;
     179    virtual void visit (ParenthesisedType &type) override;
     180    virtual void visit (ImplTraitTypeOneBound &type) override;
     181    virtual void visit (TupleType &type) override;
     182    virtual void visit (NeverType &type) override;
     183    virtual void visit (RawPointerType &type) override;
     184    virtual void visit (ReferenceType &type) override;
     185    virtual void visit (ArrayType &type) override;
     186    virtual void visit (SliceType &type) override;
     187    virtual void visit (InferredType &type) override;
     188    virtual void visit (BareFunctionType &type) override;
     189  };
     190  
     191  } // namespace HIR
     192  } // namespace Rust
     193  
     194  #endif /* !RUST_UNSAFE_CHECKER_H */