From b0af3f500a55f0435d972ad977f9b74ef9645b31 Mon Sep 17 00:00:00 2001 From: weiyu Date: Sun, 13 Dec 2020 17:22:09 -0800 Subject: [PATCH] Add data structures with bugs that tsan11/tsan11rec cannot detect --- tsan11-missingbug/Makefile | 18 ++++++ tsan11-missingbug/rwlock-test | Bin 0 -> 27176 bytes tsan11-missingbug/rwlock-test.cc | 92 ++++++++++++++++++++++++++++++ tsan11-missingbug/seqlock-test | Bin 0 -> 27936 bytes tsan11-missingbug/seqlock-test.cc | 87 ++++++++++++++++++++++++++++ tsan11-missingbug/test.sh | 33 +++++++++++ tsan11-missingbug/test_all.sh | 11 ++++ 7 files changed, 241 insertions(+) create mode 100644 tsan11-missingbug/Makefile create mode 100755 tsan11-missingbug/rwlock-test create mode 100644 tsan11-missingbug/rwlock-test.cc create mode 100755 tsan11-missingbug/seqlock-test create mode 100644 tsan11-missingbug/seqlock-test.cc create mode 100755 tsan11-missingbug/test.sh create mode 100755 tsan11-missingbug/test_all.sh diff --git a/tsan11-missingbug/Makefile b/tsan11-missingbug/Makefile new file mode 100644 index 0000000..8f855e8 --- /dev/null +++ b/tsan11-missingbug/Makefile @@ -0,0 +1,18 @@ +CC=../clang +CXX=../clang++ + +CXXFLAGS=-std=c++11 -pthread -Wall -g + +SEQLOCK = seqlock-test +RWLOCK = rwlock-test + +all: $(SEQLOCK) $(RWLOCK) + +$(SEQLOCK): $(SEQLOCK).cc + $(CXX) -o $@ $< $(CXXFLAGS) $(LDFLAGS) + +$(RWLOCK): $(RWLOCK).cc + $(CXX) -o $@ $< $(CXXFLAGS) $(LDFLAGS) + +clean: + rm -f $(SEQLOCK) $(RWLOCK) *.o diff --git a/tsan11-missingbug/rwlock-test b/tsan11-missingbug/rwlock-test new file mode 100755 index 0000000000000000000000000000000000000000..3c4df40223ed5fb56acfc8f43ee9bb3eb070e9f7 GIT binary patch literal 27176 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 literal 0 HcmV?d00001 diff --git a/tsan11-missingbug/rwlock-test.cc b/tsan11-missingbug/rwlock-test.cc new file mode 100644 index 0000000..560f53d --- /dev/null +++ b/tsan11-missingbug/rwlock-test.cc @@ -0,0 +1,92 @@ +#include +#include +#include +#include +// #include + +using namespace std; + +#define RW_LOCK_BIAS 0x00100000 +#define WRITE_LOCK_CMP RW_LOCK_BIAS + +/** Example implementation of linux rw lock along with 2 thread test + * driver... */ + +typedef union { + atomic_int lock; +} rwlock_t; + +static inline void read_lock(rwlock_t *rw) +{ + int priorvalue = rw->lock.fetch_sub(1, memory_order_acquire); + while (priorvalue <= 0) { + rw->lock.fetch_add(1, memory_order_relaxed); + while (rw->lock.load(memory_order_relaxed) <= 0) { + pthread_yield(); + } + priorvalue = rw->lock.fetch_sub(1, memory_order_acquire); + } +} + +// Injected bug for the two fetch_sub *** +static inline void write_lock(rwlock_t *rw) +{ + int priorvalue = rw->lock.fetch_sub(RW_LOCK_BIAS, memory_order_relaxed); // Should be acquire + while (priorvalue != RW_LOCK_BIAS) { + rw->lock.fetch_add(RW_LOCK_BIAS, memory_order_relaxed); + while (rw->lock.load(memory_order_relaxed) != RW_LOCK_BIAS) { + pthread_yield(); + } + priorvalue = rw->lock.fetch_sub(RW_LOCK_BIAS, memory_order_relaxed); // Should be acquire + } +} + +static inline void read_unlock(rwlock_t *rw) +{ + rw->lock.fetch_add(1, memory_order_release); +} + +static inline void write_unlock(rwlock_t *rw) +{ + rw->lock.fetch_add(RW_LOCK_BIAS, memory_order_release); +} + +rwlock_t mylock; +atomic_int data1, data2; + +void * a(void *obj) +{ + int i; + for(i = 0; i < 4; i++) { + if ((i % 2) == 0) { + read_lock(&mylock); + int d1 = data1.load(memory_order_relaxed); + int d2 = data2.load(memory_order_relaxed); + assert(d1 == d2); + read_unlock(&mylock); + } else { + write_lock(&mylock); + data1.store(i, memory_order_relaxed); + data2.store(i, memory_order_relaxed); + write_unlock(&mylock); + } + } + + return NULL; +} + +int main(int argc, char **argv) +{ + pthread_t t1, t2, t3; + mylock.lock.store(RW_LOCK_BIAS); + + pthread_create(&t1, NULL, &a, NULL); + pthread_create(&t2, NULL, &a, NULL); + pthread_create(&t3, NULL, &a, NULL); + + pthread_join(t1, NULL); + pthread_join(t2, NULL); + pthread_join(t3, NULL); + + return 0; +} diff --git a/tsan11-missingbug/seqlock-test b/tsan11-missingbug/seqlock-test new file mode 100755 index 0000000000000000000000000000000000000000..1b88369e3bf5dfb32a127aa54e19db314d7f8cb0 GIT binary patch literal 27936 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 QBA-#E%dbihNC4S?0SoLdtpET3 literal 0 HcmV?d00001 diff --git a/tsan11-missingbug/seqlock-test.cc b/tsan11-missingbug/seqlock-test.cc new file mode 100644 index 0000000..7d5d0d1 --- /dev/null +++ b/tsan11-missingbug/seqlock-test.cc @@ -0,0 +1,87 @@ +#include +#include +#include +//#include + +using namespace std; + +typedef struct seqlock { + // Sequence for reader consistency check + atomic_int _seq; + // It needs to be atomic to avoid data races + atomic_int _data1; + atomic_int _data2; + + seqlock() { + _seq.store(0); + _data1.store(0); + _data2.store(0); + } + + void read(int * d1, int *d2) { + while (true) { + int old_seq = _seq.load(memory_order_acquire); + if (old_seq % 2 == 1) continue; + + *d1 = _data1.load(memory_order_acquire); + *d2 = _data2.load(memory_order_acquire); + if (_seq.load(memory_order_relaxed) == old_seq) { + return; + } + } + } + + void write(int new_data, int new_data2) { + while (true) { + int old_seq = _seq.load(memory_order_relaxed); // Injected bug: should be acquire + if (old_seq % 2 == 1) + continue; // Retry + + if (_seq.compare_exchange_strong(old_seq, old_seq + 1, + memory_order_relaxed, memory_order_relaxed)) + break; + } + + // Update the data + _data1.store(new_data, memory_order_release); + _data2.store(new_data, memory_order_release); + + _seq.fetch_add(1, memory_order_release); + } + +} seqlock_t; + + +seqlock_t *lock; + +void * a(void *obj) { + lock->write(3,3); + return NULL; +} + +void * b(void *obj) { + lock->write(2,2); + return NULL; +} + +void * c(void *obj) { + int r1, r2; + lock->read(&r1, &r2); + assert(r1 == r2); + return NULL; +} + +int main(int argc, char **argv) { + lock = new seqlock_t(); + + pthread_t t1, t2, t3; + pthread_create(&t1, NULL, &a, NULL); + pthread_create(&t2, NULL, &b, NULL); + pthread_create(&t3, NULL, &c, NULL); + + pthread_join(t1, NULL); + pthread_join(t2, NULL); + pthread_join(t3, NULL); + + return 0; +} diff --git a/tsan11-missingbug/test.sh b/tsan11-missingbug/test.sh new file mode 100755 index 0000000..17a5f3c --- /dev/null +++ b/tsan11-missingbug/test.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +EXE=$1 +TOTAL_RUN=1000 +CDSLIB="/home/vagrant/c11tester" +export LD_LIBRARY_PATH=${CDSLIB} +export C11TESTER='-x1' + +COUNT_ASSERT=0 +COUNT_TIME=0 + +for i in `seq 1 1 $TOTAL_RUN` ; do + OUTPUT="$(/usr/bin/time -f "time: %U %S" $EXE 2>&1)" + ASSERT="$(echo "$OUTPUT" | grep "Assertion")" + if [ -n "$ASSERT" ] ; then + ((++COUNT_ASSERT)) + fi + + TIME="$(echo "$OUTPUT" | grep -o "time: .\... .\...")" + TIME_USER_S="$(echo "$TIME" | cut -d' ' -f2 | cut -d'.' -f1)" + TIME_USER_CS="$(echo "$TIME" | cut -d' ' -f2 | cut -d'.' -f2)" + TIME_SYSTEM_S="$(echo "$TIME" | cut -d' ' -f3 | cut -d'.' -f1)" + TIME_SYSTEM_CS="$(echo "$TIME" | cut -d' ' -f3 | cut -d'.' -f2)" + + TIME_EXE=$((10#$TIME_USER_S * 1000 + 10#$TIME_USER_CS * 10 + 10#$TIME_SYSTEM_S * 1000 + 10#$TIME_SYSTEM_CS * 10)) + COUNT_TIME=$((COUNT_TIME + TIME_EXE)) +done + +AVG_ASSERT=$(echo "${COUNT_ASSERT} * 100 / ${TOTAL_RUN}" | bc -l | xargs printf "%.1f") + +# -3 / log(1 - p) < n +echo "Runs: $TOTAL_RUN | Assertions: $COUNT_ASSERT | Total time: ${COUNT_TIME}ms | Assert rate: ${AVG_ASSERT}%" +rm C11FuzzerTmp* 2> /dev/null diff --git a/tsan11-missingbug/test_all.sh b/tsan11-missingbug/test_all.sh new file mode 100755 index 0000000..6a5701a --- /dev/null +++ b/tsan11-missingbug/test_all.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e +set -u + +# Paul: skip `spsc-queue` as it deadlocks. + +for t in seqlock-test rwlock-test; do + echo -n "$t " + ./test.sh ./$t +done + -- 2.34.1