diff --git a/clang/lib/StaticAnalyzer/Checkers/OpenHarmony/OHPtrImplicitConversionChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/OpenHarmony/OHPtrImplicitConversionChecker.cpp index 71e69b0ced968db1a853ea0d7133f3ba0fc15b0c..e7cdbd8a0af246c7700090e0932e82448ff0f6d4 100644 --- a/clang/lib/StaticAnalyzer/Checkers/OpenHarmony/OHPtrImplicitConversionChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/OpenHarmony/OHPtrImplicitConversionChecker.cpp @@ -12,6 +12,7 @@ // //===----------------------------------------------------------------------===// +#include "clang/AST/Type.h" #include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" #include "clang/StaticAnalyzer/Core/Checker.h" @@ -65,6 +66,16 @@ void OHPtrImplicitConversionChecker::checkPreStmt(const ImplicitCastExpr *Cast, if (Cast->getCastKind() != CK_ConstructorConversion) { return; } + FunctionDecl *FD = dyn_cast(ND); + if (FD) { + ArrayRef PAR = FD->parameters(); + QualType PT = PAR[0]->getOriginalType(); + std::string PTS = PT.getAsString(); + if (PTS.find("wptr") != std::string::npos || + PTS.find("sptr") != std::string::npos) { + return; + } + } std::string cf = ND->getNameAsString(); if (cf == "sptr" || cf == "wptr") { diff --git a/clang/test/Analysis/implicit_conversion.cpp b/clang/test/Analysis/implicit_conversion.cpp index 9b211c758eee8b1d2219550581ce0eea60593553..701f8b69615dcf477968c5b33469fa130f7c38ee 100644 --- a/clang/test/Analysis/implicit_conversion.cpp +++ b/clang/test/Analysis/implicit_conversion.cpp @@ -1,13 +1,13 @@ // RUN: %clang --analyze -Xanalyzer -analyzer-checker=openharmony.OHPtrImplicitConversion %s -#include "refbase.h" +#include "./refbase.h" -using namespace std; using namespace OHOS; class Derived:public RefBase{}; +class Other{}; void sptr_test_good_case01(){ - sptr s(new RefBase); + sptr s(new RefBase()); } void sptr_test_good_case02(){ @@ -19,18 +19,15 @@ void sptr_test_good_case03(){ sptr s(new Derived()); } -sptr sptr_test_good_case0405_helper(sptr s){ - return s; -} - void sptr_test_good_case04(){ - sptr s(new RefBase()); - sptr sp = sptr_test_good_case0405_helper(s); + sptr s(new Derived()); + sptr p = s; } sptr sptr_test_good_case05(){ sptr s(new RefBase()); - sptr p = sptr_test_good_case0405_helper(s); + sptr p = s; + return p; } void sptr_test_bad_case01(){ @@ -55,13 +52,17 @@ void sptr_test_bad_case04(){ sptr s = nullptr; // expected-warning {{Implicit convert pointer to sptr/wptr}} } - /********************wptr******************/ void wptr_test_good_case01(){ wptr w(new RefBase()); wptr wp = w; } +void wptr_test_good_case02(){ + wptr w(new Derived()); + wptr s = w; +} + void wptr_test_bad_case01(){ RefBase * r = new Derived(); wptr w = r; // expected-warning {{Implicit convert pointer to sptr/wptr}} diff --git a/clang/test/Analysis/refbase.h b/clang/test/Analysis/refbase.h index 505dfa6d15475d604ea4760c899351a84a227c8a..4997dd54b46b5ee513f22aa62d9f571cbc77f7fb 100644 --- a/clang/test/Analysis/refbase.h +++ b/clang/test/Analysis/refbase.h @@ -34,8 +34,10 @@ namespace OHOS sptr(T *other) : refs_(other){}; sptr(const sptr &other) : refs_(other.GetRefPtr()) {} sptr(sptr &&other) : refs_(other.GetRefPtr()) {} + template + sptr(const sptr &other) : refs_(other.GetRefPtr()){} ~sptr() { - delete refs_; // expected-warning {{Attempt to delete released memory}} + delete refs_; } sptr &operator=(sptr &&other) {