diff options
-rw-r--r-- | lib/ubsan/ubsan_handlers.cc | 2 | ||||
-rw-r--r-- | lib/ubsan/ubsan_handlers.h | 1 | ||||
-rw-r--r-- | test/ubsan/TestCases/Misc/nonnull.cpp | 6 |
3 files changed, 7 insertions, 2 deletions
diff --git a/lib/ubsan/ubsan_handlers.cc b/lib/ubsan/ubsan_handlers.cc index 7a18b8c02..2a0e105cc 100644 --- a/lib/ubsan/ubsan_handlers.cc +++ b/lib/ubsan/ubsan_handlers.cc @@ -340,6 +340,8 @@ static void handleNonNullReturn(NonNullReturnData *Data, ReportOptions Opts) { Diag(Loc, DL_Error, "null pointer returned from function declared to never " "return null"); + if (!Data->AttrLoc.isInvalid()) + Diag(Data->AttrLoc, DL_Note, "returns_nonnull attribute specified here"); } void __ubsan::__ubsan_handle_nonnull_return(NonNullReturnData *Data) { diff --git a/lib/ubsan/ubsan_handlers.h b/lib/ubsan/ubsan_handlers.h index e4b1b0b4c..49f4ca0e2 100644 --- a/lib/ubsan/ubsan_handlers.h +++ b/lib/ubsan/ubsan_handlers.h @@ -125,6 +125,7 @@ RECOVERABLE(function_type_mismatch, struct NonNullReturnData { SourceLocation Loc; + SourceLocation AttrLoc; }; /// \brief Handle returning null from function with returns_nonnull attribute. diff --git a/test/ubsan/TestCases/Misc/nonnull.cpp b/test/ubsan/TestCases/Misc/nonnull.cpp index 8b5fcaf43..c3ab49c11 100644 --- a/test/ubsan/TestCases/Misc/nonnull.cpp +++ b/test/ubsan/TestCases/Misc/nonnull.cpp @@ -2,10 +2,12 @@ // RUN: %run %t foo // RUN: %run %t 2>&1 | FileCheck %s -__attribute__((returns_nonnull)) +__attribute__((returns_nonnull)) char *foo(char *a); + char *foo(char *a) { return a; - // CHECK: nonnull.cpp:[[@LINE+1]]:1: runtime error: null pointer returned from function declared to never return null + // CHECK: nonnull.cpp:[[@LINE+2]]:1: runtime error: null pointer returned from function declared to never return null + // CHECK-NEXT: nonnull.cpp:[[@LINE-5]]:16: note: returns_nonnull attribute specified here } int main(int argc, char **argv) { |