Addresses important techniques in improving the correctness of software, including correctness by construction (top-down refinement), program proving, static analysis & dynamic, execution-based analysis (testing & debugging). This book discusses semantic program synthesis & analysis, static program analysis & dynamic program analysis.