namespace {
-#if defined(SYZYASAN)
+#if defined(SYZYASAN) && defined(COMPILER_MSVC)
+// Disable warning C4530: "C++ exception handler used, but unwind semantics are
+// not enabled". We don't want to change the compilation flags just for this
+// test, and no exception should be triggered here, so this warning has no value
+// here.
+#pragma warning(push)
+#pragma warning(disable: 4530)
// Corrupt a memory block and make sure that the corruption gets detected either
// when we free it or when another crash happens (if |induce_crash| is set to
// true).
CHECK(false);
delete[] array;
}
-#endif
+#pragma warning(pop)
+#endif // SYZYASAN && COMPILER_MSVC
} // namespace
// NOTE(sebmarchand): We intentionally perform some invalid heap access here in
// order to trigger an AddressSanitizer (ASan) error report.
-static const int kArraySize = 5;
+static const size_t kArraySize = 5;
void AsanHeapOverflow() {
scoped_ptr<int[]> array(new int[kArraySize]);
// Declares the dummy value as volatile to make sure it doesn't get optimized
// away.
int volatile dummy = 0;
- dummy = array[-1];
+ // We need to store the underflow address in a temporary variable as trying to
+ // access array[-1] will trigger a warning C4245: "conversion from 'int' to
+ // 'size_t', signed/unsigned mismatch".
+ int* underflow_address = &array[0] - 1;
+ dummy = *underflow_address;
base::debug::Alias(const_cast<int*>(&dummy));
}
#endif // ADDRESS_SANITIZER || SYZYASAN
-#if defined(SYZYASAN)
+#if defined(SYZYASAN) && defined(COMPILER_MSVC)
void AsanCorruptHeapBlock() {
CorruptMemoryBlock(false);
}
void AsanCorruptHeap() {
CorruptMemoryBlock(true);
}
-#endif // SYZYASAN
+#endif // SYZYASAN && COMPILER_MSVC
} // namespace debug
} // namespace base