Data structures and program correctness: Bridging the gap