Yes it's undefined behavior - a and foo(--a) can be evaluated in any order.
For further reference, see e.g. Sequence Point. There's a sequence point after the complete expression, and after evaluation of the argument to foo - but the order of evaluation of subexpressions is unspecified, per 5/4:
Except where noted, the order of
  evaluation of operands of individual
  operators and subexpressions of
  individual expressions, and the order
  in which side effects take place, is
  unspecified. Between the previous
  and next sequence point a scalar
  object shall have its stored value
  modified at most once by the
  evaluation of an expression.
  Furthermore, the prior value shall be
  accessed only to determine the value
  to be stored. The requirements of this
  paragraph shall be met for each
  allowable ordering of the
  subexpressions of a full expression;
  otherwise the behavior is undefined.
EDIT: As Prasoon points out, the behavior is unspecified due to the order of evaluation ... is unspecified., and becomes undefined due to the prior value shall be accessed only to determine the value to be stored