asan_noinst_test.cc revision a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808
17da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov//===-- asan_noinst_test.cc -----------------------------------------------===// 21e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 31e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// The LLVM Compiler Infrastructure 41e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 51e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is distributed under the University of Illinois Open Source 61e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// License. See LICENSE.TXT for details. 71e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 81e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 91e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is a part of AddressSanitizer, an address sanity checker. 111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This test file should be compiled w/o asan instrumentation. 131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 14d865fecddccebf898ceed24d096fc58fb29a6e57Chandler Carruth 151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_allocator.h" 161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_internal.h" 171e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_mapping.h" 181e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_stack.h" 191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_test_utils.h" 201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 211e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include <assert.h> 221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include <stdio.h> 231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include <stdlib.h> 2479d12e87fbcc1b2342d76367b99b83adf9cbf499Alexander Potapenko#include <string.h> // for memset() 251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include <algorithm> 2679d12e87fbcc1b2342d76367b99b83adf9cbf499Alexander Potapenko#include <vector> 2765199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany#include <limits> 281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 291e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 301e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyTEST(AddressSanitizer, InternalSimpleDeathTest) { 311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany EXPECT_DEATH(exit(1), ""); 321e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 341e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic void MallocStress(size_t n) { 3548ddbef1d051875b2d0b204e8d78300b58d80a85Evgeniy Stepanov u32 seed = my_rand(); 36c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace stack1; 371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack1.trace[0] = 0xa123; 381e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack1.trace[1] = 0xa456; 391e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack1.size = 2; 401e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 41c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace stack2; 421e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack2.trace[0] = 0xb123; 431e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack2.trace[1] = 0xb456; 441e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack2.size = 2; 451e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 46c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace stack3; 471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack3.trace[0] = 0xc123; 481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack3.trace[1] = 0xc456; 491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack3.size = 2; 501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany std::vector<void *> vec; 521e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (size_t i = 0; i < n; i++) { 531e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany if ((i % 3) == 0) { 541e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany if (vec.empty()) continue; 5548ddbef1d051875b2d0b204e8d78300b58d80a85Evgeniy Stepanov size_t idx = my_rand_r(&seed) % vec.size(); 561e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void *ptr = vec[idx]; 571e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany vec[idx] = vec.back(); 581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany vec.pop_back(); 59fe6d91684bcda766593800f6307233f1a33d31f6Kostya Serebryany __asan::asan_free(ptr, &stack1, __asan::FROM_MALLOC); 601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } else { 6148ddbef1d051875b2d0b204e8d78300b58d80a85Evgeniy Stepanov size_t size = my_rand_r(&seed) % 1000 + 1; 6248ddbef1d051875b2d0b204e8d78300b58d80a85Evgeniy Stepanov switch ((my_rand_r(&seed) % 128)) { 631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany case 0: size += 1024; break; 641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany case 1: size += 2048; break; 651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany case 2: size += 4096; break; 661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 6748ddbef1d051875b2d0b204e8d78300b58d80a85Evgeniy Stepanov size_t alignment = 1 << (my_rand_r(&seed) % 10 + 1); 68fe6d91684bcda766593800f6307233f1a33d31f6Kostya Serebryany char *ptr = (char*)__asan::asan_memalign(alignment, size, 69fe6d91684bcda766593800f6307233f1a33d31f6Kostya Serebryany &stack2, __asan::FROM_MALLOC); 701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany vec.push_back(ptr); 711e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany ptr[0] = 0; 721e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany ptr[size-1] = 0; 731e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany ptr[size/2] = 0; 741e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (size_t i = 0; i < vec.size(); i++) 77fe6d91684bcda766593800f6307233f1a33d31f6Kostya Serebryany __asan::asan_free(vec[i], &stack3, __asan::FROM_MALLOC); 781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 791e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 801e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 811e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyTEST(AddressSanitizer, NoInstMallocTest) { 821e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#ifdef __arm__ 831e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany MallocStress(300000); 841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#else 851e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany MallocStress(1000000); 861e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif 871e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 881e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 893f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic void PrintShadow(const char *tag, uptr ptr, size_t size) { 901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany fprintf(stderr, "%s shadow: %lx size % 3ld: ", tag, (long)ptr, (long)size); 913f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany uptr prev_shadow = 0; 92ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryany for (sptr i = -32; i < (sptr)size + 32; i++) { 933f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany uptr shadow = __asan::MemToShadow(ptr + i); 94ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryany if (i == 0 || i == (sptr)size) 951e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany fprintf(stderr, "."); 961e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany if (shadow != prev_shadow) { 971e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany prev_shadow = shadow; 98ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryany fprintf(stderr, "%02x", (int)*(u8*)shadow); 991e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 1001e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 1011e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany fprintf(stderr, "\n"); 1021e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 1031e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1041e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyTEST(AddressSanitizer, DISABLED_InternalPrintShadow) { 1051e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (size_t size = 1; size <= 513; size++) { 1061e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany char *ptr = new char[size]; 1073f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany PrintShadow("m", (uptr)ptr, size); 1081e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany delete [] ptr; 1093f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany PrintShadow("f", (uptr)ptr, size); 1101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 1111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 1121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 1133f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryanystatic uptr pc_array[] = { 1145af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryany#if SANITIZER_WORDSIZE == 64 1151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbf756068ULL, 1161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbf75e5abULL, 1171e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc0625b7cULL, 1181e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc05b8997ULL, 1191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbf990577ULL, 1201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbf990c56ULL, 1211e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbf992f3cULL, 1221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbf950c22ULL, 1231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc036dba0ULL, 1241e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc03638a3ULL, 1251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc035be4aULL, 1261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc0539c45ULL, 1271e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc0539a65ULL, 1281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc03db9b3ULL, 1291e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc03db100ULL, 1301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc037c7b8ULL, 1311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc037bfffULL, 1321e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc038b777ULL, 1331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc038021cULL, 1341e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc037c7d1ULL, 1351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc037bfffULL, 1361e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc038b777ULL, 1371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc038021cULL, 1381e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc037c7d1ULL, 1391e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc037bfffULL, 1401e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc038b777ULL, 1411e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc038021cULL, 1421e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc037c7d1ULL, 1431e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc037bfffULL, 1441e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc0520d26ULL, 1451e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc009ddffULL, 1461e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbf90bb50ULL, 1471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbdddfa69ULL, 1481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbdde1fe2ULL, 1491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbdde2424ULL, 1501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbdde27b3ULL, 1511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbddee53bULL, 1521e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbdde1988ULL, 1531e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbdde0904ULL, 1541e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effc106ce0dULL, 1551e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbcc3fa04ULL, 1561e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbcc3f6a4ULL, 1571e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbcc3e726ULL, 1581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effbcc40852ULL, 1591e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7effb681ec4dULL, 1605af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryany#endif // SANITIZER_WORDSIZE 1611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xB0B5E768, 1621e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7B682EC1, 1631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x367F9918, 1641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xAE34E13, 1651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xBA0C6C6, 1661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x13250F46, 1671e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xA0D6A8AB, 1681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x2B07C1A8, 1691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x6C844F4A, 1701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x2321B53, 1711e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x1F3D4F8F, 1721e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x3FE2924B, 1731e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xB7A2F568, 1741e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xBD23950A, 1751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x61020930, 1761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x33E7970C, 1771e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x405998A1, 1781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x59F3551D, 1791e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x350E3028, 1801e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xBC55A28D, 1811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x361F3AED, 1821e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xBEAD0F73, 1831e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xAEF28479, 1841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x757E971F, 1851e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xAEBA450, 1861e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x43AD22F5, 1871e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x8C2C50C4, 1881e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7AD8A2E1, 1891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x69EE4EE8, 1901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xC08DFF, 1911e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x4BA6538, 1921e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x3708AB2, 1931e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xC24B6475, 1941e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x7C8890D7, 1951e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x6662495F, 1961e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x9B641689, 1971e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xD3596B, 1981e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0xA1049569, 1991e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x44CBC16, 2001e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 0x4D39C39F 2011e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}; 2021e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2031e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid CompressStackTraceTest(size_t n_iter) { 20448ddbef1d051875b2d0b204e8d78300b58d80a85Evgeniy Stepanov u32 seed = my_rand(); 205c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany const size_t kNumPcs = ARRAY_SIZE(pc_array); 206ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryany u32 compressed[2 * kNumPcs]; 2071e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2081e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (size_t iter = 0; iter < n_iter; iter++) { 2091e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany std::random_shuffle(pc_array, pc_array + kNumPcs); 210c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace stack0, stack1; 2111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack0.CopyFrom(pc_array, kNumPcs); 21248ddbef1d051875b2d0b204e8d78300b58d80a85Evgeniy Stepanov stack0.size = std::max((size_t)1, (size_t)(my_rand_r(&seed) % stack0.size)); 2131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t compress_size = 21448ddbef1d051875b2d0b204e8d78300b58d80a85Evgeniy Stepanov std::max((size_t)2, (size_t)my_rand_r(&seed) % (2 * kNumPcs)); 2151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t n_frames = 216c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace::CompressStack(&stack0, compressed, compress_size); 2171a7741b4e3c50a986502507fa8055475dd0fa0d0Alexey Samsonov Ident(n_frames); 2181e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany assert(n_frames <= stack0.size); 219c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace::UncompressStack(&stack1, compressed, compress_size); 2201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany assert(stack1.size == n_frames); 2211e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (size_t i = 0; i < stack1.size; i++) { 2221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany assert(stack0.trace[i] == stack1.trace[i]); 2231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 2241e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 2251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 2261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2271e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyTEST(AddressSanitizer, CompressStackTraceTest) { 2281e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany CompressStackTraceTest(10000); 2291e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 2301e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid CompressStackTraceBenchmark(size_t n_iter) { 232c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany const size_t kNumPcs = ARRAY_SIZE(pc_array); 233ee3925515e4c7966f3ef489f687aa7e5692806a9Kostya Serebryany u32 compressed[2 * kNumPcs]; 2341e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany std::random_shuffle(pc_array, pc_array + kNumPcs); 2351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 236c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace stack0; 2371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack0.CopyFrom(pc_array, kNumPcs); 2381e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack0.size = kNumPcs; 2391e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (size_t iter = 0; iter < n_iter; iter++) { 2401e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t compress_size = kNumPcs; 2411e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t n_frames = 242c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace::CompressStack(&stack0, compressed, compress_size); 2431e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany Ident(n_frames); 2441e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 2451e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 2461e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2471e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyTEST(AddressSanitizer, CompressStackTraceBenchmark) { 2481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany CompressStackTraceBenchmark(1 << 24); 2491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 2501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2511e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyTEST(AddressSanitizer, QuarantineTest) { 252c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace stack; 2531e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack.trace[0] = 0x890; 2541e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack.size = 1; 2551e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2561e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany const int size = 32; 2571e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void *p = __asan::asan_malloc(size, &stack); 258fe6d91684bcda766593800f6307233f1a33d31f6Kostya Serebryany __asan::asan_free(p, &stack, __asan::FROM_MALLOC); 2591e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t i; 2601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t max_i = 1 << 30; 2611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (i = 0; i < max_i; i++) { 2621e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void *p1 = __asan::asan_malloc(size, &stack); 263fe6d91684bcda766593800f6307233f1a33d31f6Kostya Serebryany __asan::asan_free(p1, &stack, __asan::FROM_MALLOC); 2641e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany if (p1 == p) break; 2651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 2661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // fprintf(stderr, "i=%ld\n", i); 2671e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany EXPECT_GE(i, 100000U); 2681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany EXPECT_LT(i, max_i); 2691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 2701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2711e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid *ThreadedQuarantineTestWorker(void *unused) { 2721a7741b4e3c50a986502507fa8055475dd0fa0d0Alexey Samsonov (void)unused; 27348ddbef1d051875b2d0b204e8d78300b58d80a85Evgeniy Stepanov u32 seed = my_rand(); 274c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace stack; 2751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack.trace[0] = 0x890; 2761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack.size = 1; 2771e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (size_t i = 0; i < 1000; i++) { 27948ddbef1d051875b2d0b204e8d78300b58d80a85Evgeniy Stepanov void *p = __asan::asan_malloc(1 + (my_rand_r(&seed) % 4000), &stack); 280fe6d91684bcda766593800f6307233f1a33d31f6Kostya Serebryany __asan::asan_free(p, &stack, __asan::FROM_MALLOC); 2811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 2821e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany return NULL; 2831e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 2841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2851e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Check that the thread local allocators are flushed when threads are 2861e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// destroyed. 2871e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyTEST(AddressSanitizer, ThreadedQuarantineTest) { 2881e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany const int n_threads = 3000; 2891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t mmaped1 = __asan_get_heap_size(); 2901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (int i = 0; i < n_threads; i++) { 2911e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany pthread_t t; 2922697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany PTHREAD_CREATE(&t, NULL, ThreadedQuarantineTestWorker, 0); 2932697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany PTHREAD_JOIN(t, 0); 2941e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany size_t mmaped2 = __asan_get_heap_size(); 2951e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany EXPECT_LT(mmaped2 - mmaped1, 320U * (1 << 20)); 2961e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 2971e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 2981e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 2991e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid *ThreadedOneSizeMallocStress(void *unused) { 3001a7741b4e3c50a986502507fa8055475dd0fa0d0Alexey Samsonov (void)unused; 301c3390df6670cb166119b961eb27a033fb9073496Kostya Serebryany __asan::StackTrace stack; 3021e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack.trace[0] = 0x890; 3031e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stack.size = 1; 3041e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany const size_t kNumMallocs = 1000; 3051e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (int iter = 0; iter < 1000; iter++) { 3061e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany void *p[kNumMallocs]; 3071e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (size_t i = 0; i < kNumMallocs; i++) { 3081e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany p[i] = __asan::asan_malloc(32, &stack); 3091e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 3101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (size_t i = 0; i < kNumMallocs; i++) { 311fe6d91684bcda766593800f6307233f1a33d31f6Kostya Serebryany __asan::asan_free(p[i], &stack, __asan::FROM_MALLOC); 3121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 3131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 3141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany return NULL; 3151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 3161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 3171e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyTEST(AddressSanitizer, ThreadedOneSizeMallocStressTest) { 3181e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany const int kNumThreads = 4; 3191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany pthread_t t[kNumThreads]; 3201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (int i = 0; i < kNumThreads; i++) { 3212697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany PTHREAD_CREATE(&t[i], 0, ThreadedOneSizeMallocStress, 0); 3221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 3231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany for (int i = 0; i < kNumThreads; i++) { 3242697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany PTHREAD_JOIN(t[i], 0); 3251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 3261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 327bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 32879d12e87fbcc1b2342d76367b99b83adf9cbf499Alexander PotapenkoTEST(AddressSanitizer, MemsetWildAddressTest) { 329e5ab9688b623a5a0150c7eae1ec1caaf06d44758Kostya Serebryany using __asan::kHighMemEnd; 33079d12e87fbcc1b2342d76367b99b83adf9cbf499Alexander Potapenko typedef void*(*memset_p)(void*, int, size_t); 33179d12e87fbcc1b2342d76367b99b83adf9cbf499Alexander Potapenko // Prevent inlining of memset(). 33279d12e87fbcc1b2342d76367b99b83adf9cbf499Alexander Potapenko volatile memset_p libc_memset = (memset_p)memset; 333bdec26d50b27e082d109acf99f7d713abc51435eKostya Serebryany EXPECT_DEATH(libc_memset((void*)(kLowShadowBeg + 200), 0, 100), 33487b52b910037447eccb92546b24b5e06181a1545Alexey Samsonov (kLowShadowEnd == 0) ? "unknown-crash.*shadow gap" 33587b52b910037447eccb92546b24b5e06181a1545Alexey Samsonov : "unknown-crash.*low shadow"); 336bdec26d50b27e082d109acf99f7d713abc51435eKostya Serebryany EXPECT_DEATH(libc_memset((void*)(kShadowGapBeg + 200), 0, 100), 33779d12e87fbcc1b2342d76367b99b83adf9cbf499Alexander Potapenko "unknown-crash.*shadow gap"); 338bdec26d50b27e082d109acf99f7d713abc51435eKostya Serebryany EXPECT_DEATH(libc_memset((void*)(kHighShadowBeg + 200), 0, 100), 33979d12e87fbcc1b2342d76367b99b83adf9cbf499Alexander Potapenko "unknown-crash.*high shadow"); 34079d12e87fbcc1b2342d76367b99b83adf9cbf499Alexander Potapenko} 34179d12e87fbcc1b2342d76367b99b83adf9cbf499Alexander Potapenko 342bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, GetEstimatedAllocatedSize) { 343376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany#if ASAN_ALLOCATOR_VERSION == 1 344d00ecb64892dcb03c5ae93a654da669b96753b01Alexey Samsonov EXPECT_EQ(1U, __asan_get_estimated_allocated_size(0)); 345376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany#elif ASAN_ALLOCATOR_VERSION == 2 346376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany EXPECT_EQ(0U, __asan_get_estimated_allocated_size(0)); 347376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany#endif 348bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany const size_t sizes[] = { 1, 30, 1<<30 }; 349bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t i = 0; i < 3; i++) { 350bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EQ(sizes[i], __asan_get_estimated_allocated_size(sizes[i])); 351bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 352bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 353bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 354bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic const char* kGetAllocatedSizeErrorMsg = 355bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany "attempting to call __asan_get_allocated_size()"; 356bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 357bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, GetAllocatedSizeAndOwnershipTest) { 358bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany const size_t kArraySize = 100; 359bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany char *array = Ident((char*)malloc(kArraySize)); 360bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany int *int_ptr = Ident(new int); 361bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 362bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Allocated memory is owned by allocator. Allocated size should be 363bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // equal to requested size. 364bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EQ(true, __asan_get_ownership(array)); 365bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EQ(kArraySize, __asan_get_allocated_size(array)); 366bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EQ(true, __asan_get_ownership(int_ptr)); 367bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EQ(sizeof(int), __asan_get_allocated_size(int_ptr)); 368bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 369bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // We cannot call GetAllocatedSize from the memory we didn't map, 370bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // and from the interior pointers (not returned by previous malloc). 371bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany void *wild_addr = (void*)0x1; 372de55be3899b994731ba2d9e168281d608dab3048Alexey Samsonov EXPECT_FALSE(__asan_get_ownership(wild_addr)); 373bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(__asan_get_allocated_size(wild_addr), kGetAllocatedSizeErrorMsg); 37468e8acab81a43ccf849add9272a761dc6b73ee8dKostya Serebryany EXPECT_FALSE(__asan_get_ownership(array + kArraySize / 2)); 375bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(__asan_get_allocated_size(array + kArraySize / 2), 376bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany kGetAllocatedSizeErrorMsg); 377bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 378bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // NULL is not owned, but is a valid argument for __asan_get_allocated_size(). 37968e8acab81a43ccf849add9272a761dc6b73ee8dKostya Serebryany EXPECT_FALSE(__asan_get_ownership(NULL)); 380d00ecb64892dcb03c5ae93a654da669b96753b01Alexey Samsonov EXPECT_EQ(0U, __asan_get_allocated_size(NULL)); 381bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 382bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // When memory is freed, it's not owned, and call to GetAllocatedSize 383bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // is forbidden. 384bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(array); 385de55be3899b994731ba2d9e168281d608dab3048Alexey Samsonov EXPECT_FALSE(__asan_get_ownership(array)); 386bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(__asan_get_allocated_size(array), kGetAllocatedSizeErrorMsg); 387bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany delete int_ptr; 388220ba2f6f98d44e1e8a88b4dee8ed456cf54ff33Alexey Samsonov 389220ba2f6f98d44e1e8a88b4dee8ed456cf54ff33Alexey Samsonov void *zero_alloc = Ident(malloc(0)); 390220ba2f6f98d44e1e8a88b4dee8ed456cf54ff33Alexey Samsonov if (zero_alloc != 0) { 391220ba2f6f98d44e1e8a88b4dee8ed456cf54ff33Alexey Samsonov // If malloc(0) is not null, this pointer is owned and should have valid 392220ba2f6f98d44e1e8a88b4dee8ed456cf54ff33Alexey Samsonov // allocated size. 393220ba2f6f98d44e1e8a88b4dee8ed456cf54ff33Alexey Samsonov EXPECT_TRUE(__asan_get_ownership(zero_alloc)); 3940fc2f6935568db9252272bd9c00895255d7f78b9Alexey Samsonov // Allocated size is 0 or 1 depending on the allocator used. 395ca2849c2819b5c7a8771a1e8bc449cf8f5ef6527Alexey Samsonov EXPECT_LT(__asan_get_allocated_size(zero_alloc), 2U); 396220ba2f6f98d44e1e8a88b4dee8ed456cf54ff33Alexey Samsonov } 397220ba2f6f98d44e1e8a88b4dee8ed456cf54ff33Alexey Samsonov free(zero_alloc); 398bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 399bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 400bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, GetCurrentAllocatedBytesTest) { 401bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany size_t before_malloc, after_malloc, after_free; 402bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany char *array; 403bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany const size_t kMallocSize = 100; 404bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany before_malloc = __asan_get_current_allocated_bytes(); 405bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 406bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany array = Ident((char*)malloc(kMallocSize)); 407bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany after_malloc = __asan_get_current_allocated_bytes(); 408bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EQ(before_malloc + kMallocSize, after_malloc); 409bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 410bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(array); 411bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany after_free = __asan_get_current_allocated_bytes(); 412bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EQ(before_malloc, after_free); 413bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 414bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 415bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic void DoDoubleFree() { 416bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany int *x = Ident(new int); 417bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany delete Ident(x); 418bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany delete Ident(x); 419bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 420bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 421376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany#if ASAN_ALLOCATOR_VERSION == 1 422bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany// This test is run in a separate process, so that large malloced 423bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany// chunk won't remain in the free lists after the test. 424bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany// Note: use ASSERT_* instead of EXPECT_* here. 425bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic void RunGetHeapSizeTestAndDie() { 426bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany size_t old_heap_size, new_heap_size, heap_growth; 427bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // We unlikely have have chunk of this size in free list. 428bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany static const size_t kLargeMallocSize = 1 << 29; // 512M 429bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany old_heap_size = __asan_get_heap_size(); 430bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany fprintf(stderr, "allocating %zu bytes:\n", kLargeMallocSize); 431bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(Ident(malloc(kLargeMallocSize))); 432bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany new_heap_size = __asan_get_heap_size(); 433bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany heap_growth = new_heap_size - old_heap_size; 434bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany fprintf(stderr, "heap growth after first malloc: %zu\n", heap_growth); 435bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany ASSERT_GE(heap_growth, kLargeMallocSize); 436bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany ASSERT_LE(heap_growth, 2 * kLargeMallocSize); 437bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 438bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Now large chunk should fall into free list, and can be 439bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // allocated without increasing heap size. 440bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany old_heap_size = new_heap_size; 441bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(Ident(malloc(kLargeMallocSize))); 442bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany heap_growth = __asan_get_heap_size() - old_heap_size; 443bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany fprintf(stderr, "heap growth after second malloc: %zu\n", heap_growth); 444bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany ASSERT_LT(heap_growth, kLargeMallocSize); 445bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 446bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Test passed. Now die with expected double-free. 447bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany DoDoubleFree(); 448bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 449bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 450bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, GetHeapSizeTest) { 451bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(RunGetHeapSizeTestAndDie(), "double-free"); 452bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 453376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany#elif ASAN_ALLOCATOR_VERSION == 2 454376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya SerebryanyTEST(AddressSanitizerInterface, GetHeapSizeTest) { 455376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany // asan_allocator2 does not keep huge chunks in free list, but unmaps them. 456376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany // The chunk should be greater than the quarantine size, 457376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany // otherwise it will be stuck in quarantine instead of being unmaped. 458f1877cf0a314f407ac535ab1606fdac4f9b05026Kostya Serebryany static const size_t kLargeMallocSize = 1 << 29; // 512M 459376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany uptr old_heap_size = __asan_get_heap_size(); 460376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany for (int i = 0; i < 3; i++) { 461376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany // fprintf(stderr, "allocating %zu bytes:\n", kLargeMallocSize); 462376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany free(Ident(malloc(kLargeMallocSize))); 463376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany EXPECT_EQ(old_heap_size, __asan_get_heap_size()); 464376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany } 465376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany} 466376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany#endif 467bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 468bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany// Note: use ASSERT_* instead of EXPECT_* here. 469bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic void DoLargeMallocForGetFreeBytesTestAndDie() { 470376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany#if ASAN_ALLOCATOR_VERSION == 1 471376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany // asan_allocator2 does not keep large chunks in free_lists, so this test 472376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany // will not work. 473bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany size_t old_free_bytes, new_free_bytes; 474bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany static const size_t kLargeMallocSize = 1 << 29; // 512M 475bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // If we malloc and free a large memory chunk, it will not fall 476bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // into quarantine and will be available for future requests. 477bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany old_free_bytes = __asan_get_free_bytes(); 478bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany fprintf(stderr, "allocating %zu bytes:\n", kLargeMallocSize); 479bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany fprintf(stderr, "free bytes before malloc: %zu\n", old_free_bytes); 480bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(Ident(malloc(kLargeMallocSize))); 481bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany new_free_bytes = __asan_get_free_bytes(); 482bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany fprintf(stderr, "free bytes after malloc and free: %zu\n", new_free_bytes); 483bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany ASSERT_GE(new_free_bytes, old_free_bytes + kLargeMallocSize); 484376bab8add6be88f649ef1a9127c7d39e76e5f7bKostya Serebryany#endif // ASAN_ALLOCATOR_VERSION 485bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Test passed. 486bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany DoDoubleFree(); 487bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 488bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 489bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, GetFreeBytesTest) { 490f1877cf0a314f407ac535ab1606fdac4f9b05026Kostya Serebryany#if ASAN_ALLOCATOR_VERSION == 1 491bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Allocate a small chunk. Now allocator probably has a lot of these 492bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // chunks to fulfill future requests. So, future requests will decrease 493f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov // the number of free bytes. Do this only on systems where there 494f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov // is enough memory for such assumptions. 4955af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryany if (SANITIZER_WORDSIZE == 64 && !ASAN_LOW_MEMORY) { 496f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov static const size_t kNumOfChunks = 100; 497f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov static const size_t kChunkSize = 100; 498f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov char *chunks[kNumOfChunks]; 499f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov size_t i; 500f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov size_t old_free_bytes, new_free_bytes; 501f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov chunks[0] = Ident((char*)malloc(kChunkSize)); 502f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov old_free_bytes = __asan_get_free_bytes(); 503f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov for (i = 1; i < kNumOfChunks; i++) { 504f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov chunks[i] = Ident((char*)malloc(kChunkSize)); 505f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov new_free_bytes = __asan_get_free_bytes(); 506f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov EXPECT_LT(new_free_bytes, old_free_bytes); 507f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov old_free_bytes = new_free_bytes; 508f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov } 509f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov for (i = 0; i < kNumOfChunks; i++) 510f70848decb000cc0e4c05a27eed78865d2f38555Alexey Samsonov free(chunks[i]); 511bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 512f1877cf0a314f407ac535ab1606fdac4f9b05026Kostya Serebryany#endif 513bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(DoLargeMallocForGetFreeBytesTestAndDie(), "double-free"); 514bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 515bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 516e52810d7144ca35bbaeca0b28d138b386ab90243Kostya Serebryanystatic const size_t kManyThreadsMallocSizes[] = {5, 1UL<<10, 1UL<<14, 357}; 517bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic const size_t kManyThreadsIterations = 250; 5185af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryanystatic const size_t kManyThreadsNumThreads = 5195af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryany (SANITIZER_WORDSIZE == 32) ? 40 : 200; 520bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 521bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanyvoid *ManyThreadsWithStatsWorker(void *arg) { 5221a7741b4e3c50a986502507fa8055475dd0fa0d0Alexey Samsonov (void)arg; 523bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t iter = 0; iter < kManyThreadsIterations; iter++) { 524bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t size_index = 0; size_index < 4; size_index++) { 525bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(Ident(malloc(kManyThreadsMallocSizes[size_index]))); 526bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 527bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 528e52810d7144ca35bbaeca0b28d138b386ab90243Kostya Serebryany // Just one large allocation. 529e52810d7144ca35bbaeca0b28d138b386ab90243Kostya Serebryany free(Ident(malloc(1 << 20))); 530bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany return 0; 531bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 532bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 533bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, ManyThreadsWithStatsStressTest) { 534bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany size_t before_test, after_test, i; 535bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany pthread_t threads[kManyThreadsNumThreads]; 536bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany before_test = __asan_get_current_allocated_bytes(); 537bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (i = 0; i < kManyThreadsNumThreads; i++) { 5382697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany PTHREAD_CREATE(&threads[i], 0, 539bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany (void* (*)(void *x))ManyThreadsWithStatsWorker, (void*)i); 540bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 541bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (i = 0; i < kManyThreadsNumThreads; i++) { 5422697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany PTHREAD_JOIN(threads[i], 0); 543bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 544bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany after_test = __asan_get_current_allocated_bytes(); 545bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // ASan stats also reflect memory usage of internal ASan RTL structs, 546bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // so we can't check for equality here. 547bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_LT(after_test, before_test + (1UL<<20)); 548bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 549bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 550bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, ExitCode) { 551bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany int original_exit_code = __asan_set_error_exit_code(7); 552bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EXIT(DoDoubleFree(), ::testing::ExitedWithCode(7), ""); 553bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EQ(7, __asan_set_error_exit_code(8)); 554bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EXIT(DoDoubleFree(), ::testing::ExitedWithCode(8), ""); 555bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EQ(8, __asan_set_error_exit_code(original_exit_code)); 556bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EXIT(DoDoubleFree(), 557bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany ::testing::ExitedWithCode(original_exit_code), ""); 558bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 559bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 560bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic void MyDeathCallback() { 561bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany fprintf(stderr, "MyDeathCallback\n"); 562bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 563bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 564bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, DeathCallbackTest) { 565bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_set_death_callback(MyDeathCallback); 566bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(DoDoubleFree(), "MyDeathCallback"); 567bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_set_death_callback(NULL); 568bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 569bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 570bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic const char* kUseAfterPoisonErrorMessage = "use-after-poison"; 571bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 572bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany#define GOOD_ACCESS(ptr, offset) \ 573bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_FALSE(__asan::AddressIsPoisoned((uptr)(ptr + offset))) 574bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 575bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany#define BAD_ACCESS(ptr, offset) \ 576bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_TRUE(__asan::AddressIsPoisoned((uptr)(ptr + offset))) 577bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 578bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, SimplePoisonMemoryRegionTest) { 579bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany char *array = Ident((char*)malloc(120)); 580bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // poison array[40..80) 581bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_poison_memory_region(array + 40, 40); 582bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany GOOD_ACCESS(array, 39); 583bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany GOOD_ACCESS(array, 80); 584bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany BAD_ACCESS(array, 40); 585bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany BAD_ACCESS(array, 60); 586bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany BAD_ACCESS(array, 79); 587bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(__asan_report_error(0, 0, 0, (uptr)(array + 40), true, 1), 588bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany kUseAfterPoisonErrorMessage); 589bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_unpoison_memory_region(array + 40, 40); 590bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // access previously poisoned memory. 591bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany GOOD_ACCESS(array, 40); 592bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany GOOD_ACCESS(array, 79); 593bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(array); 594bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 595bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 596bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, OverlappingPoisonMemoryRegionTest) { 597bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany char *array = Ident((char*)malloc(120)); 598bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Poison [0..40) and [80..120) 599bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_poison_memory_region(array, 40); 600bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_poison_memory_region(array + 80, 40); 601bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany BAD_ACCESS(array, 20); 602bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany GOOD_ACCESS(array, 60); 603bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany BAD_ACCESS(array, 100); 604bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Poison whole array - [0..120) 605bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_poison_memory_region(array, 120); 606bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany BAD_ACCESS(array, 60); 607bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Unpoison [24..96) 608bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_unpoison_memory_region(array + 24, 72); 609bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany BAD_ACCESS(array, 23); 610bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany GOOD_ACCESS(array, 24); 611bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany GOOD_ACCESS(array, 60); 612bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany GOOD_ACCESS(array, 95); 613bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany BAD_ACCESS(array, 96); 614bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(array); 615bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 616bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 617bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, PushAndPopWithPoisoningTest) { 618bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Vector of capacity 20 619bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany char *vec = Ident((char*)malloc(20)); 620bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_poison_memory_region(vec, 20); 621bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t i = 0; i < 7; i++) { 622bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Simulate push_back. 623bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_unpoison_memory_region(vec + i, 1); 624bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany GOOD_ACCESS(vec, i); 625bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany BAD_ACCESS(vec, i + 1); 626bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 627bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t i = 7; i > 0; i--) { 628bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Simulate pop_back. 629bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_poison_memory_region(vec + i - 1, 1); 630bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany BAD_ACCESS(vec, i - 1); 631bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany if (i > 1) GOOD_ACCESS(vec, i - 2); 632bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 633bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(vec); 634bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 635bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 636a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya SerebryanyTEST(AddressSanitizerInterface, GlobalRedzones) { 637a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob1, 1 - 1); 638a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob2, 2 - 1); 639a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob3, 3 - 1); 640a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob4, 4 - 1); 641a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob5, 5 - 1); 642a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob6, 6 - 1); 643a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob7, 7 - 1); 644a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob8, 8 - 1); 645a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob9, 9 - 1); 646a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob10, 10 - 1); 647a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob11, 11 - 1); 648a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob12, 12 - 1); 649a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob13, 13 - 1); 650a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob14, 14 - 1); 651a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob15, 15 - 1); 652a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob16, 16 - 1); 653a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany GOOD_ACCESS(glob17, 17 - 1); 654af5bd2ee59a9f7bea74f43fccc6ea48979b7a4b0Kostya Serebryany GOOD_ACCESS(glob1000, 1000 - 1); 655af5bd2ee59a9f7bea74f43fccc6ea48979b7a4b0Kostya Serebryany GOOD_ACCESS(glob10000, 10000 - 1); 656af5bd2ee59a9f7bea74f43fccc6ea48979b7a4b0Kostya Serebryany GOOD_ACCESS(glob100000, 100000 - 1); 657a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany 658a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob1, 1); 659a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob2, 2); 660a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob3, 3); 661a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob4, 4); 662a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob5, 5); 663a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob6, 6); 664a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob7, 7); 665a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob8, 8); 666a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob9, 9); 667a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob10, 10); 668a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob11, 11); 669a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob12, 12); 670a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob13, 13); 671a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob14, 14); 672a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob15, 15); 673a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob16, 16); 674a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany BAD_ACCESS(glob17, 17); 675af5bd2ee59a9f7bea74f43fccc6ea48979b7a4b0Kostya Serebryany BAD_ACCESS(glob1000, 1000); 676af5bd2ee59a9f7bea74f43fccc6ea48979b7a4b0Kostya Serebryany BAD_ACCESS(glob1000, 1100); // Redzone is at least 101 bytes. 677af5bd2ee59a9f7bea74f43fccc6ea48979b7a4b0Kostya Serebryany BAD_ACCESS(glob10000, 10000); 678af5bd2ee59a9f7bea74f43fccc6ea48979b7a4b0Kostya Serebryany BAD_ACCESS(glob10000, 11000); // Redzone is at least 1001 bytes. 679af5bd2ee59a9f7bea74f43fccc6ea48979b7a4b0Kostya Serebryany BAD_ACCESS(glob100000, 100000); 680af5bd2ee59a9f7bea74f43fccc6ea48979b7a4b0Kostya Serebryany BAD_ACCESS(glob100000, 110000); // Redzone is at least 10001 bytes. 681a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany} 682a3b0e5e4f9f48b2ed0baee10c0236eda7c21c660Kostya Serebryany 683bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany// Make sure that each aligned block of size "2^granularity" doesn't have 684bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany// "true" value before "false" value. 685bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic void MakeShadowValid(bool *shadow, int length, int granularity) { 686bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany bool can_be_poisoned = true; 687bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (int i = length - 1; i >= 0; i--) { 68863201b127e21d6fbfb6de62d0e44a5de01288153Alexey Samsonov if (!shadow[i]) 68963201b127e21d6fbfb6de62d0e44a5de01288153Alexey Samsonov can_be_poisoned = false; 69063201b127e21d6fbfb6de62d0e44a5de01288153Alexey Samsonov if (!can_be_poisoned) 69163201b127e21d6fbfb6de62d0e44a5de01288153Alexey Samsonov shadow[i] = false; 692bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany if (i % (1 << granularity) == 0) { 693bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany can_be_poisoned = true; 694bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 695bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 696bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 697bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 698bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, PoisoningStressTest) { 699bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany const size_t kSize = 24; 700bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany bool expected[kSize]; 701bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany char *arr = Ident((char*)malloc(kSize)); 702bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t l1 = 0; l1 < kSize; l1++) { 703bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t s1 = 1; l1 + s1 <= kSize; s1++) { 704bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t l2 = 0; l2 < kSize; l2++) { 705bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t s2 = 1; l2 + s2 <= kSize; s2++) { 706bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Poison [l1, l1+s1), [l2, l2+s2) and check result. 707bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_unpoison_memory_region(arr, kSize); 708bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_poison_memory_region(arr + l1, s1); 709bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_poison_memory_region(arr + l2, s2); 710bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany memset(expected, false, kSize); 711bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany memset(expected + l1, true, s1); 71263201b127e21d6fbfb6de62d0e44a5de01288153Alexey Samsonov MakeShadowValid(expected, kSize, /*granularity*/ 3); 713bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany memset(expected + l2, true, s2); 71463201b127e21d6fbfb6de62d0e44a5de01288153Alexey Samsonov MakeShadowValid(expected, kSize, /*granularity*/ 3); 715bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t i = 0; i < kSize; i++) { 716bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany ASSERT_EQ(expected[i], __asan_address_is_poisoned(arr + i)); 717bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 718bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Unpoison [l1, l1+s1) and [l2, l2+s2) and check result. 719bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_poison_memory_region(arr, kSize); 720bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_unpoison_memory_region(arr + l1, s1); 721bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_unpoison_memory_region(arr + l2, s2); 722bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany memset(expected, true, kSize); 723bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany memset(expected + l1, false, s1); 72463201b127e21d6fbfb6de62d0e44a5de01288153Alexey Samsonov MakeShadowValid(expected, kSize, /*granularity*/ 3); 725bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany memset(expected + l2, false, s2); 72663201b127e21d6fbfb6de62d0e44a5de01288153Alexey Samsonov MakeShadowValid(expected, kSize, /*granularity*/ 3); 727bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t i = 0; i < kSize; i++) { 728bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany ASSERT_EQ(expected[i], __asan_address_is_poisoned(arr + i)); 729bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 730bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 731bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 732bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 733bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 734bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 735bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 736eb2809311c94b73c269ccef8d68ae368642e5754Kostya SerebryanyTEST(AddressSanitizerInterface, PoisonedRegion) { 737eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany size_t rz = 16; 738eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany for (size_t size = 1; size <= 64; size++) { 739eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany char *p = new char[size]; 740eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany uptr x = reinterpret_cast<uptr>(p); 741eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany for (size_t beg = 0; beg < size + rz; beg++) { 742eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany for (size_t end = beg; end < size + rz; end++) { 743eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany uptr first_poisoned = __asan_region_is_poisoned(x + beg, end - beg); 744eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany if (beg == end) { 745eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany EXPECT_FALSE(first_poisoned); 746eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany } else if (beg < size && end <= size) { 747eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany EXPECT_FALSE(first_poisoned); 748eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany } else if (beg >= size) { 749eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany EXPECT_EQ(x + beg, first_poisoned); 750eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany } else { 751eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany EXPECT_GT(end, size); 752eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany EXPECT_EQ(x + size, first_poisoned); 753eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany } 754eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany } 755eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany } 756eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany delete [] p; 757eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany } 758eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany} 759eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany 760eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany// This is a performance benchmark for manual runs. 761eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany// asan's memset interceptor calls mem_is_zero for the entire shadow region. 762eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany// the profile should look like this: 763eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany// 89.10% [.] __memset_sse2 764eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany// 10.50% [.] __sanitizer::mem_is_zero 765eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany// I.e. mem_is_zero should consume ~ SHADOW_GRANULARITY less CPU cycles 766eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany// than memset itself. 767a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808Kostya SerebryanyTEST(AddressSanitizerInterface, DISABLED_StressLargeMemset) { 768eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany size_t size = 1 << 20; 769eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany char *x = new char[size]; 770eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany for (int i = 0; i < 100000; i++) 771eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany Ident(memset)(x, 0, size); 772eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany delete [] x; 773eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany} 774eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany 775a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808Kostya Serebryany// Same here, but we run memset with small sizes. 776a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808Kostya SerebryanyTEST(AddressSanitizerInterface, DISABLED_StressSmallMemset) { 777a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808Kostya Serebryany size_t size = 32; 778a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808Kostya Serebryany char *x = new char[size]; 779a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808Kostya Serebryany for (int i = 0; i < 100000000; i++) 780a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808Kostya Serebryany Ident(memset)(x, 0, size); 781a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808Kostya Serebryany delete [] x; 782a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808Kostya Serebryany} 783a84805f1ccb2b7d4b6c0ba384bd3541fa4eaf808Kostya Serebryany 784bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic const char *kInvalidPoisonMessage = "invalid-poison-memory-range"; 785bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic const char *kInvalidUnpoisonMessage = "invalid-unpoison-memory-range"; 786bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 787bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, DISABLED_InvalidPoisonAndUnpoisonCallsTest) { 788bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany char *array = Ident((char*)malloc(120)); 789bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_unpoison_memory_region(array, 120); 790bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Try to unpoison not owned memory 791bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(__asan_unpoison_memory_region(array, 121), 792bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany kInvalidUnpoisonMessage); 793bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(__asan_unpoison_memory_region(array - 1, 120), 794bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany kInvalidUnpoisonMessage); 795bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 796bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_poison_memory_region(array, 120); 797bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany // Try to poison not owned memory. 798bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(__asan_poison_memory_region(array, 121), kInvalidPoisonMessage); 799bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_DEATH(__asan_poison_memory_region(array - 1, 120), 800bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany kInvalidPoisonMessage); 801bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(array); 802bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 803bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 804bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryanystatic void ErrorReportCallbackOneToZ(const char *report) { 805b43d6a8ca10b9af8a903e8726003ae7767f9e823Alexey Samsonov int report_len = strlen(report); 806b43d6a8ca10b9af8a903e8726003ae7767f9e823Alexey Samsonov ASSERT_EQ(6, write(2, "ABCDEF", 6)); 807b43d6a8ca10b9af8a903e8726003ae7767f9e823Alexey Samsonov ASSERT_EQ(report_len, write(2, report, report_len)); 808b43d6a8ca10b9af8a903e8726003ae7767f9e823Alexey Samsonov ASSERT_EQ(6, write(2, "ABCDEF", 6)); 8092c29212c42d457ade0bbd1d01de92195dd9ce925Kostya Serebryany _exit(1); 810bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 811bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 812bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, SetErrorReportCallbackTest) { 813bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_set_error_report_callback(ErrorReportCallbackOneToZ); 8142c29212c42d457ade0bbd1d01de92195dd9ce925Kostya Serebryany EXPECT_DEATH(__asan_report_error(0, 0, 0, 0, true, 1), 8152c29212c42d457ade0bbd1d01de92195dd9ce925Kostya Serebryany ASAN_PCRE_DOTALL "ABCDEF.*AddressSanitizer.*WRITE.*ABCDEF"); 816bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany __asan_set_error_report_callback(NULL); 817bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 818bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany 819bff533684731c89bd5e99d0cf950a86c21a342e8Kostya SerebryanyTEST(AddressSanitizerInterface, GetOwnershipStressTest) { 820bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany std::vector<char *> pointers; 821bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany std::vector<size_t> sizes; 822f1877cf0a314f407ac535ab1606fdac4f9b05026Kostya Serebryany#if ASAN_ALLOCATOR_VERSION == 1 823bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany const size_t kNumMallocs = 8245af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryany (SANITIZER_WORDSIZE <= 32 || ASAN_LOW_MEMORY) ? 1 << 10 : 1 << 14; 825f1877cf0a314f407ac535ab1606fdac4f9b05026Kostya Serebryany#elif ASAN_ALLOCATOR_VERSION == 2 // too slow with asan_allocator2. :( 826f1877cf0a314f407ac535ab1606fdac4f9b05026Kostya Serebryany const size_t kNumMallocs = 1 << 9; 827f1877cf0a314f407ac535ab1606fdac4f9b05026Kostya Serebryany#endif 828bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t i = 0; i < kNumMallocs; i++) { 829bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany size_t size = i * 100 + 1; 830bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany pointers.push_back((char*)malloc(size)); 831bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany sizes.push_back(size); 832bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 833bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t i = 0; i < 4000000; i++) { 834bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_FALSE(__asan_get_ownership(&pointers)); 835bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_FALSE(__asan_get_ownership((void*)0x1234)); 836bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany size_t idx = i % kNumMallocs; 837bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_TRUE(__asan_get_ownership(pointers[idx])); 838bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany EXPECT_EQ(sizes[idx], __asan_get_allocated_size(pointers[idx])); 839bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany } 840bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany for (size_t i = 0, n = pointers.size(); i < n; i++) 841bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany free(pointers[i]); 842bff533684731c89bd5e99d0cf950a86c21a342e8Kostya Serebryany} 84365199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany 84465199f1b253c4bfb225805629217acb8f0b1e185Kostya SerebryanyTEST(AddressSanitizerInterface, CallocOverflow) { 84565199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany size_t kArraySize = 4096; 84665199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany volatile size_t kMaxSizeT = std::numeric_limits<size_t>::max(); 84765199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany volatile size_t kArraySize2 = kMaxSizeT / kArraySize + 10; 84865199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany void *p = calloc(kArraySize, kArraySize2); // Should return 0. 84965199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany EXPECT_EQ(0L, Ident(p)); 85065199f1b253c4bfb225805629217acb8f0b1e185Kostya Serebryany} 851b2efe13f3a0fb9af55cce39a497d951567e78816Kostya Serebryany 852b2efe13f3a0fb9af55cce39a497d951567e78816Kostya SerebryanyTEST(AddressSanitizerInterface, CallocOverflow2) { 853b2efe13f3a0fb9af55cce39a497d951567e78816Kostya Serebryany#if SANITIZER_WORDSIZE == 32 854b2efe13f3a0fb9af55cce39a497d951567e78816Kostya Serebryany size_t kArraySize = 112; 855b2efe13f3a0fb9af55cce39a497d951567e78816Kostya Serebryany volatile size_t kArraySize2 = 43878406; 856b2efe13f3a0fb9af55cce39a497d951567e78816Kostya Serebryany void *p = calloc(kArraySize, kArraySize2); // Should return 0. 857b2efe13f3a0fb9af55cce39a497d951567e78816Kostya Serebryany EXPECT_EQ(0L, Ident(p)); 858b2efe13f3a0fb9af55cce39a497d951567e78816Kostya Serebryany#endif 859b2efe13f3a0fb9af55cce39a497d951567e78816Kostya Serebryany} 860