summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2017-12-18 13:51:46 +0000
committerStephan Bergmann <sbergman@redhat.com>2017-12-18 13:51:46 +0000
commitf84f696f177bddf93843c4c780e4e9718513e9bd (patch)
tree650aaa403de650b66e314a9f441b0a41b0b68353 /lib
parent4b787a08f59576b523733b556200287ea54fdc05 (diff)
Revert r320977 "No -fsanitize=function warning when calling noexcept function through non-noexcept pointer in C++17"
At least <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-android/ builds/6013/steps/annotate/logs/stdio> complains about __ubsan::__ubsan_handle_function_type_mismatch_abort (compiler-rt lib/ubsan/ubsan_handlers.cc) returning now despite being declared 'noreturn', so looks like a different approach is needed for the function_type_mismatch check to be called also in cases that may ultimately succeed. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@320981 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/ubsan/ubsan_handlers.cc56
-rw-r--r--lib/ubsan/ubsan_handlers.h3
2 files changed, 9 insertions, 50 deletions
diff --git a/lib/ubsan/ubsan_handlers.cc b/lib/ubsan/ubsan_handlers.cc
index 064d9b78c..1112ce1cc 100644
--- a/lib/ubsan/ubsan_handlers.cc
+++ b/lib/ubsan/ubsan_handlers.cc
@@ -18,9 +18,6 @@
#include "sanitizer_common/sanitizer_common.h"
-#include <cstring>
-#include <typeinfo>
-
using namespace __sanitizer;
using namespace __ubsan;
@@ -464,50 +461,14 @@ void __ubsan::__ubsan_handle_invalid_builtin_abort(InvalidBuiltinData *Data) {
Die();
}
-// Check that TI2 represents the same function type as TI1, except that TI2 has
-// "noexcept" and TI1 does not.
-static bool checkForAddedNoexcept(const std::type_info *TI1,
- const std::type_info *TI2) {
- const char *Mangled1 = TI1->name();
- const char *Mangled2 = TI2->name();
-
- // Skip <CV-qualifiers>.
- if (*Mangled1 == 'V') {
- if (*Mangled2 != 'V')
- return false;
- ++Mangled1;
- ++Mangled2;
- }
- if (*Mangled1 == 'K') {
- if (*Mangled2 != 'K')
- return false;
- ++Mangled1;
- ++Mangled2;
- }
-
- // Check for "Do" <exception-spec>.
- if (*Mangled2++ != 'D' || *Mangled2++ != 'o')
- return false;
-
- // Check remainder is identical.
- return std::strcmp(Mangled1, Mangled2) == 0;
-}
-
-static bool handleFunctionTypeMismatch(FunctionTypeMismatchData *Data,
- ValueHandle Function, ValueHandle RTTI,
+static void handleFunctionTypeMismatch(FunctionTypeMismatchData *Data,
+ ValueHandle Function,
ReportOptions Opts) {
- if (Data->NonNoexceptRTTI &&
- checkForAddedNoexcept(
- reinterpret_cast<std::type_info *>(Data->NonNoexceptRTTI),
- reinterpret_cast<std::type_info *>(RTTI))) {
- return false;
- }
-
SourceLocation CallLoc = Data->Loc.acquire();
ErrorType ET = ErrorType::FunctionTypeMismatch;
if (ignoreReport(CallLoc, Opts, ET))
- return true;
+ return;
ScopedReport R(Opts, CallLoc, ET);
@@ -520,21 +481,20 @@ static bool handleFunctionTypeMismatch(FunctionTypeMismatchData *Data,
"call to function %0 through pointer to incorrect function type %1")
<< FName << Data->Type;
Diag(FLoc, DL_Note, "%0 defined here") << FName;
- return true;
}
void
__ubsan::__ubsan_handle_function_type_mismatch(FunctionTypeMismatchData *Data,
- ValueHandle Function, ValueHandle RTTI) {
+ ValueHandle Function) {
GET_REPORT_OPTIONS(false);
- handleFunctionTypeMismatch(Data, Function, RTTI, Opts);
+ handleFunctionTypeMismatch(Data, Function, Opts);
}
void __ubsan::__ubsan_handle_function_type_mismatch_abort(
- FunctionTypeMismatchData *Data, ValueHandle Function, ValueHandle RTTI) {
+ FunctionTypeMismatchData *Data, ValueHandle Function) {
GET_REPORT_OPTIONS(true);
- if (handleFunctionTypeMismatch(Data, Function, RTTI, Opts))
- Die();
+ handleFunctionTypeMismatch(Data, Function, Opts);
+ Die();
}
static void handleNonNullReturn(NonNullReturnData *Data, SourceLocation *LocPtr,
diff --git a/lib/ubsan/ubsan_handlers.h b/lib/ubsan/ubsan_handlers.h
index 4ec2592e3..311776b9f 100644
--- a/lib/ubsan/ubsan_handlers.h
+++ b/lib/ubsan/ubsan_handlers.h
@@ -140,12 +140,11 @@ RECOVERABLE(invalid_builtin, InvalidBuiltinData *Data)
struct FunctionTypeMismatchData {
SourceLocation Loc;
const TypeDescriptor &Type;
- ValueHandle NonNoexceptRTTI;
};
RECOVERABLE(function_type_mismatch,
FunctionTypeMismatchData *Data,
- ValueHandle Val, ValueHandle RTTI)
+ ValueHandle Val)
struct NonNullReturnData {
SourceLocation AttrLoc;