Skip to content

Commit

Permalink
[ubsan] Null-check and adjust TypeLoc before using it
Browse files Browse the repository at this point in the history
Null-check and adjut a TypeLoc before casting it to a FunctionTypeLoc.
This fixes a crash in -fsanitize=nullability-return, and also makes the
location of the nonnull type available when the return type is adjusted.

rdar://59263039

Differential Revision: https://reviews.llvm.org/D74355
  • Loading branch information
vedantk committed Feb 10, 2020
1 parent 7683a08 commit 8b81ebf
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
2 changes: 1 addition & 1 deletion clang/lib/CodeGen/CGCall.cpp
Expand Up @@ -3060,7 +3060,7 @@ void CodeGenFunction::EmitReturnValueCheck(llvm::Value *RV) {
} else {
if (auto *DD = dyn_cast<DeclaratorDecl>(CurCodeDecl))
if (auto *TSI = DD->getTypeSourceInfo())
if (auto FTL = TSI->getTypeLoc().castAs<FunctionTypeLoc>())
if (auto FTL = TSI->getTypeLoc().getAsAdjusted<FunctionTypeLoc>())
AttrLoc = FTL.getReturnLoc().findNullabilityLoc();
CheckKind = SanitizerKind::NullabilityReturn;
Handler = SanitizerHandler::NullabilityReturn;
Expand Down
19 changes: 19 additions & 0 deletions clang/test/CodeGenObjCXX/ubsan-nullability-return-notypeloc.mm
@@ -0,0 +1,19 @@
// RUN: %clang_cc1 -fsanitize=nullability-return -emit-llvm %s -o - -triple x86_64-apple-macosx10.10.0 | FileCheck %s

// CHECK: [[ATTR_LOC:@[0-9]+]] = {{.*}} global { {{.*}} i32 15, i32 38

// CHECK-LABEL: define i8* @_Z3foov()
// CHECK: [[CALL:%.*]] = call i8* @_Z6helperv()
// CHECK: icmp ne i8* [[CALL]]
// CHECK: call void @__ubsan_handle_nullability_return_v1_abort({{.*}}[[ATTR_LOC]]

struct S {
using PtrTy = id;
};

#pragma clang assume_nonnull begin
__attribute__((ns_returns_retained)) S::PtrTy foo(void) {
extern S::PtrTy helper(void);
return helper();
}
#pragma clang assume_nonnull end

0 comments on commit 8b81ebf

Please sign in to comment.