diff options
| author | Nick Lewycky <nicholas@mxc.ca> | 2016-05-14 17:44:14 +0000 |
|---|---|---|
| committer | Nick Lewycky <nicholas@mxc.ca> | 2016-05-14 17:44:14 +0000 |
| commit | 2eeddfb1efc8200468725c50647e3b250b28e902 (patch) | |
| tree | 1c8b72219c1fce87621af755a546b18ce7ef6e63 /clang/lib/Sema/SemaInit.cpp | |
| parent | 962b2cda9cfa93b48aa044783209a3939d66b73d (diff) | |
| download | bcm5719-llvm-2eeddfb1efc8200468725c50647e3b250b28e902.tar.gz bcm5719-llvm-2eeddfb1efc8200468725c50647e3b250b28e902.zip | |
Warn when a reference is bound to an empty l-value (dereferenced null pointer).
llvm-svn: 269572
Diffstat (limited to 'clang/lib/Sema/SemaInit.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 3563bf7b184..c162007349c 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -6168,6 +6168,20 @@ static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr, << FixItHint::CreateRemoval(SourceRange(RParen, RParen)); } +static void CheckForNullPointerDereference(Sema &S, const Expr *E) { + // Check to see if we are dereferencing a null pointer. If so, this is + // undefined behavior, so warn about it. This only handles the pattern + // "*null", which is a very syntactic check. + if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E->IgnoreParenCasts())) + if (UO->getOpcode() == UO_Deref && + UO->getSubExpr()->IgnoreParenCasts()-> + isNullPointerConstant(S.Context, Expr::NPC_ValueDependentIsNotNull)) { + S.DiagRuntimeBehavior(UO->getOperatorLoc(), UO, + S.PDiag(diag::warn_binding_null_to_reference) + << UO->getSubExpr()->getSourceRange()); + } +} + ExprResult InitializationSequence::Perform(Sema &S, const InitializedEntity &Entity, @@ -6420,6 +6434,7 @@ InitializationSequence::Perform(Sema &S, /*IsInitializerList=*/false, ExtendingEntity->getDecl()); + CheckForNullPointerDereference(S, CurInit.get()); break; case SK_BindReferenceToTemporary: { |

