Bugs in Erlang code

Alexey Shchepin alexey@REDACTED
Thu Mar 17 02:58:17 CET 2005


Hello, Kostis!

On Thu, 17 Mar 2005 01:14:39 +0100 (MET), you said:

 KS> I am really amazed at some of the bugs we have been able to find in
 KS> supposedly well-tested Erlang code using the new type analysis.

 KS> Many of them, we've reported directly to the OTP team and they are already
 KS> fixed.  Some others we've finding every day as the analysis gets stronger
 KS> and stronger.  For example, today I've come across the following code (in
 KS> kernel/src/rpc.erl).

 KS> =======================================================================
 KS> yield(Key) when pid(Key) ->
 KS>     {value, R} = do_yield(Key, infinite),
 KS>     R.

do_yield can return 'timeout', so there can be 'badmatch' error, and second
argument should be 'infinity'.

 KS> 
 KS> nb_yield(Key, infinite) when pid(Key) ->
 KS>     do_yield(Key, infinite);

Again 'infinity'.

 KS> nb_yield(Key, Timeout) when pid(Key), integer(Timeout), Timeout >= 0 ->
 KS>     do_yield(Key, Timeout).
 KS> 
 KS> nb_yield(Key) when pid(Key) ->
 KS>     do_yield(Key, 0).
 KS> 
 KS> do_yield(Key, Timeout) ->
 KS>     receive
 KS>         {Key,{promise_reply,R}} ->
 KS>             {value,R}
 KS>         after Timeout ->
 KS>             timeout
 KS>     end.
 KS> =========================================================================

The rest looks ok for me.

 KS> There are actually two (and arguably three) errors in the above code!

 KS> Dialyzer found them.

 KS> QUIZ for the seasoned Erlang programmers: Who can spot them?




More information about the erlang-questions mailing list