diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp | 40 | 
1 files changed, 30 insertions, 10 deletions
diff --git a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp index 6efa2dfbe5b4..d8a9af78536a 100644 --- a/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp +++ b/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp @@ -1,9 +1,8 @@  // MoveChecker.cpp - Check use of moved-from objects. - C++ ---------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===//  // @@ -14,6 +13,7 @@  //===----------------------------------------------------------------------===//  #include "clang/AST/ExprCXX.h" +#include "clang/Driver/DriverDiagnostic.h"  #include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"  #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"  #include "clang/StaticAnalyzer/Core/Checker.h" @@ -187,13 +187,17 @@ private:    AggressivenessKind Aggressiveness;  public: -  void setAggressiveness(StringRef Str) { +  void setAggressiveness(StringRef Str, CheckerManager &Mgr) {      Aggressiveness =          llvm::StringSwitch<AggressivenessKind>(Str)              .Case("KnownsOnly", AK_KnownsOnly)              .Case("KnownsAndLocals", AK_KnownsAndLocals)              .Case("All", AK_All) -            .Default(AK_KnownsAndLocals); // A sane default. +            .Default(AK_Invalid); + +    if (Aggressiveness == AK_Invalid) +      Mgr.reportInvalidCheckerOptionValue(this, "WarnOn", +          "either \"KnownsOnly\", \"KnownsAndLocals\" or \"All\" string value");    };  private: @@ -223,6 +227,18 @@ private:  REGISTER_MAP_WITH_PROGRAMSTATE(TrackedRegionMap, const MemRegion *, RegionState) +// Define the inter-checker API. +namespace clang { +namespace ento { +namespace move { +bool isMovedFrom(ProgramStateRef State, const MemRegion *Region) { +  const RegionState *RS = State->get<TrackedRegionMap>(Region); +  return RS && (RS->isMoved() || RS->isReported()); +} +} // namespace move +} // namespace ento +} // namespace clang +  // If a region is removed all of the subregions needs to be removed too.  static ProgramStateRef removeFromState(ProgramStateRef State,                                         const MemRegion *Region) { @@ -502,9 +518,9 @@ bool MoveChecker::isStateResetMethod(const CXXMethodDecl *MethodDec) const {      std::string MethodName = MethodDec->getName().lower();      // TODO: Some of these methods (eg., resize) are not always resetting      // the state, so we should consider looking at the arguments. -    if (MethodName == "reset" || MethodName == "clear" || -        MethodName == "destroy" || MethodName == "resize" || -        MethodName == "shrink") +    if (MethodName == "assign" || MethodName == "clear" || +        MethodName == "destroy" || MethodName == "reset" || +        MethodName == "resize" || MethodName == "shrink")        return true;    }    return false; @@ -736,5 +752,9 @@ void MoveChecker::printState(raw_ostream &Out, ProgramStateRef State,  void ento::registerMoveChecker(CheckerManager &mgr) {    MoveChecker *chk = mgr.registerChecker<MoveChecker>();    chk->setAggressiveness( -      mgr.getAnalyzerOptions().getCheckerStringOption("WarnOn", "", chk)); +      mgr.getAnalyzerOptions().getCheckerStringOption(chk, "WarnOn"), mgr); +} + +bool ento::shouldRegisterMoveChecker(const LangOptions &LO) { +  return true;  }  | 
