dialyxir icon indicating copy to clipboard operation
dialyxir copied to clipboard

Ignore Erlang module or silence errors

Open Doerge opened this issue 3 years ago • 11 comments

Precheck

  • [x] Take a look at the open issues and be sure that your issue is not already covered.
  • [x] Be sure your versions of Dialyxir and Erlex are up to date.

Environment

  • Elixir & Erlang/OTP versions (elixir --version):
Erlang/OTP 24 [erts-12.0.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Elixir 1.12.2 (compiled with Erlang/OTP 24)
  • Which version of Dialyxir are you using? (cat mix.lock | grep dialyxir):
  "dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"},

Current behavior

I get this output when running mix dialyzer:

Finding suitable PLTs
Checking PLT...
[...]
PLT is up to date!
ignore_warnings: .dialyzer_ignore.exs

Starting Dialyzer
[
  check_plt: false,
  init_plt: '.../_build/dev/dialyxir_erlang-24.0.3_elixir-1.12.2_deps-dev.plt',
  files: [
   ...],
  warnings: [:unknown]
]
[...]
________________________________________________________________________________
Please file a bug in https://github.com/jeremyjh/dialyxir/issues with this message.

Unknown error occurred: %Protocol.UndefinedError{description: "", protocol: String.Chars, value: {11238, 1}}


Legacy warning:
src/EconomicWebService.WSDL.xml_client.erl:11238:1: Function 'GetApiInformation'/3 has no local return
________________________________________________________________________________
Please file a bug in https://github.com/jeremyjh/dialyxir/issues with this message.

Unknown error occurred: %Protocol.UndefinedError{description: "", protocol: String.Chars, value: {11239, 67}}


Legacy warning:
src/EconomicWebService.WSDL.xml_client.erl:11239:67: The call soap_client_util:call(Soap_body::any(),Soap_headers::any(),Options::any(),"\"\"",{'interface',[69 | 83 | 87 | 98 | 99 | 101 | 105 | 109 | 110 | 111 | 114 | 118,...],'EconomicWebService.WSDL.xml','1.2','soap_client_inets','soap_server_cowboy_1','undefined','EconomicWebService.WSDL.xml_client',[],[45 | 46 | 47 | 58 | 99 | 101 | 104 | 105 | 109 | 110 | 111 | 112 | 116,...],[1..255,...],'undefined','undefined',[1..255,...],[1..255,...],[1..255,...],[1..255,...],[{'op',[any(),...],atom(),[],'undefined','request_response',atom(),atom(),'undefined'},...],{'model',[{_,_,_,_,_,_,_,_,_,_,_,_},...],[{_,_,_,_},...],[45 | 46 | 47 | 58 | 99 | 101 | 104 | 105 | 109 | 110 | 111 | 112 | 116,...],[],'false','skip'},1,'undefined',[{[any(),...],[any(),...]},...]}) will never return since the success typing is (tuple(),[any()],[{'url',string()}],string(),{'interface',string(),atom(),'1.1' | '1.2',atom(),atom(),atom(),atom(),[any()],string(),string(),'undefined' | string(),'undefined' | [{[any()],'module'}],string(),string(),string(),string(),[{'op',[any()],atom(),[any()],'undefined' | [any()],'notification' | 'request_response',atom() | [any()],atom() | [any()],[any()]}],{'model',_,_,_,_,_,_},integer(),'undefined' | string(),[{[any()],'undefined' | [any()]}]}) -> {'error',{'client',{'http_request',_} | {'encoding_body',_,_} | {'parsing_message',_,maybe_improper_list(),_,_}} | {'server',integer(),[{_,_}]},maybe_improper_list(binary() | maybe_improper_list(any(),binary() | []) | byte(),binary() | [])} and the contract is (Body::tuple(),Headers::[any()],Options::[option()],Soap_action::string(),interface()) -> soap_response()
________________________________________________________________________________
done (warnings were emitted)
Halting VM with exit status 2

In my Elixir/Phoenix project I call a Soap endpoint that I have generated an Erlang client for using https://github.com/bet365/soap The above errors originate in this Erlang module.

I don't really expect Dialyzer/Dialyxir to check this module. I would be happy if I could just silence them instead.

However specifying this in my dialyzer_ignore.exs file doesn't work:

[
    {"src/EconomicWebService.WSDL.xml_client.erl"}
]

How can I either tell Dialyxir to ignore these erlang files, or alternatively just silence the warnings?

(PS: Thanks for a great project! 👏 )

Doerge avatar Jul 20 '21 10:07 Doerge

We might have hit the same issue with code generated by the erlang backend for purescript. We've tried ignoring the errors but dialyzer_ignore.ex doesn't work, and we're getting hundreds of these errors since it's in generated code.

Please file a bug in https://github.com/jeremyjh/dialyxir/issues with this message.
Unknown error occurred: %Protocol.UndefinedError{description: "", protocol: String.Chars, value: {49, 5}}
Legacy warning:
/workspace/.spago/datetime/v5.0.2-erl1/src/Data/DateTime/Instant.purs:49:5: The variable _ can never match since previous clauses completely covered the type any()

Code in question:

-file("/workspace/.spago/datetime/v5.0.2-erl1/src/Data/DateTime/Instant.purs", 49).
-spec unInstant() -> fun((any()) -> any()).
unInstant() -> fun (V) ->
  case V of
    (_@0) -> _@0
  end
end.
-file("/workspace/.spago/datetime/v5.0.2-erl1/src/Data/DateTime/Instant.purs", 49).
-spec unInstant(any()) -> any().
unInstant(_@1) -> case _@1 of
  (_@2) -> _@2
end.

generated from this purescript code:

newtype Instant
  = Instant Milliseconds

unInstant (Instant ms) = ms

Thanks for the project, let me know if I can help further!

drathier avatar Jul 26 '21 21:07 drathier

I'm getting the same error in a project with some parsers generated with Erlang's leex and yecc:

Please file a bug in https://github.com/jeremyjh/dialyxir/issues with this message.

Unknown error occurred: %Protocol.UndefinedError{description: "", protocol: String.Chars, value: {276, 1}}


Legacy warning:
/usr/local/Cellar/erlang/20.0/lib/erlang/lib/parsetools-2.1.5/include/leexinc.hrl:276:1: Function yyrev/2 will never be called
________________________________________________________________________________
Please file a bug in https://github.com/jeremyjh/dialyxir/issues with this message.

Unknown error occurred: %Protocol.UndefinedError{description: "", protocol: String.Chars, value: {60, 26}}


Legacy warning:
/usr/local/Cellar/erlang/20.0/lib/erlang/lib/parsetools-2.1.5/include/yeccpre.hrl:60:26: Call to missing or unexported function erlang:get_stacktrace/0

marcelotto avatar Sep 25 '21 20:09 marcelotto

If anyone can provide a repo I can check out and reproduce this error I will be happy to take a look.

jeremyjh avatar Sep 27 '21 14:09 jeremyjh

The errors I've reported are from https://github.com/rdf-elixir/rdf-ex.

However, I'm only getting them locally (under Elixir 1.12.2 and OTP 24.0.1), but not on CI with the same versions, which makes me wonder if my local setup is somehow broken, especially with the paths in the warnings pointing to /usr/local/Cellar/erlang/20.0/. I'm using the Erlang plugin for asdf locally, and I'm not experiencing any other issues with this setup otherwise. 🤔

marcelotto avatar Sep 27 '21 19:09 marcelotto

@marcelotto I wasn't able to reproduce it locally using those versions of Erlang/Elixir (with asdf). My guess is there is a stale PLT file; by default we create a new PLT for each different version of Erlang/Elixir but that project is using a single-hard coded file per its mix.exs, if you just delete priv/plts/dialyzer.plt and re-run it my guess is it will work.

jeremyjh avatar Sep 28 '21 13:09 jeremyjh

My bad. I assumed that mix dialyzer.clean would do that. Sorry for the noise. And thanks for the check and the hint (and maintaining this great project in general).

marcelotto avatar Sep 28 '21 14:09 marcelotto

Ah, thats actually a bug if it doesn't.

jeremyjh avatar Sep 28 '21 16:09 jeremyjh

Before you start investigating further, let me try a manual cleanup when I'm back home. I just answered your last comment quickly during a break in my day job.

marcelotto avatar Sep 28 '21 16:09 marcelotto

Ok, mix dialyzer.clean successfully deletes the PLT file. So, I guess something else in my local environment must be the cause.

marcelotto avatar Sep 28 '21 19:09 marcelotto

@jeremyjh Thanks for replying!

I've made a repro repo here: https://github.com/Doerge/dialyxir-bug-repro/commits/master

Am I doing something obvious wrong with Dialyxir/Dialyzer?

Doerge avatar Sep 29 '21 19:09 Doerge

Although unrelated to this issue, I thought I share the final solution to the occurrence of this error in the context of leex and yecc parsers, just if someone else stumbles across this issue from this direction: due to this open Elixir issue, the Erlang parsers from the leex and yecc grammars were generated under an older Erlang version and got never cleaned up. After deleting the generated Erlang files in src/ manually, so they could be regenerated under the current version, everything worked fine.

marcelotto avatar Oct 03 '21 21:10 marcelotto

If anyone can provide a repo I can check out and reproduce this error I will be happy to take a look.

@jeremyjh Someone on the Elixir Slack reached out to me about a PR of theirs and I was able to reproduce it: https://github.com/lexical-lsp/lexical/pull/217

If you want to chat about this and discuss a solution, let me know!

Nezteb avatar Jun 15 '23 02:06 Nezteb