[erlang-bugs] dialyzer false positive io_lib:fread

Chris King colanderman@REDACTED
Sat Aug 10 06:11:26 CEST 2013


Hi,

Re-sending this, as it seems (after a month checking the archive) that  
this mailing list silently rejects e-mails from non-subscribers?  (There's  
no mention of this behavior in the listinfo page  
http://erlang.org/mailman/listinfo/erlang-bugs.)


dialyzer produces a false positive when analyzing io_lib:fread with a ~a  
argument – it believes (erroneously) that the parsed value will be a  
string, when in fact it will be an atom.  This does not occur with  
io:fread, or with io_lib:fread with an integer argument.

The below test program exemplifies this; dialyzer claims that bugged/1  
cannot return, when in fact calling bugged("foo") returns normally in the  
interpreter.

I would be glad to supply a patch but I haven't the slightest clue where  
to start looking (this seems like either an easy fix, in an "exceptions"  
list somewhere, or a complex fix deep inside dialyzer).


-module(dialyzer_bug).

-export([bugged/1, not_bugged1/0, not_bugged2/1]).

bugged(S) ->
       case io_lib:fread("~a", S) of
       {ok, [Atom], _} when is_atom(Atom) -> Atom
       end.

not_bugged1() ->
       case io:fread("foo", "~a") of
       {ok, [Atom]} when is_atom(Atom) -> Atom
       end.

not_bugged2(S) ->
       case io_lib:fread("~d", S) of
       {ok, [Integer], _} when is_integer(Integer) -> Integer
       end.



More information about the erlang-bugs mailing list