More than holes in the standard, it is because people (sometimes
unknowingly) assume things not guaranteed by the standard, e.g., code that
relies on MPI_Send being nonblocking or MPI_Get being blocking. So it's
more often user error.
I agree, but a standard that is prone to this type of wrong assumptions
is going to have portability problems forever. It is specially true for
reasonable assumptions. For example, is it reasonable to assume that you
can read a buffer that is being sent ? Yes, everybody would naturally
think it's just fine. You cannot blame the users for making reasonable
assumptions, or not knowing the standard by the letter. Well, you can
actually blame them but it is not the point :-)
Another example is the classic blocking/non-blocking behavior based on
message size. This threshold is not defined in the spec but the standard
says "don't assume one way or the other". You can actually fix it by
defining this threshold, or completely removing the standard mode.
Sometimes, removing choices is the best way to easily force people do to
the right thing.
It's tough to remove things from an existing standard, though, but I
think it could be acceptable to not expect automatic compliance with
this new revision, unlike MPI-1 codes that were automatically MPI-2
compliant. It could be done.