[erlang-questions] When can an integer > 0 not be a pos_integer() in the Dialyzer?

Kostis Sagonas kostis@REDACTED
Sun Nov 16 10:01:54 CET 2008


Foolish Ewe wrote:
> Hi Kostis:
> 
> Wow that was fast :-).  Speaking of fast, am I imagining things or is the
> dialyzer noticeably faster when using it in R12B4 than R12B3,

Frankly, I do not remember.  We try our best not to slow down Dialyzer 
as its code evolves and correct performance bottlenecks that we become 
aware of.

Despite that, regarding the speed of Dialyzer, I find myself having 
similar feelings to those I have for my salary.  It's sufficient for 
allowing me to live more or less comfortably with it, it improves a bit 
as time goes by, but it's always considerably less than what I would 
like it to be :-)

> Thanks for the quick response.  I should have been a bit more thorough 
> in reporting the command line options I used, I'm sorry about that.
> My gut reaction is to turn on the strictest
> possible checking in any static analysis tool, I'd much 
> rather sweat it now than be chasing run time errors later.

Generally this is a good approach, but the problem in what you did is 
that you turned on options with contradictory aims: -Wunderspecs warns 
about specs whose constraints are not as strong as they can be (and you 
probably want to constrain the uses of some of your functions), while 
-Woverspecs warns about specs whose constraints are stronger than what 
can be inferred.

In general, you want to use -specs that impose stronger constraints on 
your functions than what your function allows. For example, for the 
function:

   app([], L) -> L;
   app([H|L1], L2) -> [H|app(L1,L2)].

whose success typing is:

   -spec app(list(), any()) -> any().

(i.e. it requires a list in its first argument, accepts any term on its 
second, and can return any Erlang term), you probably *want* to use an 
less permissive spec like the one below:

   -spec app(list(), list()) -> list().     % overspecified

(i.e. constrain the second argument and the result to be a list), but 
you do not want to accidentally specify a more liberal (overspecified) 
contract like:

   -spec app(any(), any()) -> any().        % underspecified

Note that I am using the new notation for specs available from R12B-4 
onwards.

Kostis



More information about the erlang-questions mailing list