The test contains a race in read/write syscalls. The size of reported race depends on how the accessed memory range split into granules inside of tsan runtime. The test used to report access of size 8, because presumably the buffer ended up being aligned to 8 bytes. But after some unrelated changes this test started to report accesses of size 1 (presumably .data layout changed), which makes the test fail. Guarantee alignment of the buf object explicitly. Reviewed By: vitalybuka, melver Differential Revision: https://reviews.llvm.org/D107131
38 lines
856 B
C++
38 lines
856 B
C++
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t 2>&1 | FileCheck %s
|
|
#include "syscall.h"
|
|
#include "../test.h"
|
|
#include <errno.h>
|
|
#include <sys/types.h>
|
|
#include <sys/wait.h>
|
|
|
|
int pipefd[2];
|
|
unsigned long long buf[2];
|
|
|
|
static void *thr(void *p) {
|
|
barrier_wait(&barrier);
|
|
mywrite(pipefd[1], buf, sizeof(buf));
|
|
return 0;
|
|
}
|
|
|
|
int main() {
|
|
barrier_init(&barrier, 2);
|
|
if (mypipe(pipefd))
|
|
exit((perror("pipe"), 1));
|
|
mywrite(pipefd[1], buf, sizeof(buf));
|
|
pthread_t th;
|
|
pthread_create(&th, 0, thr, 0);
|
|
myread(pipefd[0], buf, sizeof(buf));
|
|
barrier_wait(&barrier);
|
|
pthread_join(th, 0);
|
|
fprintf(stderr, "DONE\n");
|
|
}
|
|
|
|
// CHECK: WARNING: ThreadSanitizer: data race
|
|
// CHECK: Read of size 8
|
|
// CHECK: #0 mywrite
|
|
// CHECK: #1 thr
|
|
// CHECK: Previous write of size 8
|
|
// CHECK: #0 myread
|
|
// CHECK: #1 main
|
|
// CHECK: DONE
|