Specifications, paradoxically, always lack specificity. There are always lots of things you can get into an discussion about. A good client understands that specifications change, that work is incremental and that you wish to be paid accordingly.
Every experienced developer should know that nobody knows how to estimate how long something is going to take. Even the best developers I know always fudge their numbers by a factor of 2 and that is after they have sliced the work down to parts that take at most 4 hours and used all other tricks in the book to get decent estimates. You add everything, add 50% for writing the tests (either before or after the actual code, that doesn't matter), add another 50% for meetings, discussions, etc., add another 15% for writing documentation and then double it all.
I will never take a fixed-price job, unless I'm sure the client is reasonable in his expectations and I can apply the above calculation while still ending up with a decent hourly rate. I'm currently employed, but my employer isn't doing too well...