Implement bad cast checks using control flow integrity information.
This scheme checks that pointer and lvalue casts are made to an object of
the correct dynamic type; that is, the dynamic type of the object must be
a derived class of the pointee type of the cast. The checks are currently
only introduced where the class being casted to is a polymorphic class.
Differential Revision: http://reviews.llvm.org/D8312
llvm-svn: 232241
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 557b62f..8c526ce 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -48,7 +48,7 @@
RecoverableByDefault = Undefined | Integer,
Unrecoverable = Address | Unreachable | Return,
LegacyFsanitizeRecoverMask = Undefined | Integer,
- NeedsLTO = CFIVptr,
+ NeedsLTO = CFIDerivedCast | CFIUnrelatedCast | CFIVptr,
};
}
@@ -150,7 +150,7 @@
}
bool SanitizerArgs::needsLTO() const {
- return hasOneOf(Sanitizers, CFIVptr);
+ return hasOneOf(Sanitizers, NeedsLTO);
}
void SanitizerArgs::clear() {