A safety critical system controlled by software relies heavily on the properties of the software, because they affect the level of trust of the system as a whole. Absolute measures of correctness do not exist for software.We rely on verification techniques to provide an acceptable level of confidence. Simple assembly level and programs can be verified by building up the behavior of each instruction, sequences of instructions, functions, and so on until the entire program is understood. For larger systems this is impractical. When high level languages are used in control systems, several levels of abstraction contribute to the understanding of system behavior. To verify that a program does not compromise system safety, each construct must be verified as well as the transformations between abstraction levels.A number of verification techniques exist. Information hiding, overloading, inheritance and other techniques offered in a programming language may ease program development, but they may make verification more difficult or impossible. Use of certain concurrency constructs may simplify the real-time model and our understanding of system behavior, while other constructs may make the model non-deterministic.The relationship between programming language constructs, verification techniques and safety certification requirements will be presented.