15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 25d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <pthread.h> 35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <stddef.h> 45d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <stdio.h> 55d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <string.h> 65d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <unistd.h> 75d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint y[4], z[4]; 95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid *MemMoveThread(void *a) { 115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines memmove((int*)a, z, 16); 125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return NULL; 135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 145d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid *MemSetThread(void *a) { 165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines sleep(1); 175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines memset((int*)a, 0, 16); 185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return NULL; 195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 205d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint main() { 225d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines pthread_t t[2]; 235d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // Race on y between memmove and memset 245d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines pthread_create(&t[0], NULL, MemMoveThread, y); 255d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines pthread_create(&t[1], NULL, MemSetThread, y); 265d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines pthread_join(t[0], NULL); 275d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines pthread_join(t[1], NULL); 285d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 295d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines printf("PASS\n"); 305d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return 0; 315d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 325d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 335d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: WARNING: ThreadSanitizer: data race 345d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: #0 memset 355d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: #1 MemSetThread 365d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: Previous write 375d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: #0 memmove 385d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: #1 MemMoveThread 39