13cab2bb3Spatrick //===-- tsan_string.cpp ---------------------------------------------------===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // This file is a part of ThreadSanitizer (TSan), a race detector.
103cab2bb3Spatrick //
113cab2bb3Spatrick //===----------------------------------------------------------------------===//
123cab2bb3Spatrick #include "tsan_test_util.h"
133cab2bb3Spatrick #include "gtest/gtest.h"
143cab2bb3Spatrick #include <string.h>
153cab2bb3Spatrick
163cab2bb3Spatrick namespace __tsan {
173cab2bb3Spatrick
TEST_F(ThreadSanitizer,Memcpy)18*810390e3Srobert TEST_F(ThreadSanitizer, Memcpy) {
193cab2bb3Spatrick char data0[7] = {1, 2, 3, 4, 5, 6, 7};
203cab2bb3Spatrick char data[7] = {42, 42, 42, 42, 42, 42, 42};
213cab2bb3Spatrick MainThread().Memcpy(data+1, data0+1, 5);
223cab2bb3Spatrick EXPECT_EQ(data[0], 42);
233cab2bb3Spatrick EXPECT_EQ(data[1], 2);
243cab2bb3Spatrick EXPECT_EQ(data[2], 3);
253cab2bb3Spatrick EXPECT_EQ(data[3], 4);
263cab2bb3Spatrick EXPECT_EQ(data[4], 5);
273cab2bb3Spatrick EXPECT_EQ(data[5], 6);
283cab2bb3Spatrick EXPECT_EQ(data[6], 42);
293cab2bb3Spatrick MainThread().Memset(data+1, 13, 5);
303cab2bb3Spatrick EXPECT_EQ(data[0], 42);
313cab2bb3Spatrick EXPECT_EQ(data[1], 13);
323cab2bb3Spatrick EXPECT_EQ(data[2], 13);
333cab2bb3Spatrick EXPECT_EQ(data[3], 13);
343cab2bb3Spatrick EXPECT_EQ(data[4], 13);
353cab2bb3Spatrick EXPECT_EQ(data[5], 13);
363cab2bb3Spatrick EXPECT_EQ(data[6], 42);
373cab2bb3Spatrick }
383cab2bb3Spatrick
TEST_F(ThreadSanitizer,MemcpyRace1)39*810390e3Srobert TEST_F(ThreadSanitizer, MemcpyRace1) {
403cab2bb3Spatrick char *data = new char[10];
413cab2bb3Spatrick char *data1 = new char[10];
423cab2bb3Spatrick char *data2 = new char[10];
433cab2bb3Spatrick ScopedThread t1, t2;
443cab2bb3Spatrick t1.Memcpy(data, data1, 10);
453cab2bb3Spatrick t2.Memcpy(data, data2, 10, true);
463cab2bb3Spatrick }
473cab2bb3Spatrick
TEST_F(ThreadSanitizer,MemcpyRace2)48*810390e3Srobert TEST_F(ThreadSanitizer, MemcpyRace2) {
493cab2bb3Spatrick char *data = new char[10];
503cab2bb3Spatrick char *data1 = new char[10];
513cab2bb3Spatrick char *data2 = new char[10];
523cab2bb3Spatrick ScopedThread t1, t2;
533cab2bb3Spatrick t1.Memcpy(data+5, data1, 1);
543cab2bb3Spatrick t2.Memcpy(data+3, data2, 4, true);
553cab2bb3Spatrick }
563cab2bb3Spatrick
TEST_F(ThreadSanitizer,MemcpyRace3)57*810390e3Srobert TEST_F(ThreadSanitizer, MemcpyRace3) {
583cab2bb3Spatrick char *data = new char[10];
593cab2bb3Spatrick char *data1 = new char[10];
603cab2bb3Spatrick char *data2 = new char[10];
613cab2bb3Spatrick ScopedThread t1, t2;
623cab2bb3Spatrick t1.Memcpy(data, data1, 10);
633cab2bb3Spatrick t2.Memcpy(data1, data2, 10, true);
643cab2bb3Spatrick }
653cab2bb3Spatrick
TEST_F(ThreadSanitizer,MemcpyStack)66*810390e3Srobert TEST_F(ThreadSanitizer, MemcpyStack) {
673cab2bb3Spatrick char *data = new char[10];
683cab2bb3Spatrick char *data1 = new char[10];
693cab2bb3Spatrick ScopedThread t1, t2;
703cab2bb3Spatrick t1.Memcpy(data, data1, 10);
713cab2bb3Spatrick t2.Memcpy(data, data1, 10, true);
723cab2bb3Spatrick }
733cab2bb3Spatrick
TEST_F(ThreadSanitizer,MemsetRace1)74*810390e3Srobert TEST_F(ThreadSanitizer, MemsetRace1) {
753cab2bb3Spatrick char *data = new char[10];
763cab2bb3Spatrick ScopedThread t1, t2;
773cab2bb3Spatrick t1.Memset(data, 1, 10);
783cab2bb3Spatrick t2.Memset(data, 2, 10, true);
793cab2bb3Spatrick }
803cab2bb3Spatrick
813cab2bb3Spatrick } // namespace __tsan
82