|
|
-
- %% a module that crashes in just about every way possible
-
- -module(crash).
-
- -behaviour(gen_server).
-
- -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-
- -export([start/0]).
-
- -record(state, {
- host :: term(),
- port :: term()
- }).
-
- start() ->
- gen_server:start({local, ?MODULE}, ?MODULE, [], []).
-
- init(_) ->
- {ok, {}}.
-
- handle_call(undef, _, State) ->
- {reply, ?MODULE:booger(), State};
- handle_call(badfun, _, State) ->
- M = booger,
- {reply, M(), State};
- handle_call(bad_return, _, _) ->
- bleh;
- handle_call(bad_return_string, _, _) ->
- {tuple, {tuple, "string"}};
- handle_call(case_clause, _, State) ->
- case State of
- goober ->
- {reply, ok, State}
- end;
- handle_call(case_clause_string, _, State) ->
- Foo = atom_to_list(?MODULE),
- case Foo of
- State ->
- {reply, ok, State}
- end;
- handle_call(if_clause, _, State) ->
- if State == 1 ->
- {reply, ok, State}
- end;
- handle_call(try_clause, _, State) ->
- Res = try tuple_to_list(State) of
- [_A, _B] -> ok
- catch
- _:_ -> ok
- end,
- {reply, Res, State};
- handle_call(badmatch, _, State) ->
- {A, B, C} = State,
- {reply, [A, B, C], State};
- handle_call(badrecord, _, State) ->
- Host = State#state.host,
- {reply, Host, State};
- handle_call(function_clause, _, State) ->
- {reply, function(State), State};
- handle_call(badarith, _, State) ->
- Res = 1 / length(tuple_to_list(State)),
- {reply, Res, State};
- handle_call(badarg1, _, State) ->
- Res = list_to_binary(["foo", bar]),
- {reply, Res, State};
- handle_call(badarg2, _, State) ->
- Res = erlang:iolist_to_binary(["foo", bar]),
- {reply, Res, State};
- handle_call(system_limit, _, State) ->
- Res = list_to_atom(lists:flatten(lists:duplicate(256, "a"))),
- {reply, Res, State};
- handle_call(process_limit, _, State) ->
- %% run with +P 300 to make this crash
- [erlang:spawn(fun() -> timer:sleep(5000) end) || _ <- lists:seq(0, 500)],
- {reply, ok, State};
- handle_call(port_limit, _, State) ->
- [erlang:open_port({spawn, "ls"}, []) || _ <- lists:seq(0, 1024)],
- {reply, ok, State};
- handle_call(noproc, _, State) ->
- Res = gen_event:call(foo, bar, baz),
- {reply, Res, State};
- handle_call(noproc_proc_lib, _, State) ->
- Res = proc_lib:stop(foo),
- {reply, Res, State};
- handle_call(badarity, _, State) ->
- F = fun(A, B, C) -> A + B + C end,
- Res = F(State),
- {reply, Res, State};
- handle_call(throw, _, _State) ->
- throw(a_ball);
- handle_call(_Call, _From, State) ->
- {reply, ok, State}.
-
- handle_cast(_Cast, State) ->
- {noreply, State}.
-
- handle_info(_Info, State) ->
- {noreply, State}.
-
- terminate(_, _) ->
- ok.
-
- code_change(_, State, _) ->
- {ok, State}.
-
- function(X) when is_list(X) ->
- ok.
|