diff --git a/Makefile b/Makefile index f7f46c48f..0f651098c 100644 --- a/Makefile +++ b/Makefile @@ -116,6 +116,7 @@ $(PROFILES:%=deps-%): $(REBAR) get-dashboard .PHONY: xref xref: $(REBAR) @$(REBAR) as check xref + @scripts/xref-check.escript .PHONY: dialyzer dialyzer: $(REBAR) diff --git a/scripts/xref-check.escript b/scripts/xref-check.escript new file mode 100755 index 000000000..65c0fa857 --- /dev/null +++ b/scripts/xref-check.escript @@ -0,0 +1,41 @@ +#!/usr/bin/env escript + +main(_) -> + {ok, [Jobs]} = file:consult("scripts/xref_check.eterm"), + lists:foreach(fun(#{ name := Name + , analysis := Analysis + , excl_apps := ExclApps + , excl_mods := ExclMods + , filters := Filters + }) -> + xref:start(Name), + Tid = ets:new(Name, [ordered_set, named_table]), + xref:set_default(Name, [{verbose,false}, {warnings,false}]), + xref:add_release(Name, "_build/emqx/rel/emqx/lib/"), + xref:add_application(Name, code:lib_dir(erts)), + [ok = xref:remove_application(Name, App) || + App <- ExclApps + ], + + [ok = xref:remove_module(Name, M) || + M <- ExclMods + ], + + ModuleInfos = xref:info(Name, modules), + LibInfos = xref:info(Name, modules), + true = ets:insert(Tid, ModuleInfos ++ LibInfos), + {ok, Res0} = xref:analyse(Name, Analysis), + Res = Res0 -- Filters, + Res =/= [] andalso + begin + put(is_warn_found, true), + io:format("** Warnings for ~p~n : ~p~n", [Name, Res]) + end, + xref:stop(Name) + end, Jobs), + case get(is_warn_found) of + true -> + halt(1); + _ -> + ok + end. diff --git a/scripts/xref_check.eterm b/scripts/xref_check.eterm new file mode 100644 index 000000000..82fc3465f --- /dev/null +++ b/scripts/xref_check.eterm @@ -0,0 +1,863 @@ +[ %% Check undefined_function_calls + #{ name => undefined_function_calls + , analysis => undefined_function_calls + , excl_apps => + [ observer + , redbug + ] + , excl_mods => + [ hipe_unified_loader + , systools_make + , basho_bench_driver_erldis + ] + , filters => + [{{coap_client,channel_apply,3},{coap_dtls_socket,close,1}}, + {{coap_client,channel_apply,3},{coap_dtls_socket,connect,2}}, + {{coap_client,channel_apply,3},{coap_udp_socket,close,1}}, + {{coap_client,channel_apply,3},{coap_udp_socket,get_channel,2}}, + {{coap_client,channel_apply,3},{coap_udp_socket,start_link,0}}, + {{coap_client,test,0},{eunit,test,1}}, + {{coap_core_link,test,0},{eunit,test,1}}, + {{coap_message_parser,test,0},{eunit,test,1}}, + {{coap_observer,init,1},{coap_dtls_socket,connect,2}}, + {{coap_observer,init,1},{coap_udp_socket,get_channel,2}}, + {{coap_observer,init,1},{coap_udp_socket,start_link,0}}, + {{coap_observer,terminate,2},{coap_dtls_socket,close,1}}, + {{coap_observer,terminate,2},{coap_udp_socket,close,1}}, + {{code,beam_file_native_md5,2},{hipe_unified_loader,chunk_name,1}}, + {{code,get_native_fun,0},{hipe_unified_loader,chunk_name,1}}, + {{code,load_native_code_for_all_loaded,1}, + {hipe_unified_loader,chunk_name,1}}, + {{code_server,handle_call,3},{hipe_unified_loader,load,3}}, + {{code_server,handle_call,3},{hipe_unified_loader,load_module,4}}, + {{code_server,try_load_module_2,6}, + {hipe_unified_loader,load_native_code,3}}, + {{compile,embed_native_code,2},{hipe_unified_loader,chunk_name,1}}, + {{compile,native_compile_1,2},{hipe,compile,4}}, + {{core_link,test,0},{eunit,test,1}}, + {{cuttlefish_rebar_plugin,generate,2},{rebar_rel_utils,get_target_dir,2}}, + {{cuttlefish_rebar_plugin,make_default_file,3},{rebar_config,get_local,3}}, + {{cuttlefish_rebar_plugin,should_i_run,2},{rebar_rel_utils,is_rel_dir,0}}, + {{cuttlefish_rebar_plugin,should_i_run,2},{rebar_rel_utils,load_config,2}}, + {{emqx_bridge_worker,common,4},{replayq,append,2}}, + {{emqx_bridge_worker,drop_acked_batches,2},{replayq,ack,2}}, + {{emqx_bridge_worker,open_replayq,1},{replayq,open,1}}, + {{emqx_bridge_worker,pop_and_send_loop,2},{replayq,is_empty,1}}, + {{emqx_bridge_worker,pop_and_send_loop,2},{replayq,pop,2}}, + {{emqx_bridge_worker,terminate,3},{replayq,close,1}}, + {{emqx_misc,ipv6_probe,1},{gen_tcp,ipv6_probe,0}}, + {{eredis_parser,test,0},{eunit,test,1}}, + {{gen_rpc_driver_ssl,authenticate_client,3}, + {ssl_verify_hostname,verify_cert_hostname,2}}, + {{gen_rpc_driver_ssl,merge_ssl_options,2}, + {ssl_verify_hostname,verify_fun,3}}, + {{gproc_dist,from_leader,3},{gen_leader,leader_cast,2}}, + {{gproc_dist,handle_call,4},{gen_leader,leader_node,1}}, + {{gproc_dist,handle_leader_cast,3},{gen_leader,alive,1}}, + {{gproc_dist,handle_leader_cast,3},{gen_leader,broadcast,3}}, + {{gproc_dist,initiate_sync,3},{gen_leader,alive,1}}, + {{gproc_dist,initiate_sync,3},{gen_leader,broadcast,3}}, + {{gproc_dist,leader_call,1},{gen_leader,leader_call,2}}, + {{gproc_dist,leader_cast,1},{gen_leader,leader_cast,2}}, + {{gproc_dist,send_sync_complete,3},{gen_leader,broadcast,3}}, + {{gproc_dist,start_link,1},{gen_leader,start_link,6}}, + {{inets_ftp_wrapper,start_service,1},{ftp,start_service,1}}, + {{inets_ftp_wrapper,start_standalone,1},{ftp,start_standalone,1}}, + {{inets_ftp_wrapper,stop_service,1},{ftp,stop_service,1}}, + {{inets_tftp_wrapper,start_service,1},{tftp,start_service,1}}, + {{inets_tftp_wrapper,start_standalone,1},{tftp,start_standalone,1}}, + {{inets_tftp_wrapper,stop_service,1},{tftp,stop_service,1}}, + {{jose_chacha20_poly1305_libsodium,authenticate,3}, + {libsodium_crypto_onetimeauth_poly1305,crypto_onetimeauth_poly1305,2}}, + {{jose_chacha20_poly1305_libsodium,decrypt,5}, + {libsodium_crypto_aead_chacha20poly1305,ietf_decrypt_detached,5}}, + {{jose_chacha20_poly1305_libsodium,encrypt,4}, + {libsodium_crypto_aead_chacha20poly1305,ietf_encrypt_detached,4}}, + {{jose_chacha20_poly1305_libsodium,one_time_key,2}, + {libsodium_crypto_stream_chacha20,ietf_xor_ic,4}}, + {{jose_chacha20_poly1305_libsodium,verify,4}, + {libsodium_crypto_onetimeauth_poly1305,verify,3}}, + {{jose_curve25519_libdecaf,ed25519_sign,2}, + {libdecaf_curve25519,ed25519_sign,2}}, + {{jose_curve25519_libdecaf,ed25519_verify,3}, + {libdecaf_curve25519,ed25519_verify,3}}, + {{jose_curve25519_libdecaf,ed25519ph_sign,2}, + {libdecaf_curve25519,ed25519ph_sign,2}}, + {{jose_curve25519_libdecaf,ed25519ph_verify,3}, + {libdecaf_curve25519,ed25519ph_verify,3}}, + {{jose_curve25519_libdecaf,eddsa_keypair,0}, + {libdecaf_curve25519,eddsa_keypair,0}}, + {{jose_curve25519_libdecaf,eddsa_keypair,1}, + {libdecaf_curve25519,eddsa_keypair,1}}, + {{jose_curve25519_libdecaf,eddsa_secret_to_public,1}, + {libdecaf_curve25519,eddsa_secret_to_pk,1}}, + {{jose_curve25519_libdecaf,x25519_keypair,0}, + {libdecaf_curve25519,x25519_keypair,0}}, + {{jose_curve25519_libdecaf,x25519_keypair,1}, + {libdecaf_curve25519,x25519_keypair,1}}, + {{jose_curve25519_libdecaf,x25519_secret_to_public,1}, + {libdecaf_curve25519,x25519,1}}, + {{jose_curve25519_libdecaf,x25519_shared_secret,2}, + {libdecaf_curve25519,x25519,2}}, + {{jose_curve25519_libsodium,ed25519_sign,2}, + {libsodium_crypto_sign_ed25519,detached,2}}, + {{jose_curve25519_libsodium,ed25519_verify,3}, + {libsodium_crypto_sign_ed25519,verify_detached,3}}, + {{jose_curve25519_libsodium,ed25519ph_sign,2}, + {libsodium_crypto_hash_sha512,crypto_hash_sha512,1}}, + {{jose_curve25519_libsodium,ed25519ph_verify,3}, + {libsodium_crypto_hash_sha512,crypto_hash_sha512,1}}, + {{jose_curve25519_libsodium,eddsa_keypair,0}, + {libsodium_crypto_sign_ed25519,keypair,0}}, + {{jose_curve25519_libsodium,eddsa_keypair,1}, + {libsodium_crypto_sign_ed25519,seed_keypair,1}}, + {{jose_curve25519_libsodium,eddsa_secret_to_public,1}, + {libsodium_crypto_sign_ed25519,seed_keypair,1}}, + {{jose_curve25519_libsodium,x25519_keypair,0}, + {libsodium_crypto_box_curve25519xsalsa20poly1305,keypair,0}}, + {{jose_curve25519_libsodium,x25519_secret_to_public,1}, + {libsodium_crypto_scalarmult_curve25519,base,1}}, + {{jose_curve25519_libsodium,x25519_shared_secret,2}, + {libsodium_crypto_scalarmult_curve25519,crypto_scalarmult_curve25519,2}}, + {{jose_curve448_libdecaf,ed448_sign,2},{libdecaf_curve448,ed448_sign,2}}, + {{jose_curve448_libdecaf,ed448_sign,3},{libdecaf_curve448,ed448_sign,3}}, + {{jose_curve448_libdecaf,ed448_verify,3}, + {libdecaf_curve448,ed448_verify,3}}, + {{jose_curve448_libdecaf,ed448_verify,4}, + {libdecaf_curve448,ed448_verify,4}}, + {{jose_curve448_libdecaf,ed448ph_sign,2}, + {libdecaf_curve448,ed448ph_sign,2}}, + {{jose_curve448_libdecaf,ed448ph_sign,3}, + {libdecaf_curve448,ed448ph_sign,3}}, + {{jose_curve448_libdecaf,ed448ph_verify,3}, + {libdecaf_curve448,ed448ph_verify,3}}, + {{jose_curve448_libdecaf,ed448ph_verify,4}, + {libdecaf_curve448,ed448ph_verify,4}}, + {{jose_curve448_libdecaf,eddsa_keypair,0}, + {libdecaf_curve448,eddsa_keypair,0}}, + {{jose_curve448_libdecaf,eddsa_keypair,1}, + {libdecaf_curve448,eddsa_keypair,1}}, + {{jose_curve448_libdecaf,eddsa_secret_to_public,1}, + {libdecaf_curve448,eddsa_secret_to_pk,1}}, + {{jose_curve448_libdecaf,x448_keypair,0}, + {libdecaf_curve448,x448_keypair,0}}, + {{jose_curve448_libdecaf,x448_keypair,1}, + {libdecaf_curve448,x448_keypair,1}}, + {{jose_curve448_libdecaf,x448_secret_to_public,1}, + {libdecaf_curve448,x448,1}}, + {{jose_curve448_libdecaf,x448_shared_secret,2},{libdecaf_curve448,x448,2}}, + {{jose_json_jason,decode,1},{'Elixir.Jason','decode!',1}}, + {{jose_json_jason,encode,1},{'Elixir.Jason','encode!',1}}, + {{jose_json_jsone,decode,1},{jsone,decode,1}}, + {{jose_json_jsone,encode,1},{jsone,encode,2}}, + {{jose_json_jsx,decode,1},{jsx,decode,2}}, + {{jose_json_jsx,encode,1},{jsx,encode,1}}, + {{jose_json_ojson,decode,1},{ojson,'decode!',1}}, + {{jose_json_ojson,encode,1},{ojson,'encode!',1}}, + {{jose_json_poison,decode,1},{'Elixir.Poison','decode!',1}}, + {{jose_json_poison,encode,1},{'Elixir.Poison','encode!',1}}, + {{jose_json_poison_compat_encoder,decode,1},{'Elixir.Poison','decode!',1}}, + {{jose_json_poison_compat_encoder,encode,1}, + {'Elixir.IO',iodata_to_binary,1}}, + {{jose_json_poison_compat_encoder,lexical_encode,1}, + {'Elixir.Poison.EncodeError',exception,1}}, + {{jose_json_poison_compat_encoder,lexical_encode,1}, + {'Elixir.Poison.Encoder.Atom',encode,2}}, + {{jose_json_poison_compat_encoder,lexical_encode,1}, + {'Elixir.Poison.Encoder.BitString',encode,2}}, + {{jose_json_poison_compat_encoder,lexical_encode,1}, + {'Elixir.Poison.Encoder.Float',encode,2}}, + {{jose_json_poison_compat_encoder,lexical_encode,1}, + {'Elixir.Poison.Encoder.Integer',encode,2}}, + {{jose_json_poison_compat_encoder,lexical_encode_map,1}, + {'Elixir.Poison.Encoder.BitString',encode,2}}, + {{jose_json_poison_compat_encoder,lexical_encode_name,1}, + {'Elixir.Atom',to_string,1}}, + {{jose_json_poison_compat_encoder,lexical_encode_name,1}, + {'Elixir.Kernel',inspect,1}}, + {{jose_json_poison_compat_encoder,lexical_encode_name,1}, + {'Elixir.Poison.EncodeError',exception,1}}, + {{jose_json_poison_compat_encoder,lexical_encode_struct,2}, + {'Elixir.Enum',flat_map,2}}, + {{jose_json_poison_compat_encoder,lexical_encode_struct,2}, + {'Elixir.HashDict',size,1}}, + {{jose_json_poison_compat_encoder,lexical_encode_struct,2}, + {'Elixir.Map',from_struct,1}}, + {{jose_json_poison_compat_encoder,lexical_encode_struct,2}, + {'Elixir.Poison.Encoder.BitString',encode,2}}, + {{jose_json_poison_lexical_encoder,decode,1}, + {'Elixir.Poison','decode!',1}}, + {{jose_json_poison_lexical_encoder,encode,1}, + {'Elixir.JOSE.Poison','lexical_encode!',1}}, + {{jose_jwk_kty_rsa,try_generate_key,3},{cutkey,rsa,3}}, + {{jose_sha3_keccakf1600_driver,sha3_224,1}, + {keccakf1600_fips202,sha3_224,1}}, + {{jose_sha3_keccakf1600_driver,sha3_256,1}, + {keccakf1600_fips202,sha3_256,1}}, + {{jose_sha3_keccakf1600_driver,sha3_384,1}, + {keccakf1600_fips202,sha3_384,1}}, + {{jose_sha3_keccakf1600_driver,sha3_512,1}, + {keccakf1600_fips202,sha3_512,1}}, + {{jose_sha3_keccakf1600_driver,shake128,2}, + {keccakf1600_fips202,shake128,2}}, + {{jose_sha3_keccakf1600_driver,shake256,2}, + {keccakf1600_fips202,shake256,2}}, + {{jose_sha3_keccakf1600_nif,sha3_224,1},{keccakf1600,hash,2}}, + {{jose_sha3_keccakf1600_nif,sha3_256,1},{keccakf1600,hash,2}}, + {{jose_sha3_keccakf1600_nif,sha3_384,1},{keccakf1600,hash,2}}, + {{jose_sha3_keccakf1600_nif,sha3_512,1},{keccakf1600,hash,2}}, + {{jose_sha3_keccakf1600_nif,shake128,2},{keccakf1600,hash,3}}, + {{jose_sha3_keccakf1600_nif,shake256,2},{keccakf1600,hash,3}}, + {{jose_sha3_libdecaf,sha3_224,1},{libdecaf_sha3,hash,2}}, + {{jose_sha3_libdecaf,sha3_256,1},{libdecaf_sha3,hash,2}}, + {{jose_sha3_libdecaf,sha3_384,1},{libdecaf_sha3,hash,2}}, + {{jose_sha3_libdecaf,sha3_512,1},{libdecaf_sha3,hash,2}}, + {{jose_sha3_libdecaf,shake128,2},{libdecaf_sha3,hash,3}}, + {{jose_sha3_libdecaf,shake256,2},{libdecaf_sha3,hash,3}}, + {{lwm2m_coap_client,channel_apply,3},{lwm2m_coap_dtls_socket,close,1}}, + {{lwm2m_coap_client,channel_apply,3},{lwm2m_coap_dtls_socket,connect,2}}, + {{lwm2m_coap_client,channel_apply,3},{lwm2m_coap_udp_socket,close,1}}, + {{lwm2m_coap_client,channel_apply,3}, + {lwm2m_coap_udp_socket,get_channel,2}}, + {{lwm2m_coap_client,channel_apply,3},{lwm2m_coap_udp_socket,start_link,0}}, + {{lwm2m_coap_client,test,0},{eunit,test,1}}, + {{lwm2m_coap_message_parser,test,0},{eunit,test,1}}, + {{lwm2m_coap_observer,init,1},{lwm2m_coap_dtls_socket,connect,2}}, + {{lwm2m_coap_observer,init,1},{lwm2m_coap_udp_socket,get_channel,2}}, + {{lwm2m_coap_observer,init,1},{lwm2m_coap_udp_socket,start_link,0}}, + {{lwm2m_coap_observer,terminate,2},{lwm2m_coap_dtls_socket,close,1}}, + {{lwm2m_coap_observer,terminate,2},{lwm2m_coap_udp_socket,close,1}}, + {{ranch_app,consider_profiling,0},{eprof,start,0}}, + {{ranch_app,consider_profiling,0},{eprof,start_profiling,1}}, + {{ranch_app,profile_output,0},{eprof,analyze,1}}, + {{ranch_app,profile_output,0},{eprof,log,1}}, + {{ranch_app,profile_output,0},{eprof,stop_profiling,0}}, + {{release_handler,new_emulator_make_hybrid_boot,6}, + {systools_make,make_hybrid_boot,4}}, + {{release_handler,read_app,3},{systools_make,read_application,4}}, + {{systools,compile_rel,3},{systools_make,make_script,3}}, + {{systools,make_script,2},{systools_make,make_script,2}}, + {{systools,make_tar,2},{systools_make,make_tar,2}}, + {{systools,script2boot,1},{systools_make,format_error,1}}, + {{systools,script2boot,3},{systools_make,format_error,1}}, + {{systools_relup,do_mk_relup,5},{systools_make,get_release,2}}, + {{systools_relup,foreach_baserel_dn,7},{systools_make,get_release,2}}, + {{systools_relup,foreach_baserel_up,7},{systools_make,get_release,2}}] + } + + %% Check undefined_functions +, #{ name => undefined_functions + , analysis => undefined_functions + , excl_apps => + [ + + ] + , excl_mods => + [ + ] + , filters => + [{'Elixir.Atom',to_string,1}, + {'Elixir.Enum',flat_map,2}, + {'Elixir.HashDict',size,1}, + {'Elixir.IO',iodata_to_binary,1}, + {'Elixir.JOSE.Poison','lexical_encode!',1}, + {'Elixir.Jason','decode!',1}, + {'Elixir.Jason','encode!',1}, + {'Elixir.Kernel',inspect,1}, + {'Elixir.Map',from_struct,1}, + {'Elixir.Poison','decode!',1}, + {'Elixir.Poison','encode!',1}, + {'Elixir.Poison.EncodeError',exception,1}, + {'Elixir.Poison.Encoder.Atom',encode,2}, + {'Elixir.Poison.Encoder.BitString',encode,2}, + {'Elixir.Poison.Encoder.Float',encode,2}, + {'Elixir.Poison.Encoder.Integer',encode,2}, + {coap_dtls_socket,close,1}, + {coap_dtls_socket,connect,2}, + {coap_udp_socket,close,1}, + {coap_udp_socket,get_channel,2}, + {coap_udp_socket,start_link,0}, + {ct_slave,start,2}, + {ct_slave,stop,1}, + {cutkey,rsa,3}, + {eprof,analyze,1}, + {eprof,log,1}, + {eprof,start,0}, + {eprof,start_profiling,1}, + {eprof,stop_profiling,0}, + {erldis,mget,2}, + {erldis,set,3}, + {erldis_client,connect,0}, + {et_collector,iterate,5}, + {et_collector,report,2}, + {et_selector,parse_event,2}, + {et_viewer,get_collector_pid,1}, + {et_viewer,start_link,1}, + {eunit,test,1}, + {ftp,start_service,1}, + {ftp,start_standalone,1}, + {ftp,stop_service,1}, + {gen_leader,alive,1}, + {gen_leader,broadcast,3}, + {gen_leader,leader_call,2}, + {gen_leader,leader_cast,2}, + {gen_leader,leader_node,1}, + {gen_leader,start_link,6}, + {gen_tcp,ipv6_probe,0}, + {hipe,compile,4}, + {hipe_bifs,add_ref,2}, + {hipe_bifs,alloc_data,3}, + {hipe_bifs,alloc_loader_state,1}, + {hipe_bifs,atom_to_word,1}, + {hipe_bifs,bif_address,3}, + {hipe_bifs,check_crc,1}, + {hipe_bifs,commit_patch_load,1}, + {hipe_bifs,enter_code,3}, + {hipe_bifs,enter_sdesc,2}, + {hipe_bifs,find_na_or_make_stub,1}, + {hipe_bifs,fun_to_address,1}, + {hipe_bifs,get_fe,2}, + {hipe_bifs,merge_term,1}, + {hipe_bifs,patch_call,3}, + {hipe_bifs,patch_insn,3}, + {hipe_bifs,primop_address,1}, + {hipe_bifs,set_funinfo_native_address,3}, + {hipe_bifs,set_native_address,3}, + {hipe_bifs,set_native_address_in_fe,2}, + {hipe_bifs,term_to_word,1}, + {hipe_bifs,write_u32,2}, + {hipe_bifs,write_u64,2}, + {hipe_bifs,write_u8,2}, + {jsone,decode,1}, + {jsone,encode,2}, + {jsx,decode,2}, + {jsx,encode,1}, + {keccakf1600,hash,2}, + {keccakf1600,hash,3}, + {keccakf1600_fips202,sha3_224,1}, + {keccakf1600_fips202,sha3_256,1}, + {keccakf1600_fips202,sha3_384,1}, + {keccakf1600_fips202,sha3_512,1}, + {keccakf1600_fips202,shake128,2}, + {keccakf1600_fips202,shake256,2}, + {libdecaf_curve25519,ed25519_sign,2}, + {libdecaf_curve25519,ed25519_verify,3}, + {libdecaf_curve25519,ed25519ph_sign,2}, + {libdecaf_curve25519,ed25519ph_verify,3}, + {libdecaf_curve25519,eddsa_keypair,0}, + {libdecaf_curve25519,eddsa_keypair,1}, + {libdecaf_curve25519,eddsa_secret_to_pk,1}, + {libdecaf_curve25519,x25519,1}, + {libdecaf_curve25519,x25519,2}, + {libdecaf_curve25519,x25519_keypair,0}, + {libdecaf_curve25519,x25519_keypair,1}, + {libdecaf_curve448,ed448_sign,2}, + {libdecaf_curve448,ed448_sign,3}, + {libdecaf_curve448,ed448_verify,3}, + {libdecaf_curve448,ed448_verify,4}, + {libdecaf_curve448,ed448ph_sign,2}, + {libdecaf_curve448,ed448ph_sign,3}, + {libdecaf_curve448,ed448ph_verify,3}, + {libdecaf_curve448,ed448ph_verify,4}, + {libdecaf_curve448,eddsa_keypair,0}, + {libdecaf_curve448,eddsa_keypair,1}, + {libdecaf_curve448,eddsa_secret_to_pk,1}, + {libdecaf_curve448,x448,1}, + {libdecaf_curve448,x448,2}, + {libdecaf_curve448,x448_keypair,0}, + {libdecaf_curve448,x448_keypair,1}, + {libdecaf_sha3,hash,2}, + {libdecaf_sha3,hash,3}, + {libsodium_crypto_aead_chacha20poly1305,ietf_decrypt_detached,5}, + {libsodium_crypto_aead_chacha20poly1305,ietf_encrypt_detached,4}, + {libsodium_crypto_box_curve25519xsalsa20poly1305,keypair,0}, + {libsodium_crypto_hash_sha512,crypto_hash_sha512,1}, + {libsodium_crypto_onetimeauth_poly1305,crypto_onetimeauth_poly1305,2}, + {libsodium_crypto_onetimeauth_poly1305,verify,3}, + {libsodium_crypto_scalarmult_curve25519,base,1}, + {libsodium_crypto_scalarmult_curve25519,crypto_scalarmult_curve25519,2}, + {libsodium_crypto_sign_ed25519,detached,2}, + {libsodium_crypto_sign_ed25519,keypair,0}, + {libsodium_crypto_sign_ed25519,seed_keypair,1}, + {libsodium_crypto_sign_ed25519,verify_detached,3}, + {libsodium_crypto_stream_chacha20,ietf_xor_ic,4}, + {lwm2m_coap_dtls_socket,close,1}, + {lwm2m_coap_dtls_socket,connect,2}, + {lwm2m_coap_udp_socket,close,1}, + {lwm2m_coap_udp_socket,get_channel,2}, + {lwm2m_coap_udp_socket,start_link,0}, + {ojson,'decode!',1}, + {ojson,'encode!',1}, + {rebar_config,get_local,3}, + {rebar_rel_utils,get_target_dir,2}, + {rebar_rel_utils,is_rel_dir,0}, + {rebar_rel_utils,load_config,2}, + {replayq,ack,2}, + {replayq,append,2}, + {replayq,close,1}, + {replayq,is_empty,1}, + {replayq,open,1}, + {replayq,pop,2}, + {ssl_verify_hostname,verify_cert_hostname,2}, + {ssl_verify_hostname,verify_fun,3}, + {tftp,start_service,1}, + {tftp,start_standalone,1}, + {tftp,stop_service,1}, + {wx,batch,1}, + {wx,destroy,0}, + {wx,foldl,3}, + {wx,foreach,2}, + {wx,getObjectType,1}, + {wx,get_env,0}, + {wx,is_null,1}, + {wx,new,0}, + {wx,null,0}, + {wx,set_env,1}, + {wx,typeCast,2}, + {wxBoxSizer,new,1}, + {wxBrush,new,1}, + {wxBufferedPaintDC,new,1}, + {wxButton,connect,3}, + {wxButton,new,3}, + {wxCheckBox,connect,3}, + {wxCheckBox,getValue,1}, + {wxCheckBox,isChecked,1}, + {wxCheckBox,new,3}, + {wxCheckBox,new,4}, + {wxCheckBox,set3StateValue,2}, + {wxCheckBox,setValue,2}, + {wxCheckListBox,check,3}, + {wxCheckListBox,connect,3}, + {wxCheckListBox,isChecked,2}, + {wxCheckListBox,new,3}, + {wxClientDC,new,1}, + {wxCursor,destroy,1}, + {wxCursor,new,1}, + {wxDC,clear,1}, + {wxDC,drawLine,3}, + {wxDC,drawLines,2}, + {wxDC,drawRoundedRectangle,4}, + {wxDC,drawText,3}, + {wxDC,getCharHeight,1}, + {wxDC,getCharWidth,1}, + {wxDC,getMultiLineTextExtent,2}, + {wxDC,getSize,1}, + {wxDC,getTextExtent,2}, + {wxDC,setBrush,2}, + {wxDC,setFont,2}, + {wxDC,setPen,2}, + {wxDC,setTextForeground,2}, + {wxDialog,createButtonSizer,2}, + {wxDialog,destroy,1}, + {wxDialog,endModal,2}, + {wxDialog,getAffirmativeId,1}, + {wxDialog,new,4}, + {wxDialog,show,1}, + {wxDialog,showModal,1}, + {wxEvent,skip,1}, + {wxFileDialog,destroy,1}, + {wxFileDialog,getDirectory,1}, + {wxFileDialog,getFilename,1}, + {wxFileDialog,getPath,1}, + {wxFileDialog,new,2}, + {wxFileDialog,showModal,1}, + {wxFont,getFamily,1}, + {wxFont,getPointSize,1}, + {wxFont,isFixedWidth,1}, + {wxFont,new,4}, + {wxFont,setPointSize,2}, + {wxFrame,center,1}, + {wxFrame,connect,2}, + {wxFrame,connect,3}, + {wxFrame,createStatusBar,2}, + {wxFrame,destroy,1}, + {wxFrame,new,4}, + {wxFrame,raise,1}, + {wxFrame,setFocus,1}, + {wxFrame,setIcon,2}, + {wxFrame,setMenuBar,2}, + {wxFrame,setStatusBar,2}, + {wxFrame,setTitle,2}, + {wxFrame,show,1}, + {wxGauge,new,4}, + {wxGauge,pulse,1}, + {wxGauge,setValue,2}, + {wxGraphicsContext,create,1}, + {wxGraphicsContext,destroy,1}, + {wxGraphicsContext,drawRoundedRectangle,6}, + {wxGraphicsContext,drawText,4}, + {wxGraphicsContext,getTextExtent,2}, + {wxGraphicsContext,setBrush,2}, + {wxGraphicsContext,setFont,3}, + {wxGraphicsContext,setPen,2}, + {wxGraphicsContext,strokeLine,5}, + {wxGraphicsContext,strokeLines,2}, + {wxGraphicsContext,translate,3}, + {wxGraphicsRenderer,getDefaultRenderer,0}, + {wxHtmlWindow,connect,2}, + {wxHtmlWindow,new,2}, + {wxHtmlWindow,setPage,2}, + {wxIcon,destroy,1}, + {wxIcon,new,2}, + {wxListBox,append,3}, + {wxListBox,appendStrings,2}, + {wxListBox,clear,1}, + {wxListBox,connect,2}, + {wxListBox,connect,3}, + {wxListBox,delete,2}, + {wxListBox,disconnect,1}, + {wxListBox,getClientData,2}, + {wxListBox,getCount,1}, + {wxListBox,getSelection,1}, + {wxListBox,getString,2}, + {wxListBox,getStringSelection,1}, + {wxListBox,new,3}, + {wxListBox,setClientData,3}, + {wxListBox,setSelection,2}, + {wxListBox,setString,3}, + {wxListCtrl,connect,2}, + {wxListCtrl,connect,3}, + {wxListCtrl,deleteAllItems,1}, + {wxListCtrl,ensureVisible,2}, + {wxListCtrl,getColumnCount,1}, + {wxListCtrl,getColumnWidth,2}, + {wxListCtrl,getItemCount,1}, + {wxListCtrl,getItemText,2}, + {wxListCtrl,getNextItem,3}, + {wxListCtrl,getParent,1}, + {wxListCtrl,insertColumn,3}, + {wxListCtrl,insertItem,3}, + {wxListCtrl,new,2}, + {wxListCtrl,refreshItem,2}, + {wxListCtrl,refreshItems,3}, + {wxListCtrl,setColumnWidth,3}, + {wxListCtrl,setItem,4}, + {wxListCtrl,setItemBackgroundColour,3}, + {wxListCtrl,setItemCount,2}, + {wxListCtrl,setItemState,4}, + {wxListCtrl,setToolTip,2}, + {wxListItem,destroy,1}, + {wxListItem,new,0}, + {wxListItem,setAlign,2}, + {wxListItem,setText,2}, + {wxListItemAttr,destroy,1}, + {wxListItemAttr,new,3}, + {wxMenu,'Destroy',2}, + {wxMenu,append,3}, + {wxMenu,append,4}, + {wxMenu,appendSeparator,1}, + {wxMenu,check,3}, + {wxMenu,connect,2}, + {wxMenu,connect,3}, + {wxMenu,delete,2}, + {wxMenu,destroy,1}, + {wxMenu,findItem,2}, + {wxMenu,getMenuItems,1}, + {wxMenu,insert,3}, + {wxMenu,insert,4}, + {wxMenu,insertCheckItem,5}, + {wxMenu,insertRadioItem,5}, + {wxMenu,insertSeparator,2}, + {wxMenu,new,0}, + {wxMenuBar,append,3}, + {wxMenuBar,check,3}, + {wxMenuBar,findMenu,2}, + {wxMenuBar,getMenu,2}, + {wxMenuBar,insert,4}, + {wxMenuBar,new,0}, + {wxMenuBar,remove,2}, + {wxMessageDialog,destroy,1}, + {wxMessageDialog,new,2}, + {wxMessageDialog,new,3}, + {wxMessageDialog,setTitle,2}, + {wxMessageDialog,showModal,1}, + {wxMiniFrame,new,4}, + {wxNotebook,addPage,3}, + {wxNotebook,addPage,4}, + {wxNotebook,connect,2}, + {wxNotebook,connect,3}, + {wxNotebook,getPageText,2}, + {wxNotebook,getSelection,1}, + {wxNotebook,new,3}, + {wxNotebook,setSelection,2}, + {wxPaintDC,new,1}, + {wxPanel,connect,2}, + {wxPanel,connect,3}, + {wxPanel,new,1}, + {wxPanel,new,2}, + {wxPanel,setSizer,2}, + {wxPanel,setSizerAndFit,3}, + {wxPen,new,1}, + {wxPen,new,2}, + {wxRadioBox,getSelection,1}, + {wxRadioBox,new,7}, + {wxRadioButton,getValue,1}, + {wxRadioButton,new,3}, + {wxRadioButton,new,4}, + {wxRadioButton,setValue,2}, + {wxScrolledWindow,calcScrolledPosition,2}, + {wxScrolledWindow,calcUnscrolledPosition,3}, + {wxScrolledWindow,doPrepareDC,2}, + {wxScrolledWindow,enableScrolling,3}, + {wxScrolledWindow,new,1}, + {wxScrolledWindow,new,2}, + {wxScrolledWindow,setScrollbars,5}, + {wxScrolledWindow,setSizer,2}, + {wxSizer,add,2}, + {wxSizer,add,3}, + {wxSizer,add,4}, + {wxSizer,addSpacer,2}, + {wxSizer,detach,2}, + {wxSizer,getChildren,1}, + {wxSizer,getMinSize,1}, + {wxSizer,hide,2}, + {wxSizer,layout,1}, + {wxSizer,recalcSizes,1}, + {wxSizer,remove,2}, + {wxSizer,setItemMinSize,4}, + {wxSizer,setSizeHints,2}, + {wxSizer,setVirtualSizeHints,2}, + {wxSizer,show,2}, + {wxSizerItem,deleteWindows,1}, + {wxSlider,connect,3}, + {wxSlider,getValue,1}, + {wxSlider,new,6}, + {wxSlider,setValue,2}, + {wxSplitterWindow,new,2}, + {wxSplitterWindow,setMinimumPaneSize,2}, + {wxSplitterWindow,setSashGravity,2}, + {wxSplitterWindow,splitHorizontally,4}, + {wxSplitterWindow,splitVertically,4}, + {wxStaticBoxSizer,new,3}, + {wxStaticLine,new,2}, + {wxStaticText,destroy,1}, + {wxStaticText,new,3}, + {wxStaticText,new,4}, + {wxStaticText,setForegroundColour,2}, + {wxStaticText,setLabel,2}, + {wxStatusBar,new,1}, + {wxStatusBar,setStatusText,2}, + {wxStyledTextCtrl,getText,1}, + {wxStyledTextCtrl,new,1}, + {wxStyledTextCtrl,setKeyWords,3}, + {wxStyledTextCtrl,setLexer,2}, + {wxStyledTextCtrl,setMarginType,3}, + {wxStyledTextCtrl,setSelectionMode,2}, + {wxStyledTextCtrl,setText,2}, + {wxStyledTextCtrl,setUseHorizontalScrollBar,2}, + {wxStyledTextCtrl,styleClearAll,1}, + {wxStyledTextCtrl,styleSetFont,3}, + {wxStyledTextCtrl,styleSetForeground,3}, + {wxSystemOptions,setOption,2}, + {wxSystemSettings,getColour,1}, + {wxSystemSettings,getFont,1}, + {wxSystemSettings,getMetric,1}, + {wxTextAttr,destroy,1}, + {wxTextAttr,new,1}, + {wxTextAttr,new,2}, + {wxTextCtrl,appendText,2}, + {wxTextCtrl,clear,1}, + {wxTextCtrl,connect,2}, + {wxTextCtrl,connect,3}, + {wxTextCtrl,destroy,1}, + {wxTextCtrl,getTextExtent,2}, + {wxTextCtrl,getValue,1}, + {wxTextCtrl,new,2}, + {wxTextCtrl,new,3}, + {wxTextCtrl,saveFile,2}, + {wxTextCtrl,setDefaultStyle,2}, + {wxTextCtrl,setForegroundColour,2}, + {wxTextCtrl,setValue,2}, + {wxTextCtrl,writeText,2}, + {wxTextEntryDialog,destroy,1}, + {wxTextEntryDialog,getValue,1}, + {wxTextEntryDialog,new,2}, + {wxTextEntryDialog,new,3}, + {wxTextEntryDialog,showModal,1}, + {wxToggleButton,new,4}, + {wxToggleButton,setLabel,2}, + {wxToggleButton,setValue,2}, + {wxToolTip,new,1}, + {wxWindow,connect,2}, + {wxWindow,connect,3}, + {wxWindow,destroy,1}, + {wxWindow,disable,1}, + {wxWindow,enable,1}, + {wxWindow,enable,2}, + {wxWindow,findWindowById,1}, + {wxWindow,freeze,1}, + {wxWindow,getBackgroundColour,1}, + {wxWindow,getClientSize,1}, + {wxWindow,getParent,1}, + {wxWindow,getSize,1}, + {wxWindow,getTextExtent,2}, + {wxWindow,getTextExtent,3}, + {wxWindow,hasScrollbar,2}, + {wxWindow,layout,1}, + {wxWindow,popupMenu,2}, + {wxWindow,refresh,1}, + {wxWindow,setBackgroundStyle,2}, + {wxWindow,setClientSize,2}, + {wxWindow,setCursor,2}, + {wxWindow,setFocus,1}, + {wxWindow,setForegroundColour,2}, + {wxWindow,setMinSize,2}, + {wxWindow,setSizer,2}, + {wxWindow,setSizerAndFit,2}, + {wxWindow,setToolTip,2}, + {wxWindow,setVirtualSize,3}, + {wxWindow,thaw,1}, + {wxWindowDC,new,1}, + {wx_misc,beginBusyCursor,0}, + {wx_misc,endBusyCursor,0}, + {wx_misc,getKeyState,1}, + {wx_misc,launchDefaultBrowser,1}, + {wx_object,call,2}, + {wx_object,cast,2}, + {wx_object,get_pid,1}, + {wx_object,start,3}, + {wx_object,start_link,3}, + {wx_object,start_link,4}, + {wx_object,stop,1}, + {wxe_util,get_const,1}, + {xref,add_application,3}, + {xref,analyze,2}, + {xref,set_default,3}, + {xref,set_library_path,2}, + {xref,start,2}, + {xref,stop,1}] + } + +, #{ name => locals_not_used + , analysis => locals_not_used + , excl_apps => + [ + + ] + , excl_mods => + [ + ] + , filters => + [{coap_core_link_parser,return_error,2}, + {core_link_parser,return_error,2}, + {emqx_exhook_pb,e_type_double,3}, + {emqx_exhook_pb,e_type_fixed32,3}, + {emqx_exhook_pb,e_type_fixed64,3}, + {emqx_exhook_pb,e_type_float,3}, + {emqx_exhook_pb,e_type_int32,3}, + {emqx_exhook_pb,e_type_int64,3}, + {emqx_exhook_pb,e_type_sfixed32,3}, + {emqx_exhook_pb,e_type_sfixed64,3}, + {emqx_exhook_pb,e_type_sint,3}, + {emqx_exhook_pb,m_overwrite,3}, + {emqx_exhook_pb,v_ok,3}, + {emqx_exproto_pb,e_type_bool,3}, + {emqx_exproto_pb,e_type_double,3}, + {emqx_exproto_pb,e_type_fixed32,3}, + {emqx_exproto_pb,e_type_fixed64,3}, + {emqx_exproto_pb,e_type_float,3}, + {emqx_exproto_pb,e_type_int32,3}, + {emqx_exproto_pb,e_type_int64,3}, + {emqx_exproto_pb,e_type_sfixed32,3}, + {emqx_exproto_pb,e_type_sfixed64,3}, + {emqx_exproto_pb,e_type_sint,3}, + {emqx_exproto_pb,m_overwrite,3}, + {emqx_exproto_pb,v_ok,3}, + {grpc_health_pb,cons,3}, + {grpc_health_pb,e_type_bool,3}, + {grpc_health_pb,e_type_bytes,3}, + {grpc_health_pb,e_type_double,3}, + {grpc_health_pb,e_type_fixed32,3}, + {grpc_health_pb,e_type_fixed64,3}, + {grpc_health_pb,e_type_float,3}, + {grpc_health_pb,e_type_int32,3}, + {grpc_health_pb,e_type_int64,3}, + {grpc_health_pb,e_type_sfixed32,3}, + {grpc_health_pb,e_type_sfixed64,3}, + {grpc_health_pb,e_type_sint,3}, + {grpc_health_pb,e_varint,3}, + {grpc_health_pb,'erlang_++',3}, + {grpc_health_pb,lists_reverse,2}, + {grpc_health_pb,m_overwrite,3}, + {grpc_health_pb,v_ok,3}, + {grpc_reflection_pb,e_type_bool,3}, + {grpc_reflection_pb,e_type_double,3}, + {grpc_reflection_pb,e_type_fixed32,3}, + {grpc_reflection_pb,e_type_fixed64,3}, + {grpc_reflection_pb,e_type_float,3}, + {grpc_reflection_pb,e_type_int64,3}, + {grpc_reflection_pb,e_type_sfixed32,3}, + {grpc_reflection_pb,e_type_sfixed64,3}, + {grpc_reflection_pb,e_type_sint,3}, + {grpc_reflection_pb,e_varint,3}, + {grpc_reflection_pb,m_overwrite,3}, + {grpc_reflection_pb,v_ok,3}, + {prometheus_text_format,escape_metric_help,1}, + {redbug_parser,return_error,2}, + {rulesql,return_error,2}, + {xmerl_b64Bin,return_error,2}, + {xmerl_xpath_parse,return_error,2}] + } + +, #{ name => deprecated_function_calls + , analysis => deprecated_function_calls + , excl_apps => + [ + + ] + , excl_mods => + [ + ] + , filters => + [{{coap_core_link,join_uri,1},{http_uri,encode,1}}, + {{disk_log_server,dist_pids,1},{pg2,get_members,1}}, + {{disk_log_server,do_accessible_logs,0},{pg2,which_groups,0}}, + {{disk_log_server,do_get_log_pids,1},{pg2,get_members,1}}, + {{disk_log_server,do_open,3},{pg2,create,1}}, + {{disk_log_server,erase_log,2},{pg2,leave,2}}, + {{disk_log_server,handle_info,2},{pg2,join,2}}, + {{gen_fsm,error_info,7},{gen_fsm,format_log,1}}, + {{gen_fsm,error_info,7},{gen_fsm,format_log,2}}, + {{gen_fsm,handle_msg,8},{gen_fsm,format_log,1}}, + {{gen_fsm,handle_msg,8},{gen_fsm,format_log,2}}, + {{httpd_util,decode_hex,1},{http_uri,decode,1}}, + {{httpd_util,encode_hex,1},{http_uri,encode,1}}, + {{igor,tidy,2},{erl_tidy,module,2}}, + {{jose_public_key,pseudo_random_function,1},{crypto,hmac,4}}, + {{lwm2m_coap_client,make_segment,1},{http_uri,decode,1}}, + {{lwm2m_coap_client,resolve_uri,1},{http_uri,parse,2}}, + {{lwm2m_coap_responder,cancel_observer,2},{pg2,delete,1}}, + {{lwm2m_coap_responder,cancel_observer,2},{pg2,get_members,1}}, + {{lwm2m_coap_responder,cancel_observer,2},{pg2,leave,2}}, + {{lwm2m_coap_responder,handle_observe,4},{pg2,create,1}}, + {{lwm2m_coap_responder,handle_observe,4},{pg2,join,2}}, + {{lwm2m_coap_responder,notify,2},{pg2,get_members,1}}, + {{ranch_ssl,handshake,3},{ssl,ssl_accept,3}}] + } + +, #{ name => deprecated_functions + , analysis => deprecated_functions + , excl_apps => + [ + + ] + , excl_mods => + [ + ] + , filters => + [{crypto,hmac,4}, + {erl_tidy,module,2}, + {gen_fsm,format_log,1}, + {gen_fsm,format_log,2}, + {http_uri,decode,1}, + {http_uri,encode,1}, + {http_uri,parse,2}, + {pg2,create,1}, + {pg2,delete,1}, + {pg2,get_members,1}, + {pg2,join,2}, + {pg2,leave,2}, + {pg2,which_groups,0}, + {ssl,ssl_accept,3}] + } +].