tsan: fix warnings in tests
Fix format specifier. Fix warnings about non-standard attribute placement. Make free_race2.c test a bit more interesting: test access with/without an offset. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D101424
This commit is contained in:
		
							parent
							
								
									60c60dd138
								
							
						
					
					
						commit
						d78782f6a6
					
				| 
						 | 
					@ -9,7 +9,7 @@
 | 
				
			||||||
long count_memory_mappings() {
 | 
					long count_memory_mappings() {
 | 
				
			||||||
  pid_t my_pid = getpid();
 | 
					  pid_t my_pid = getpid();
 | 
				
			||||||
  char proc_file_name[128];
 | 
					  char proc_file_name[128];
 | 
				
			||||||
  snprintf(proc_file_name, sizeof(proc_file_name), "/proc/%ld/maps", my_pid);
 | 
					  snprintf(proc_file_name, sizeof(proc_file_name), "/proc/%d/maps", my_pid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FILE *proc_file = fopen(proc_file_name, "r");
 | 
					  FILE *proc_file = fopen(proc_file_name, "r");
 | 
				
			||||||
  long line_count = 0;
 | 
					  long line_count = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,7 @@ void *Thread1(void *x) {
 | 
				
			||||||
  return NULL;
 | 
					  return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void *Thread2(void *x) __attribute__((noinline)) {
 | 
					__attribute__((noinline)) void *Thread2(void *x) {
 | 
				
			||||||
  barrier_wait(&barrier);
 | 
					  barrier_wait(&barrier);
 | 
				
			||||||
  pthread_mutex_lock(&mtx);
 | 
					  pthread_mutex_lock(&mtx);
 | 
				
			||||||
  mem[0] = 42;
 | 
					  mem[0] = 42;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,23 +1,34 @@
 | 
				
			||||||
// RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
 | 
					// RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
 | 
				
			||||||
 | 
					// RUN: %clang_tsan -O1 -DACCESS_OFFSET=4 %s -o %t && %deflake %run %t | FileCheck %s
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void __attribute__((noinline)) foo(int *mem) {
 | 
					#ifndef ACCESS_OFFSET
 | 
				
			||||||
 | 
					#define ACCESS_OFFSET 0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__attribute__((noinline)) void foo(void *mem) {
 | 
				
			||||||
  free(mem);
 | 
					  free(mem);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void __attribute__((noinline)) bar(int *mem) {
 | 
					__attribute__((noinline)) void baz(void *mem) {
 | 
				
			||||||
  mem[0] = 42;
 | 
					  free(mem);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__attribute__((noinline)) void bar(void *mem) {
 | 
				
			||||||
 | 
					  *(long*)((char*)mem + ACCESS_OFFSET) = 42;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main() {
 | 
					int main() {
 | 
				
			||||||
  int *mem = (int*)malloc(100);
 | 
					  void *mem = malloc(100);
 | 
				
			||||||
 | 
					  baz(mem);
 | 
				
			||||||
 | 
					  mem = malloc(100);
 | 
				
			||||||
  foo(mem);
 | 
					  foo(mem);
 | 
				
			||||||
  bar(mem);
 | 
					  bar(mem);
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CHECK: WARNING: ThreadSanitizer: heap-use-after-free
 | 
					// CHECK: WARNING: ThreadSanitizer: heap-use-after-free
 | 
				
			||||||
// CHECK:   Write of size 4 at {{.*}} by main thread:
 | 
					// CHECK:   Write of size 8 at {{.*}} by main thread:
 | 
				
			||||||
// CHECK:     #0 bar
 | 
					// CHECK:     #0 bar
 | 
				
			||||||
// CHECK:     #1 main
 | 
					// CHECK:     #1 main
 | 
				
			||||||
// CHECK:   Previous write of size 8 at {{.*}} by main thread:
 | 
					// CHECK:   Previous write of size 8 at {{.*}} by main thread:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int X = 0;
 | 
					int X = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MySleep() __attribute__((noinline)) {
 | 
					__attribute__((noinline)) void MySleep() {
 | 
				
			||||||
  sleep(1);  // the sleep that must appear in the report
 | 
					  sleep(1);  // the sleep that must appear in the report
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue