Usually consists of assertions about what is true at certain points in the program. This only works if the specification and the code are quite different in style. No, because it's likely that errors made in one place would also be made in the other. Verification is extremely hard. It has been used for only a few systems of any size, and was extremely difficult even then.
Specification can take much longer than writing the initial code.
Checking the specification against the code is also hard. A program can't usually do the job without some human help. When the two don't match, it's very hard to figure out what's wrong. Even if system is verified, doesn't help handle hardware failures or other unexpected things that weren't part of the specification. When the system is designed, must try to predict the kinds of errors that might occur, and build in ways of detecting them.