15de29a4bSNico Weber //===-- tsan_string.cpp ---------------------------------------------------===//
25de29a4bSNico Weber //
35de29a4bSNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45de29a4bSNico Weber // See https://llvm.org/LICENSE.txt for license information.
55de29a4bSNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65de29a4bSNico Weber //
75de29a4bSNico Weber //===----------------------------------------------------------------------===//
85de29a4bSNico Weber //
95de29a4bSNico Weber // This file is a part of ThreadSanitizer (TSan), a race detector.
105de29a4bSNico Weber //
115de29a4bSNico Weber //===----------------------------------------------------------------------===//
125de29a4bSNico Weber #include "tsan_test_util.h"
135de29a4bSNico Weber #include "gtest/gtest.h"
145de29a4bSNico Weber #include <string.h>
155de29a4bSNico Weber
165de29a4bSNico Weber namespace __tsan {
175de29a4bSNico Weber
TEST_F(ThreadSanitizer,Memcpy)18*a61c8e1eSYuanfang Chen TEST_F(ThreadSanitizer, Memcpy) {
195de29a4bSNico Weber char data0[7] = {1, 2, 3, 4, 5, 6, 7};
205de29a4bSNico Weber char data[7] = {42, 42, 42, 42, 42, 42, 42};
215de29a4bSNico Weber MainThread().Memcpy(data+1, data0+1, 5);
225de29a4bSNico Weber EXPECT_EQ(data[0], 42);
235de29a4bSNico Weber EXPECT_EQ(data[1], 2);
245de29a4bSNico Weber EXPECT_EQ(data[2], 3);
255de29a4bSNico Weber EXPECT_EQ(data[3], 4);
265de29a4bSNico Weber EXPECT_EQ(data[4], 5);
275de29a4bSNico Weber EXPECT_EQ(data[5], 6);
285de29a4bSNico Weber EXPECT_EQ(data[6], 42);
295de29a4bSNico Weber MainThread().Memset(data+1, 13, 5);
305de29a4bSNico Weber EXPECT_EQ(data[0], 42);
315de29a4bSNico Weber EXPECT_EQ(data[1], 13);
325de29a4bSNico Weber EXPECT_EQ(data[2], 13);
335de29a4bSNico Weber EXPECT_EQ(data[3], 13);
345de29a4bSNico Weber EXPECT_EQ(data[4], 13);
355de29a4bSNico Weber EXPECT_EQ(data[5], 13);
365de29a4bSNico Weber EXPECT_EQ(data[6], 42);
375de29a4bSNico Weber }
385de29a4bSNico Weber
TEST_F(ThreadSanitizer,MemcpyRace1)39*a61c8e1eSYuanfang Chen TEST_F(ThreadSanitizer, MemcpyRace1) {
405de29a4bSNico Weber char *data = new char[10];
415de29a4bSNico Weber char *data1 = new char[10];
425de29a4bSNico Weber char *data2 = new char[10];
435de29a4bSNico Weber ScopedThread t1, t2;
445de29a4bSNico Weber t1.Memcpy(data, data1, 10);
455de29a4bSNico Weber t2.Memcpy(data, data2, 10, true);
465de29a4bSNico Weber }
475de29a4bSNico Weber
TEST_F(ThreadSanitizer,MemcpyRace2)48*a61c8e1eSYuanfang Chen TEST_F(ThreadSanitizer, MemcpyRace2) {
495de29a4bSNico Weber char *data = new char[10];
505de29a4bSNico Weber char *data1 = new char[10];
515de29a4bSNico Weber char *data2 = new char[10];
525de29a4bSNico Weber ScopedThread t1, t2;
535de29a4bSNico Weber t1.Memcpy(data+5, data1, 1);
545de29a4bSNico Weber t2.Memcpy(data+3, data2, 4, true);
555de29a4bSNico Weber }
565de29a4bSNico Weber
TEST_F(ThreadSanitizer,MemcpyRace3)57*a61c8e1eSYuanfang Chen TEST_F(ThreadSanitizer, MemcpyRace3) {
585de29a4bSNico Weber char *data = new char[10];
595de29a4bSNico Weber char *data1 = new char[10];
605de29a4bSNico Weber char *data2 = new char[10];
615de29a4bSNico Weber ScopedThread t1, t2;
625de29a4bSNico Weber t1.Memcpy(data, data1, 10);
635de29a4bSNico Weber t2.Memcpy(data1, data2, 10, true);
645de29a4bSNico Weber }
655de29a4bSNico Weber
TEST_F(ThreadSanitizer,MemcpyStack)66*a61c8e1eSYuanfang Chen TEST_F(ThreadSanitizer, MemcpyStack) {
675de29a4bSNico Weber char *data = new char[10];
685de29a4bSNico Weber char *data1 = new char[10];
695de29a4bSNico Weber ScopedThread t1, t2;
705de29a4bSNico Weber t1.Memcpy(data, data1, 10);
715de29a4bSNico Weber t2.Memcpy(data, data1, 10, true);
725de29a4bSNico Weber }
735de29a4bSNico Weber
TEST_F(ThreadSanitizer,MemsetRace1)74*a61c8e1eSYuanfang Chen TEST_F(ThreadSanitizer, MemsetRace1) {
755de29a4bSNico Weber char *data = new char[10];
765de29a4bSNico Weber ScopedThread t1, t2;
775de29a4bSNico Weber t1.Memset(data, 1, 10);
785de29a4bSNico Weber t2.Memset(data, 2, 10, true);
795de29a4bSNico Weber }
805de29a4bSNico Weber
815de29a4bSNico Weber } // namespace __tsan
82