I received errors from field_update_field() where it was apparently trying to update a field in an illegal way (e.g. change data length of a field with data) for a field that had not changed.

I traced the problem to the line:

  if ($field + $existing_field !== $existing_field) {

in field_base_features_rebuild() (line 277) that evaluates as TRUE every time, even if nothing has changed in the field definition. This means that all fields get updated by a features "revert" even if none has changed.
On inspecting the objects being compared I found that the two field objects contained the same properties but the order of properties differed, and therefore the operator !==, being picky, returned TRUE.
I changed the operator to != and it seems to work as expected, though I'm not sure what other implications this might have.