ARCHER: Using symbolic, path-sensitive analysis to detect memory access errorsUsing redundancies to find errors