Dialyzer success type question

Sebastian Strollo <>
Wed Dec 15 15:29:16 CET 2010


Hi

Apologizes for quoting Kostis out of context,

On 12/6/10 8:56 , Kostis Sagonas wrote:
...
 > Yes. As you see, dialyzer is not only smart but is also quite sensitive!
 > If it ever feels neglected for too long, it has a very effective way of
 > letting you know that you should never do that again ;-)

Not only that, it seems to suffer from mood swings between releases :-)

We offer up our code to Dialyzers scrutiny several times a day, and are 
happy to do so. However when upgrading to R14B01 we ran into a bit of 
problem with Dialyzers concept of success typing, as it seems to have 
changed in R14B01?

Here is a minimal example of my problem, with two modules, first:

   -module(m1).
   -export([do_something/0]).
   do_something() ->
       io:format("doing something...\n", []),
       m2:fail(true, "Failed: ...\n", []).

and the other module:

   -module(m2).
   -export([fail/3]).
   fail(HaltP, Fmt, Args) ->
       io:format(standard_error, Fmt, Args),
       case HaltP of
           true ->
               erlang:halt(1);
           false ->
               ok
       end.

Now, if I kindly ask dialyzer to analyze this I get:

   m1.erl:3: Function do_something/0 has no local return

Which I expect, and I can turn it off if I wish by using -Wno_return (or 
spec:ing that I know it doesn't return). However, I also get:

   m1.erl:5: The call m2:fail('true',"Failed: ...\n",[]) will never 
return since it differs in the 1st argument from the success typing 
arguments: ('false',atom() | binary() | [any()],[any()])

Which is a problem, since there is no way for me to turn it off, also it 
seems a bit inconsistent, if I change the case clause in fail/3 to:

     case HaltP of
         true ->
             erlang:halt(1);
         _ ->
             ok
     end.

I do not get the above message (even though I guess dialyzer could 
figure out that the "success typing" is "anything *but* true:-). It 
doesn't seem to help to spec me out of this, even if I spec my intent by:

-spec fail(boolean(), string(), [any()]) -> 'ok' | no_return().

I still get the complaint (as long as I have 'false' in the case clause).

Any hints on how I can appease dialyzer and let it know that I don't 
expect my fail function to return when I tell it not to?

Thanks,

/Sebastian

-- 
Sebastian Strollo / 
Tail-f Systems   / www.tail-f.com



More information about the erlang-questions mailing list