11b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov//===-- sanitizer_stackdepot_test.cc --------------------------------------===// 21b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov// 31b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov// The LLVM Compiler Infrastructure 41b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov// 51b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov// This file is distributed under the University of Illinois Open Source 61b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov// License. See LICENSE.TXT for details. 71b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov// 81b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov//===----------------------------------------------------------------------===// 91b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov// 101b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov// This file is a part of ThreadSanitizer/AddressSanitizer runtime. 111b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov// 121b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov//===----------------------------------------------------------------------===// 131b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov#include "sanitizer_common/sanitizer_stackdepot.h" 141b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov#include "sanitizer_common/sanitizer_internal_defs.h" 151b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov#include "sanitizer_common/sanitizer_libc.h" 161b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov#include "gtest/gtest.h" 171b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov 181b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukovnamespace __sanitizer { 191b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov 201b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry VyukovTEST(SanitizerCommon, StackDepotBasic) { 211b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov uptr s1[] = {1, 2, 3, 4, 5}; 221b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov u32 i1 = StackDepotPut(s1, ARRAY_SIZE(s1)); 231b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov uptr sz1 = 0; 24ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov const uptr *sp1 = StackDepotGet(i1, &sz1); 251b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov EXPECT_NE(sp1, (uptr*)0); 261b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov EXPECT_EQ(sz1, ARRAY_SIZE(s1)); 27d7ed1f09f316628b2d981a1d8c2cf0f5af30e90eAlexey Samsonov EXPECT_EQ(internal_memcmp(sp1, s1, sizeof(s1)), 0); 281b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov} 291b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov 301b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry VyukovTEST(SanitizerCommon, StackDepotAbsent) { 311b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov uptr sz1 = 0; 32d0dc91869f197d2df69ceaecce0889931e18de67Dmitry Vyukov const uptr *sp1 = StackDepotGet((1 << 30) - 1, &sz1); 331b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov EXPECT_EQ(sp1, (uptr*)0); 341b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov} 351b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov 36ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry VyukovTEST(SanitizerCommon, StackDepotEmptyStack) { 371b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov u32 i1 = StackDepotPut(0, 0); 381b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov uptr sz1 = 0; 39ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov const uptr *sp1 = StackDepotGet(i1, &sz1); 40ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov EXPECT_EQ(sp1, (uptr*)0); 41ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov} 42ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov 43ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry VyukovTEST(SanitizerCommon, StackDepotZeroId) { 44ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov uptr sz1 = 0; 45ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov const uptr *sp1 = StackDepotGet(0, &sz1); 461b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov EXPECT_EQ(sp1, (uptr*)0); 471b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov} 481b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov 491b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry VyukovTEST(SanitizerCommon, StackDepotSame) { 501b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov uptr s1[] = {1, 2, 3, 4, 6}; 511b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov u32 i1 = StackDepotPut(s1, ARRAY_SIZE(s1)); 521b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov u32 i2 = StackDepotPut(s1, ARRAY_SIZE(s1)); 531b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov EXPECT_EQ(i1, i2); 541b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov uptr sz1 = 0; 55ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov const uptr *sp1 = StackDepotGet(i1, &sz1); 561b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov EXPECT_NE(sp1, (uptr*)0); 571b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov EXPECT_EQ(sz1, ARRAY_SIZE(s1)); 58d7ed1f09f316628b2d981a1d8c2cf0f5af30e90eAlexey Samsonov EXPECT_EQ(internal_memcmp(sp1, s1, sizeof(s1)), 0); 591b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov} 601b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov 611b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry VyukovTEST(SanitizerCommon, StackDepotSeveral) { 621b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov uptr s1[] = {1, 2, 3, 4, 7}; 631b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov u32 i1 = StackDepotPut(s1, ARRAY_SIZE(s1)); 641b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov uptr s2[] = {1, 2, 3, 4, 8, 9}; 651b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov u32 i2 = StackDepotPut(s2, ARRAY_SIZE(s2)); 661b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov EXPECT_NE(i1, i2); 671b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov} 681b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov 69384a448fbe081352f7b3bb927093412ad1725cffSergey MatveevTEST(SanitizerCommon, StackDepotReverseMap) { 70384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev uptr s1[] = {1, 2, 3, 4, 5}; 71384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev uptr s2[] = {7, 1, 3, 0}; 72384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev uptr s3[] = {10, 2, 5, 3}; 73384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev uptr s4[] = {1, 3, 2, 5}; 74384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev u32 ids[4] = {0}; 75384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev ids[0] = StackDepotPut(s1, ARRAY_SIZE(s1)); 76384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev ids[1] = StackDepotPut(s2, ARRAY_SIZE(s2)); 77384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev ids[2] = StackDepotPut(s3, ARRAY_SIZE(s3)); 78384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev ids[3] = StackDepotPut(s4, ARRAY_SIZE(s4)); 79384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev 80384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev StackDepotReverseMap map; 81384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev 82384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev for (uptr i = 0; i < 4; i++) { 83384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev uptr sz_depot, sz_map; 84384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev const uptr *sp_depot, *sp_map; 85384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev sp_depot = StackDepotGet(ids[i], &sz_depot); 86384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev sp_map = map.Get(ids[i], &sz_map); 87384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev EXPECT_EQ(sz_depot, sz_map); 88384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev EXPECT_EQ(sp_depot, sp_map); 89384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev } 90384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev} 91384a448fbe081352f7b3bb927093412ad1725cffSergey Matveev 921b37017f0216d0b8f3ae3a7dea8b3cc20d74db25Dmitry Vyukov} // namespace __sanitizer 93