[erlang-patches] Fix spec for cpu_sup:util/1
Kostis Sagonas
kostis@REDACTED
Wed Dec 4 15:57:00 CET 2013
On 12/04/2013 03:38 PM, Andrew Caruth wrote:
> Hi OTP devs,
>
> I recently noticed dialyzer was flagging an issue in one of our own modules that was making a call to cpu_sup:util([detailed]). An 'is_list()' guard test was performed on the second element of the tuple returned which dialyzer was reporting as a test that could never succeed. Sample output from a call to cpu_sup:util([detailed]):
>
> {[0],
> [{soft_irq,0.0},
> {hard_irq,0.0},
> {kernel,0.41368935690109065},
> {nice_user,0.0},
> {user,0.9402030838661151}],
> [{steal,0.0},{idle,98.64610755923279},{wait,0.0}],
> []}
>
> The spec implied {'all' | integer | list, tuple | float, tuple | float, []}, which excludes the above output, so I've updated the spec to allow the second and third elements as lists.
>
> Also, the atoms 'soft_irq', 'hard_irq', and 'steal' were also not part of the spec, so I've also added those.
I do not want to comment on the particular patch, but only to point out
that this a more general problem.
Often, there are good reasons for implementations of built-in of library
functions to contain *more* functionality than what the fine manual
describes (e.g. to have some experimental features or interfaces that
are not cast in stone yet).
I think it's a good idea that the specs and the manual always agree with
each other. In fact, I think that the manual of library modules should
ideally be produced by what's in their code.
All the above imply that dialyzer, which is based on specs, may be less
forgiving than the actual implementation, and there are very good
reasons for it to behave so: It warns you that you are relying on some
undocumented (and likely to disappear) feature of the current
implementation.
Kostis
More information about the erlang-patches
mailing list