Detecting Nondeterminism in Shared Memory Parallel Programs