[erlang-questions] Dialyzer and apply
Sun Mar 29 11:39:47 CEST 2009
Hello Kostis ,
Thanks for your reply ,
- Well ,as the dialyzer use guide says, it "identifies software
and it's already discovering calls to missing functions , that's why I
expected that behaviour
- I used apply in the example just to include that case , but I agree
that it's rarely used when M,F,A are known.
- I understand your concern about hard-coded information
- Thanks for pointing out xref , it did discover the case of
erlang:apply/3 , but didn't discover the timer:apply_after/4 one.
From: Kostis Sagonas [mailto:]
Sent: Sunday, March 29, 2009 10:58 AM
Cc: Ahmed Diaa
Subject: Re: [erlang-questions] Dialyzer and apply
Ahmed Diaa wrote:
> Hello there ,
> I started using Dialyzer lately , and found it really usefull. But , I
> had a case that I expected dialyzer to discover but it didn't.
> The case occurs when using erlang:apply/3 or timer:apply_after/4
> Here's the example
> timer:apply_after(100,?MODULE, bar, [ ]),
> erlang:apply(?MODULE,bar,[ ]).
> When running the dialyzer for this module , it didn't discover the
> call to a missing function.
> Wouldn't it be nice if dialyzer could discover such cases?
Yes, it would be but:
- there is very little reason to use erlang:apply/3 when the module
name, function name and the number of arguments are known (like in
your example, where you should really use ?MODULE:bar() instead)
- detecting the timer:apply_after/4 missing functions would mean that
dialyzer has hard-coded information about the timer module and in
Erlang there is nothing that prevents you from using your own
module in your application
- detecting missing funcyions is not dialyzer's main objective (there
are other tools like xref that are supposed to be used for such
purposes -- although I am not sure whether even that one detects
bar/0 is a missing function when used in timer:apply_after/4).
More information about the erlang-questions