mgrang created this revision. mgrang added reviewers: rsmith, efriedma, rnk, dblaikie.
Running the PREfast static analysis tool on clang resulted in several null pointer dereference warnings. This is the first of several patches to fix these. The full list of warnings reported is here: https://docs.google.com/spreadsheets/d/1h_3tHxsgBampxb7PXoB5lgwiBSpTty9RLe5maIQxnTk/edit#gid=2014408543 https://reviews.llvm.org/D78853 Files: clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaDeclCXX.cpp clang/lib/Sema/SemaExpr.cpp clang/lib/Sema/SemaExprCXX.cpp clang/lib/Sema/SemaExprObjC.cpp clang/lib/Sema/SemaInit.cpp clang/lib/Sema/SemaOverload.cpp clang/lib/Sema/SemaTemplateInstantiateDecl.cpp clang/lib/Sema/SemaTemplateVariadic.cpp clang/lib/Sema/SemaType.cpp clang/lib/Sema/TreeTransform.h
Index: clang/lib/Sema/TreeTransform.h =================================================================== --- clang/lib/Sema/TreeTransform.h +++ clang/lib/Sema/TreeTransform.h @@ -13921,7 +13921,7 @@ } // Determine whether this should be a builtin operation. - if (Op == OO_Subscript) { + if (Op == OO_Subscript && Second) { if (!First->getType()->isOverloadableType() && !Second->getType()->isOverloadableType()) return getSema().CreateBuiltinArraySubscriptExpr( Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -8289,7 +8289,7 @@ // unless it's actually needed. if (Tag || IFace) { // Avoid diagnosing invalid decls as incomplete. - if (Def->isInvalidDecl()) + if (Def && Def->isInvalidDecl()) return true; // Give the external AST source a chance to complete the type. Index: clang/lib/Sema/SemaTemplateVariadic.cpp =================================================================== --- clang/lib/Sema/SemaTemplateVariadic.cpp +++ clang/lib/Sema/SemaTemplateVariadic.cpp @@ -765,6 +765,8 @@ // retain an expansion. if (NumPartialExpansions) { if (NumExpansions && *NumExpansions < *NumPartialExpansions) { + assert(CurrentInstantiationScope && "!CurrentInstantiationScope"); + NamedDecl *PartialPack = CurrentInstantiationScope->getPartiallySubstitutedPack(); Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_partial) Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -5186,7 +5186,7 @@ LocalEagerInstantiationScope LocalInstantiations(*this); VarDecl *OldVar = Var; - if (Def->isStaticDataMember() && !Def->isOutOfLine()) { + if (Def && Def->isStaticDataMember() && !Def->isOutOfLine()) { // We're instantiating an inline static data member whose definition was // provided inside the class. InstantiateVariableInitializer(Var, Def, TemplateArgs); Index: clang/lib/Sema/SemaOverload.cpp =================================================================== --- clang/lib/Sema/SemaOverload.cpp +++ clang/lib/Sema/SemaOverload.cpp @@ -10413,7 +10413,8 @@ !ToRefTy->getPointeeType()->isIncompleteType() && S.IsDerivedFrom(SourceLocation(), ToRefTy->getPointeeType(), FromTy)) { BaseToDerivedConversion = 3; - } else if (ToTy->isLValueReferenceType() && !FromExpr->isLValue() && + } else if (ToTy->isLValueReferenceType() && FromExpr && + !FromExpr->isLValue() && ToTy.getNonReferenceType().getCanonicalType() == FromTy.getNonReferenceType().getCanonicalType()) { S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_lvalue) Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -5912,11 +5912,11 @@ DeclAccessPair dap; if (isLibstdcxxPointerReturnFalseHack(S, Entity, Initializer)) { AddZeroInitializationStep(Entity.getType()); - } else if (Initializer->getType() == Context.OverloadTy && + } else if (Initializer && Initializer->getType() == Context.OverloadTy && !S.ResolveAddressOfOverloadedFunction(Initializer, DestType, false, dap)) SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); - else if (Initializer->getType()->isFunctionType() && + else if (Initializer && Initializer->getType()->isFunctionType() && isExprAnUnaddressableFunction(S, Initializer)) SetFailed(InitializationSequence::FK_AddressOfUnaddressableFunction); else Index: clang/lib/Sema/SemaExprObjC.cpp =================================================================== --- clang/lib/Sema/SemaExprObjC.cpp +++ clang/lib/Sema/SemaExprObjC.cpp @@ -589,6 +589,8 @@ } BoxingMethod = StringWithUTF8StringMethod; + assert(BoxingMethod && "!BoxingMethod"); + BoxedType = NSStringPointer; // Transfer the nullability from method's return type. Optional<NullabilityKind> Nullability = Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -597,11 +597,11 @@ } } - if (E->getType()->isVariablyModifiedType()) + if (E && E->getType()->isVariablyModifiedType()) return ExprError(Diag(TypeidLoc, diag::err_variably_modified_typeid) << E->getType()); else if (!inTemplateInstantiation() && - E->HasSideEffects(Context, WasEvaluated)) { + E && E->HasSideEffects(Context, WasEvaluated)) { // The expression operand for typeid is in an unevaluated expression // context, so side effects could result in unintended consequences. Diag(E->getExprLoc(), WasEvaluated Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -4556,7 +4556,7 @@ // resolution for the operator overload should get the first crack // at the overload. bool IsMSPropertySubscript = false; - if (base->getType()->isNonOverloadPlaceholderType()) { + if (base && base->getType()->isNonOverloadPlaceholderType()) { IsMSPropertySubscript = isMSPropertySubscriptExpr(*this, base); if (!IsMSPropertySubscript) { ExprResult result = CheckPlaceholderExpr(base); Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -639,6 +639,7 @@ // C++11 [dcl.constexpr]p1: If any declaration of a function or function // template has a constexpr specifier then all its declarations shall // contain the constexpr specifier. + assert(Old && "!Old"); if (New->getConstexprKind() != Old->getConstexprKind()) { Diag(New->getLocation(), diag::err_constexpr_redecl_mismatch) << New << New->getConstexprKind() << Old->getConstexprKind(); @@ -1293,6 +1294,8 @@ } } + assert(BestPath && "!BestPath"); + // ... unambiguous ... QualType BaseType = BestPath->back().Base->getType(); if (Paths.isAmbiguous(S.Context.getCanonicalType(BaseType))) { @@ -2673,7 +2676,7 @@ const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl()); if (Class->isInterface() && (!RD->isInterfaceLike() || - KnownBase->getAccessSpecifier() != AS_public)) { + (KnownBase && KnownBase->getAccessSpecifier() != AS_public))) { // The Microsoft extension __interface does not permit bases that // are not themselves public interfaces. Diag(KnownBase->getBeginLoc(), diag::err_invalid_base_in_interface) Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -6500,6 +6500,8 @@ << NewDecl; S.Diag(OldDecl->getLocation(), diag::note_previous_declaration); NewDecl->dropAttr<DLLImportAttr>(); + + assert(NewImportAttr && "!NewImportAttr"); NewDecl->addAttr( DLLExportAttr::CreateImplicit(S.Context, NewImportAttr->getRange())); } else { @@ -10433,7 +10435,7 @@ // Main isn't allowed to become a multiversion function, however it IS // permitted to have 'main' be marked with the 'target' optimization hint. - if (NewFD->isMain()) { + if (NewTA && NewFD->isMain()) { if ((MVType == MultiVersionKind::Target && NewTA->isDefaultVersion()) || MVType == MultiVersionKind::CPUDispatch || MVType == MultiVersionKind::CPUSpecific) { @@ -13199,6 +13201,8 @@ Deduced = DT->getDeducedType(); DeducedDecl = D; } else if (!Context.hasSameType(DT->getDeducedType(), Deduced)) { + assert(DeducedDecl && "!DeducedDecl"); + auto *AT = dyn_cast<AutoType>(DT); Diag(D->getTypeSourceInfo()->getTypeLoc().getBeginLoc(), diag::err_auto_different_deductions)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits