I use Dialyzer a lot, and it has always been useful to expose various errors in my Erlang code.

Unfortunately, I recently discovered an unexpected behaviour: by default, Dialyzer ignores unknown types. It is very surprising and suddently makes me doubt any piece of Erlang code I ever wrote.

As it turns out, there is a Dialyzer flag to detect and report these unknown types. With Rebar3, it can be added to the dialyzer setting:

{dialyzer, [{warnings, [unknown]}]}.

Activating unknown type detection could lead to interesting Dialyzer failures, when a type is part of an unknown module. Care should be taken to list application dependencies in the application resource file.

In some cases, it is necessary to reference a type from a module whose application is not a dependency of the current project. In that case, the application in question can be added to the PLT with the plt_extra_apps option.

For example:

{dialyzer, [{plt_extra_apps, [public_key]},
            {warnings, [unknown]}]}.

Activating unknown type detection for all my Erlang projects has revealed various issues, so it is definitely an option I will keep enabled in the future.