From 5d91deb83e5d3f48523642418e6d5511acf1a04a Mon Sep 17 00:00:00 2001 From: William Yang Date: Mon, 29 Aug 2022 14:33:48 +0200 Subject: [PATCH 1/8] ci: add escript xref check Check all the released modules --- Makefile | 1 + scripts/xref-check.escript | 41 ++ scripts/xref_check.eterm | 863 +++++++++++++++++++++++++++++++++++++ 3 files changed, 905 insertions(+) create mode 100755 scripts/xref-check.escript create mode 100644 scripts/xref_check.eterm 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}] + } +]. From eed5a24e408fdf65405726bd919b0e7141c4a247 Mon Sep 17 00:00:00 2001 From: William Yang Date: Thu, 1 Sep 2022 08:47:28 +0200 Subject: [PATCH 2/8] ci(xref): don't check observer --- scripts/xref_check.eterm | 320 +-------------------------------------- 1 file changed, 1 insertion(+), 319 deletions(-) diff --git a/scripts/xref_check.eterm b/scripts/xref_check.eterm index 82fc3465f..f1fa0f2f4 100644 --- a/scripts/xref_check.eterm +++ b/scripts/xref_check.eterm @@ -249,8 +249,7 @@ , #{ name => undefined_functions , analysis => undefined_functions , excl_apps => - [ - + [ observer ] , excl_mods => [ @@ -403,323 +402,6 @@ {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}, From aee1350b1d4f5215260ebeb5450cc23677c12973 Mon Sep 17 00:00:00 2001 From: William Yang Date: Thu, 1 Sep 2022 08:54:55 +0200 Subject: [PATCH 3/8] ci(xref): remove reqplayq --- scripts/xref_check.eterm | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/scripts/xref_check.eterm b/scripts/xref_check.eterm index f1fa0f2f4..14692e6ce 100644 --- a/scripts/xref_check.eterm +++ b/scripts/xref_check.eterm @@ -24,6 +24,8 @@ {{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}}, + + %% Exclude hipe which is disabled {{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}, @@ -34,17 +36,14 @@ {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}, @@ -391,23 +390,20 @@ {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}, + + %% Xref could not check itself {xref,add_application,3}, {xref,analyze,2}, {xref,set_default,3}, {xref,set_library_path,2}, {xref,start,2}, - {xref,stop,1}] + {xref,stop,1} + ] } , #{ name => locals_not_used From 8b6b9a0d202fb8b2dcedba4377b8da2d5cad7b65 Mon Sep 17 00:00:00 2001 From: William Yang Date: Thu, 1 Sep 2022 11:52:09 +0200 Subject: [PATCH 4/8] ci(xref): excl release related modules --- scripts/xref-check.escript | 6 ++++- scripts/xref_check.eterm | 45 +++++++++++++++++--------------------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/scripts/xref-check.escript b/scripts/xref-check.escript index 65c0fa857..e0ff1d3a7 100755 --- a/scripts/xref-check.escript +++ b/scripts/xref-check.escript @@ -1,5 +1,10 @@ #!/usr/bin/env escript +%%% @doc +%%% Unlike rebar3 xref check, this script runs the full xref checks in the EMQX release dir, +%%% meaning all the modules for release are analysed. +%%% For behavior configuration, all rebar3 related modules attributes, filters are not used in this script, +%%% instead all the filters, checks are defined in `xref_check.eterm` main(_) -> {ok, [Jobs]} = file:consult("scripts/xref_check.eterm"), lists:foreach(fun(#{ name := Name @@ -20,7 +25,6 @@ main(_) -> [ok = xref:remove_module(Name, M) || M <- ExclMods ], - ModuleInfos = xref:info(Name, modules), LibInfos = xref:info(Name, modules), true = ets:insert(Tid, ModuleInfos ++ LibInfos), diff --git a/scripts/xref_check.eterm b/scripts/xref_check.eterm index 14692e6ce..9616173ca 100644 --- a/scripts/xref_check.eterm +++ b/scripts/xref_check.eterm @@ -8,7 +8,11 @@ , excl_mods => [ hipe_unified_loader , systools_make + , systools + , systools_relup , basho_bench_driver_erldis + , release_handler + , cuttlefish_rebar_plugin ] , filters => [{{coap_client,channel_apply,3},{coap_dtls_socket,close,1}}, @@ -39,11 +43,6 @@ {{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_misc,ipv6_probe,1},{gen_tcp,ipv6_probe,0}}, {{eredis_parser,test,0},{eunit,test,1}}, {{gen_rpc_driver_ssl,authenticate_client,3}, @@ -230,18 +229,8 @@ {{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}}] + {{ranch_app,profile_output,0},{eprof,stop_profiling,0}} + ] } %% Check undefined_functions @@ -251,7 +240,11 @@ [ observer ] , excl_mods => - [ + [ systools + , systools_make + , release_handler + , systools_relup + , cuttlefish_rebar_plugin ] , filters => [{'Elixir.Atom',to_string,1}, @@ -302,6 +295,8 @@ {gen_leader,leader_node,1}, {gen_leader,start_link,6}, {gen_tcp,ipv6_probe,0}, + + %% We dont use hipes {hipe,compile,4}, {hipe_bifs,add_ref,2}, {hipe_bifs,alloc_data,3}, @@ -326,6 +321,8 @@ {hipe_bifs,write_u32,2}, {hipe_bifs,write_u64,2}, {hipe_bifs,write_u8,2}, + + {jsone,decode,1}, {jsone,encode,2}, {jsx,decode,2}, @@ -386,10 +383,6 @@ {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}, {ssl_verify_hostname,verify_cert_hostname,2}, {ssl_verify_hostname,verify_fun,3}, {tftp,start_service,1}, @@ -410,7 +403,6 @@ , analysis => locals_not_used , excl_apps => [ - ] , excl_mods => [ @@ -471,6 +463,11 @@ {grpc_reflection_pb,m_overwrite,3}, {grpc_reflection_pb,v_ok,3}, {prometheus_text_format,escape_metric_help,1}, + + %% + %% To be used in grammar files to throw an error message to the parser + %% toplevel. Doesn't have to be exported! + %% {redbug_parser,return_error,2}, {rulesql,return_error,2}, {xmerl_b64Bin,return_error,2}, @@ -481,7 +478,6 @@ , analysis => deprecated_function_calls , excl_apps => [ - ] , excl_mods => [ @@ -517,7 +513,6 @@ , analysis => deprecated_functions , excl_apps => [ - ] , excl_mods => [ From fef088220cada23c8b586d4ef49eecfc30e90305 Mon Sep 17 00:00:00 2001 From: William Yang Date: Fri, 2 Sep 2022 10:06:09 +0200 Subject: [PATCH 5/8] ci(xref): handle non-existing apps/modules --- scripts/xref-check.escript | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/xref-check.escript b/scripts/xref-check.escript index e0ff1d3a7..4bf5e95f1 100755 --- a/scripts/xref-check.escript +++ b/scripts/xref-check.escript @@ -18,12 +18,16 @@ main(_) -> 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 + [ case xref:remove_application(Name, App) of + ok -> ok; + {error, xref_base, {no_such_application, _}} -> ok + end || App <- ExclApps ], - [ok = xref:remove_module(Name, M) || - M <- ExclMods + [case xref:remove_module(Name, M) of + ok -> ok; + {error, M, _R} -> ok + end || M <- ExclMods ], ModuleInfos = xref:info(Name, modules), LibInfos = xref:info(Name, modules), From 9dd5e26ddfa4ad703b6da6f5b214bf4b500abb3c Mon Sep 17 00:00:00 2001 From: William Yang Date: Fri, 2 Sep 2022 10:27:31 +0200 Subject: [PATCH 6/8] ci(xref): handle no_such_module --- scripts/xref-check.escript | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/xref-check.escript b/scripts/xref-check.escript index 4bf5e95f1..36c4c57c2 100755 --- a/scripts/xref-check.escript +++ b/scripts/xref-check.escript @@ -25,8 +25,9 @@ main(_) -> ], [case xref:remove_module(Name, M) of - ok -> ok; - {error, M, _R} -> ok + ok -> ok; + %% but in doc it should return '{error, module(), Reason}` + {error, xref_base, {no_such_module, M}} -> ok end || M <- ExclMods ], ModuleInfos = xref:info(Name, modules), From 820b60f44898fafa3a58754b639c527a068608b9 Mon Sep 17 00:00:00 2001 From: William Yang Date: Mon, 5 Sep 2022 10:56:17 +0200 Subject: [PATCH 7/8] build: add rel to xref deps --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0f651098c..998eaec56 100644 --- a/Makefile +++ b/Makefile @@ -114,7 +114,7 @@ $(PROFILES:%=deps-%): $(REBAR) get-dashboard @rm -f rebar.lock .PHONY: xref -xref: $(REBAR) +xref: $(REBAR) $(REL_PROFILES:%=%-rel) @$(REBAR) as check xref @scripts/xref-check.escript From 432eae6e55e2aaffe0419210152e5d77568c3214 Mon Sep 17 00:00:00 2001 From: William Yang Date: Tue, 6 Sep 2022 10:24:19 +0200 Subject: [PATCH 8/8] ci(xref): support emqx-ee profile --- scripts/xref-check.escript | 78 +++++++++++++++++++++----------------- scripts/xref_check.eterm | 1 + 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/scripts/xref-check.escript b/scripts/xref-check.escript index 36c4c57c2..a257734d4 100755 --- a/scripts/xref-check.escript +++ b/scripts/xref-check.escript @@ -7,44 +7,52 @@ %%% instead all the filters, checks are defined in `xref_check.eterm` 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)), - [ case xref:remove_application(Name, App) of - ok -> ok; - {error, xref_base, {no_such_application, _}} -> ok - end || App <- ExclApps - ], - - [case xref:remove_module(Name, M) of - ok -> ok; - %% but in doc it should return '{error, module(), Reason}` - {error, xref_base, {no_such_module, M}} -> ok - end || 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), + lists:foreach(fun(J) -> do_check(J) end, Jobs), case get(is_warn_found) of true -> halt(1); _ -> ok end. + +do_check(#{ name := Name + , analysis := Analysis + , excl_apps := ExclApps + , excl_mods := ExclMods + , filters := Filters + }) -> + xref:start(Name), + %% Build a table for later printing more informative warnings. + %% The table is currently not in use. + Tid = ets:new(Name, [ordered_set, named_table]), + xref:set_default(Name, [{verbose,false}, {warnings,false}]), + Profile = case filelib:is_file("EMQX_ENTERPRISE") of + true -> 'emqx-ee'; + false -> emqx + end, + Dir = filename:join(["_build/", Profile, "rel/emqx/lib/"]), + xref:add_release(Name, Dir), + xref:add_application(Name, code:lib_dir(erts)), + [ case xref:remove_application(Name, App) of + ok -> ok; + {error, xref_base, {no_such_application, _}} -> ok + end || App <- ExclApps + ], + + [case xref:remove_module(Name, M) of + ok -> ok; + %% but in doc it should return '{error, module(), Reason}` + {error, xref_base, {no_such_module, M}} -> ok + end || M <- ExclMods + ], + ModuleInfos = xref:info(Name, modules), + LibInfos = xref:info(Name, libraries), + 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). diff --git a/scripts/xref_check.eterm b/scripts/xref_check.eterm index 9616173ca..d09bee6a8 100644 --- a/scripts/xref_check.eterm +++ b/scripts/xref_check.eterm @@ -1,3 +1,4 @@ +%% -*- mode: erlang; -*- [ %% Check undefined_function_calls #{ name => undefined_function_calls , analysis => undefined_function_calls