tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

VariableUsageHelpers.h (2638B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #ifndef VariableUsageHelpers_h__
      6 #define VariableUsageHelpers_h__
      7 
      8 #include "plugin.h"
      9 
     10 /// Returns a list of the statements where the given declaration is used as an
     11 /// rvalue (within the provided function).
     12 ///
     13 /// WARNING: incomplete behaviour/implementation for general-purpose use outside
     14 /// of escapesFunction(). This only detects very basic usages (see
     15 /// implementation for more details).
     16 std::vector<const Stmt *> getUsageAsRvalue(const ValueDecl *ValueDeclaration,
     17                                           const FunctionDecl *FuncDecl);
     18 
     19 /// This is the error enumeration for escapesFunction(), describing all the
     20 /// possible error cases.
     21 enum class EscapesFunctionError {
     22  ConstructorDeclNotFound = 1,
     23  FunctionDeclNotFound,
     24  FunctionIsBuiltin,
     25  FunctionIsVariadic,
     26  ExprNotInCall,
     27  NoParamForArg,
     28  ArgAndParamNotPointers
     29 };
     30 
     31 /// Required by the std::error_code system to convert our enum into a general
     32 /// error code.
     33 std::error_code make_error_code(EscapesFunctionError);
     34 
     35 /// Returns a (statement, decl) tuple if an argument from an argument list
     36 /// escapes the function scope through globals/statics/other things. The
     37 /// statement is where the value escapes the function, while the declaration
     38 /// points to what it escapes through. If the argument doesn't escape the
     39 /// function, the tuple will only contain nullptrs.
     40 /// If the analysis runs into an unexpected error or into an unimplemented
     41 /// configuration, it will return an error_code of type EscapesFunctionError
     42 /// representing the precise issue.
     43 ///
     44 /// WARNING: incomplete behaviour/implementation for general-purpose use outside
     45 /// of DanglingOnTemporaryChecker. This only covers a limited set of cases,
     46 /// mainly in terms of arguments and parameter types.
     47 ErrorOr<std::tuple<const Stmt *, const Decl *>>
     48 escapesFunction(const Expr *Arg, const FunctionDecl *FuncDecl,
     49                const Expr *const *Arguments, unsigned NumArgs);
     50 
     51 /// Helper function taking a call expression.
     52 ErrorOr<std::tuple<const Stmt *, const Decl *>>
     53 escapesFunction(const Expr *Arg, const CallExpr *Call);
     54 
     55 /// Helper function taking a construct expression.
     56 ErrorOr<std::tuple<const Stmt *, const Decl *>>
     57 escapesFunction(const Expr *Arg, const CXXConstructExpr *Construct);
     58 
     59 /// Helper function taking an operator call expression.
     60 ErrorOr<std::tuple<const Stmt *, const Decl *>>
     61 escapesFunction(const Expr *Arg, const CXXOperatorCallExpr *OpCall);
     62 
     63 #endif