This paper is a systematic study of verification conditions and their use in the
context of program verification. We take Hoare logic as a starting point and study
in detail how a verification conditions generator can be obtained from it. The notion
of program annotation is essential in this process. Weakest preconditions and the use
of updates are also studied as alternative approaches to verification conditions. Our
study is carried on in the context of a While language. Important extensions to this
language are considered toward the end of the paper. We also briefly survey modern
program verification tools and their approaches to the generation of verification
conditions.Fundação para a Ciência e a Tecnologia (FCT