Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / base / debug / asan_invalid_access.cc
index ff7788a..cee2106 100644 (file)
@@ -16,7 +16,13 @@ namespace debug {
 
 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).
@@ -39,7 +45,8 @@ NOINLINE void CorruptMemoryBlock(bool induce_crash) {
     CHECK(false);
   delete[] array;
 }
-#endif
+#pragma warning(pop)
+#endif  // SYZYASAN && COMPILER_MSVC
 
 }  // namespace
 
@@ -47,7 +54,7 @@ NOINLINE void CorruptMemoryBlock(bool induce_crash) {
 // 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]);
@@ -63,7 +70,11 @@ void AsanHeapUnderflow() {
   // 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));
 }
 
@@ -80,7 +91,7 @@ void AsanHeapUseAfterFree() {
 
 #endif  // ADDRESS_SANITIZER || SYZYASAN
 
-#if defined(SYZYASAN)
+#if defined(SYZYASAN) && defined(COMPILER_MSVC)
 void AsanCorruptHeapBlock() {
   CorruptMemoryBlock(false);
 }
@@ -88,7 +99,7 @@ void AsanCorruptHeapBlock() {
 void AsanCorruptHeap() {
   CorruptMemoryBlock(true);
 }
-#endif  // SYZYASAN
+#endif  // SYZYASAN && COMPILER_MSVC
 
 }  // namespace debug
 }  // namespace base