A method of identifying concurrency vulnerabilities, the method comprising: instrumenting read and write access of a multi-threaded program to a shared memory; identifying, via a greybox fuzzer, a test case for the multi-threaded program, characterized by: analyzing, via the greybox fuzzer and based on the test case, two or more branches of the multi-threaded program that include sets of racing pairs to determine whether execution of the instrumented multi-threaded program according to the test case includes execution of a previously undiscovered branch of the multi-threaded program and whether the previously undiscovered branch accesses the shared memory, wherein the analyzing comprises; determining whether the test case generates new bits in each of a first bitmap and a second bitmap, wherein first bits in the first bitmap represent discovered branches in the multi-threaded program and second bits in the second bitmap represent discovered branches in the shared memory, and determining that the execution of the instrumented multi-threaded program includes execution of a previously undiscovered branch of the multi-threaded program and that the previously undiscovered branch accesses the shared memory, based on new bits in the second bitmap; providing the test case from the greybox fuzzer to a concurrency verification module, if the instrumented multi-threaded program is determined to include a previously undiscovered branch that accesses the shared memory; and testing, via the concurrency verification module, the multi-threaded program according to the test case with one or more scheduling policies to identify the one or more concurrency vulnerabilities of the multi-threaded program. instrumenting read and write access of a multi-threaded program to a shared memory; identifying, via a greybox fuzzer, a test case for the multi-threaded program, characterized by: analyzing, via the greybox fuzzer and based on the test case, two or more branches of the multi-threaded program that include sets of racing pairs to determine whether execution of the instrumented multi-threaded program according to the test case includes execution of a previously undiscovered branch of the multi-threaded program and whether the previously undiscovered branch accesses the shared memory, wherein the analyzing comprises; determining whether the test case generates new bits in each of a first bitmap and a second bitmap, wherein first bits in the first bitmap represent discovered branches in the multi-threaded program and second bits in the second bitmap represent discovered branches in the shared memory, and determining that the execution of the instrumented multi-threaded program includes execution of a previously undiscovered branch of the multi-threaded program and that the previously undiscovered branch accesses the shared memory, based on new bits in the second bitmap; providing the test case from the greybox fuzzer to a concurrency verification module, if the instrumented multi-threaded program is determined to include a previously undiscovered branch that accesses the shared memory; and testing, via the concurrency verification module, the multi-threaded program according to the test case with one or more scheduling policies to identify the one or more concurrency vulnerabilities of the multi-threaded program. analyzing, via the greybox fuzzer and based on the test case, two or more branches of the multi-threaded program that include sets of racing pairs to determine whether execution of the instrumented multi-threaded program according to the test case includes execution of a previously undiscovered branch of the multi-threaded program and whether the previously undiscovered branch accesses the shared memory, wherein the analyzing comprises; determining whether the test case generates new bits in each of a first bitmap and a second bitmap, wherein first bits in the first bitmap represent discovered branches in the multi-threaded program and second bits in the second bitmap represent discovered branches in the shared memory, and determining that the execution of the instrumented multi-threaded program includes execution of a previously undiscovered branch of the multi-threaded program and that the previously undiscovered branch accesses the shared memory, based on new bits in the second bitmap; providing the test case from the greybox fuzzer to a concurrency verification module, if the instrumented multi-threaded program is determined to include a previously undiscovered branch that accesses the shared memory; and testing, via the concurrency verification module, the multi-threaded program according to the test case with one or more scheduling policies to identify the one or more concurrency vulnerabilities of the multi-threaded program.