[cfe-commits] r162468 - in /cfe/trunk/lib/AST: CXXInheritance.cpp ExprConstant.cpp

David Blaikie dblaikie at gmail.com
Mon Aug 27 14:37:43 PDT 2012


[+sam]

On Mon, Aug 27, 2012 at 2:32 PM, David Blaikie <dblaikie at gmail.com> wrote:
> On Thu, Aug 23, 2012 at 1:46 PM, Ted Kremenek <kremenek at apple.com> wrote:
>> Author: kremenek
>> Date: Thu Aug 23 15:46:57 2012
>> New Revision: 162468
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=162468&view=rev
>> Log:
>> Change a bunch of cases where we do "getAs<...>->doSomething()" to
>> "castAs<...>->doSomething()".  The analyzer was flagging these
>> as potential null dereferences, which is technically true.  The
>> invariants appear to be that these casts should never fail, so
>> let's use castAs<> instead and avoid a runtime check.
>
> Funny you should mention this - Sam Panzer & I came across this issue
> (& he went & did a cursory search over the Clang code) a few days ago.
>
> "Just for fun, I ran a grep for getAs() followed immediately by a
> method call, which turned up 295 cases that should probably be
> castAs(). If this sort of thing should be cleaned up...
> $ git grep -E '(->|\.)getAs<\w+>\(\)->' | wc -l"
>
> There are a few less with your change, but still a few to clean up. I
> might get to them at some point - but figured I'd record it here
> because it seemed relevant to the change. (perhaps they're also
> interesting to you as areas of improvement for the Static Analyzer if
> it's not correctly flagging them already)
>
> - David
>
>>
>> Modified:
>>     cfe/trunk/lib/AST/CXXInheritance.cpp
>>     cfe/trunk/lib/AST/ExprConstant.cpp
>>
>> Modified: cfe/trunk/lib/AST/CXXInheritance.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CXXInheritance.cpp?rev=162468&r1=162467&r2=162468&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/AST/CXXInheritance.cpp (original)
>> +++ cfe/trunk/lib/AST/CXXInheritance.cpp Thu Aug 23 15:46:57 2012
>> @@ -363,8 +363,8 @@
>>                                    void *BaseRecord) {
>>    assert(((Decl *)BaseRecord)->getCanonicalDecl() == BaseRecord &&
>>           "User data for FindBaseClass is not canonical!");
>> -  return Specifier->getType()->getAs<RecordType>()->getDecl()
>> -           ->getCanonicalDecl() == BaseRecord;
>> +  return Specifier->getType()->castAs<RecordType>()->getDecl()
>> +            ->getCanonicalDecl() == BaseRecord;
>>  }
>>
>>  bool CXXRecordDecl::FindVirtualBaseClass(const CXXBaseSpecifier *Specifier,
>> @@ -373,14 +373,15 @@
>>    assert(((Decl *)BaseRecord)->getCanonicalDecl() == BaseRecord &&
>>           "User data for FindBaseClass is not canonical!");
>>    return Specifier->isVirtual() &&
>> -         Specifier->getType()->getAs<RecordType>()->getDecl()
>> -           ->getCanonicalDecl() == BaseRecord;
>> +         Specifier->getType()->castAs<RecordType>()->getDecl()
>> +            ->getCanonicalDecl() == BaseRecord;
>>  }
>>
>>  bool CXXRecordDecl::FindTagMember(const CXXBaseSpecifier *Specifier,
>>                                    CXXBasePath &Path,
>>                                    void *Name) {
>> -  RecordDecl *BaseRecord = Specifier->getType()->getAs<RecordType>()->getDecl();
>> +  RecordDecl *BaseRecord =
>> +    Specifier->getType()->castAs<RecordType>()->getDecl();
>>
>>    DeclarationName N = DeclarationName::getFromOpaquePtr(Name);
>>    for (Path.Decls = BaseRecord->lookup(N);
>> @@ -396,7 +397,8 @@
>>  bool CXXRecordDecl::FindOrdinaryMember(const CXXBaseSpecifier *Specifier,
>>                                         CXXBasePath &Path,
>>                                         void *Name) {
>> -  RecordDecl *BaseRecord = Specifier->getType()->getAs<RecordType>()->getDecl();
>> +  RecordDecl *BaseRecord =
>> +    Specifier->getType()->castAs<RecordType>()->getDecl();
>>
>>    const unsigned IDNS = IDNS_Ordinary | IDNS_Tag | IDNS_Member;
>>    DeclarationName N = DeclarationName::getFromOpaquePtr(Name);
>> @@ -414,7 +416,8 @@
>>  FindNestedNameSpecifierMember(const CXXBaseSpecifier *Specifier,
>>                                CXXBasePath &Path,
>>                                void *Name) {
>> -  RecordDecl *BaseRecord = Specifier->getType()->getAs<RecordType>()->getDecl();
>> +  RecordDecl *BaseRecord =
>> +    Specifier->getType()->castAs<RecordType>()->getDecl();
>>
>>    DeclarationName N = DeclarationName::getFromOpaquePtr(Name);
>>    for (Path.Decls = BaseRecord->lookup(N);
>> @@ -692,7 +695,7 @@
>>             "Cannot get indirect primary bases for class with dependent bases.");
>>
>>      const CXXRecordDecl *BaseDecl =
>> -      cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
>> +      cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl());
>>
>>      // Only bases with virtual bases participate in computing the
>>      // indirect primary virtual base classes.
>>
>> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=162468&r1=162467&r2=162468&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
>> +++ cfe/trunk/lib/AST/ExprConstant.cpp Thu Aug 23 15:46:57 2012
>> @@ -953,7 +953,7 @@
>>    if (VD)
>>      Info.Note(VD->getLocation(), diag::note_declared_at);
>>    else
>> -    Info.Note(Base.dyn_cast<const Expr*>()->getExprLoc(),
>> +    Info.Note(Base.get<const Expr*>()->getExprLoc(),
>>                diag::note_constexpr_temporary_here);
>>  }
>>
>> @@ -2586,7 +2586,7 @@
>>      const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl());
>>      if (!FD) return Error(E);
>>      assert(!FD->getType()->isReferenceType() && "prvalue reference?");
>> -    assert(BaseTy->getAs<RecordType>()->getDecl()->getCanonicalDecl() ==
>> +    assert(BaseTy->castAs<RecordType>()->getDecl()->getCanonicalDecl() ==
>>             FD->getParent()->getCanonicalDecl() && "record / field mismatch");
>>
>>      SubobjectDesignator Designator(BaseTy);
>> @@ -2665,7 +2665,7 @@
>>      if (E->isArrow()) {
>>        if (!EvaluatePointer(E->getBase(), Result, this->Info))
>>          return false;
>> -      BaseTy = E->getBase()->getType()->getAs<PointerType>()->getPointeeType();
>> +      BaseTy = E->getBase()->getType()->castAs<PointerType>()->getPointeeType();
>>      } else if (E->getBase()->isRValue()) {
>>        assert(E->getBase()->getType()->isRecordType());
>>        if (!EvaluateTemporary(E->getBase(), Result, this->Info))
>> @@ -3036,7 +3036,7 @@
>>    if (E->getOpcode() == BO_Sub)
>>      AdditionalOffset = -AdditionalOffset;
>>
>> -  QualType Pointee = PExp->getType()->getAs<PointerType>()->getPointeeType();
>> +  QualType Pointee = PExp->getType()->castAs<PointerType>()->getPointeeType();
>>    return HandleLValueArrayAdjustment(Info, E, Result, Pointee,
>>                                       AdditionalOffset);
>>  }
>> @@ -5176,7 +5176,7 @@
>>      QualType Ty = E->getTypeOfArgument();
>>
>>      if (Ty->isVectorType()) {
>> -      unsigned n = Ty->getAs<VectorType>()->getNumElements();
>> +      unsigned n = Ty->castAs<VectorType>()->getNumElements();
>>
>>        // The vec_step built-in functions that take a 3-component
>>        // vector return 4. (OpenCL 1.1 spec 6.11.12)
>> @@ -5753,7 +5753,7 @@
>>  }
>>
>>  bool ComplexExprEvaluator::ZeroInitialization(const Expr *E) {
>> -  QualType ElemTy = E->getType()->getAs<ComplexType>()->getElementType();
>> +  QualType ElemTy = E->getType()->castAs<ComplexType>()->getElementType();
>>    if (ElemTy->isRealFloatingType()) {
>>      Result.makeComplexFloat();
>>      APFloat Zero = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(ElemTy));
>> @@ -5911,9 +5911,9 @@
>>      if (!Visit(E->getSubExpr()))
>>        return false;
>>
>> -    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
>> +    QualType To = E->getType()->castAs<ComplexType>()->getElementType();
>>      QualType From
>> -      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
>> +      = E->getSubExpr()->getType()->castAs<ComplexType>()->getElementType();
>>      Result.makeComplexFloat();
>>      return HandleIntToFloatCast(Info, E, From, Result.IntReal,
>>                                  To, Result.FloatReal) &&
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list