15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 283b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany#include <pthread.h> 383b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany#include <stddef.h> 483b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany#include <stdio.h> 583b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany#include <string.h> 683b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany#include <unistd.h> 783b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany 85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint x[4], z[4]; 983b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany 107acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryanyvoid *MemCpyThread(void *a) { 117acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany memcpy((int*)a, z, 16); 127acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany return NULL; 137acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany} 147acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany 157acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryanyvoid *MemSetThread(void *a) { 167acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany sleep(1); 177acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany memset((int*)a, 0, 16); 1883b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany return NULL; 1983b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany} 2083b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany 2183b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryanyint main() { 2283b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany pthread_t t[2]; 237acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany // Race on x between memcpy and memset 247acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany pthread_create(&t[0], NULL, MemCpyThread, x); 257acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany pthread_create(&t[1], NULL, MemSetThread, x); 267acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany pthread_join(t[0], NULL); 277acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany pthread_join(t[1], NULL); 2883b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany printf("PASS\n"); 2983b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany return 0; 3083b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany} 3183b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany 327acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK: WARNING: ThreadSanitizer: data race 337acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK: #0 memset 347acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK: #1 MemSetThread 357acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK: Previous write 367acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK: #0 memcpy 377acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK: #1 MemCpyThread 387acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany 39