summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ubsan/ubsan_handlers.cc2
-rw-r--r--lib/ubsan/ubsan_handlers.h1
-rw-r--r--test/ubsan/TestCases/Misc/nonnull.cpp6
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) {