[erlang-questions] Some questions about dialyzer
Jesper Louis Andersen
jesper.louis.andersen@REDACTED
Thu Dec 22 23:03:32 CET 2011
On 12/21/11 10:30 AM, Alexander Kuleshov wrote:
> And also i have message like:
>
> test.erl:161: Function test_func/2 will never be called
>
> But i have some test_func calls in my code in current file.
This usually means that the dialyzer has analyzed your code with the
conclusion that even if your code contains calls to this function, other
things limit the control flow in ways which means that these call sites
can never be invoked. Thus it reports that your function never gets called.
It is often the case that some other dialyzer error it found is the
culprit. Suppose a call chain f() -> g() -> h() where the dialyzer finds
that f() will always fail before calling g(). Then h() is not reachable
and the above error type will be reported. Now, fixing the problem
around the f function will then make the error go away since now the
chain is "enabled".
Note that the dialyzer is pretty powerful in what it finds. Since it is
a very powerful static analyzer it can often close down entire control
flow paths in your code based upon factually possible values that may
flow along *other* paths. A call that looks benign, with no errors
reported for it, may actually constrain the data flow in your program in
such a way that the dialyzer sees the error/mistake on your part.
The hard part about the dialyzer is to understand what the error
messages *mean*. Not literally what the contents of the error message
are, that is usually pretty clear, but rather, what the semantics of
your program were that provoked that error. But when you begin to
understand how it finds mistakes and what it reports it becomes an
indispensable tool for weeding :)
--
Jesper Louis Andersen
Erlang Solutions Ltd., Copenhagen, DK
More information about the erlang-questions
mailing list