Dialyzer warning from hell: no_return when calling erl_tar.create

Im trying to isolate why i cannot get dialyzer to stop complaining about no_return

I have tried so much

any help is appreciated even if only a pat on the shoulder.

This is why i like statically and strongly typed languages. You either compile or you don’t.

the code in question :frowning:

:write is not an option on :erl_tar.create

3 Likes

Thats annoying. Really annoying. Thanks. Why cant dialyzer see that. And it works with :write so dialyzer is actually wrong …even if its correct about the types

btw i deleted the repo, but the original problem was in testcontainers for elixir, which is now totally free of both dialyzer warnings or dialyzer warning suppressions

That’s how types work everywhere. Type checkers complain if you pass something not meant to be handled, not if you pass something not able to be handled. Otherwise you couldn’t do anything like an match wildcard or an else statement of an if, because they might handle more cases than the explicitly expected ones.

1 Like

Is it really?

defp create_tar_stream(file_name, file_contents) do
    tar_file = "/tmp/#{file_name}.tar"

    with :ok <-
           :erl_tar.create(tar_file, [{String.to_charlist(file_name), file_contents}], [
             :this_should_not_be_here,
             :compressed
           ]),
         {:ok, tar_file_contents} <- File.read(tar_file),
         :ok <- File.rm(tar_file) do
      {:ok, tar_file_contents}
    end
  end
end

This code works as well, but it’s definitely not correct… it just didn’t break.

:erl_tar.create/3 however is spec’ed for:

-spec create(file:filename_all(), filelist(), [create_opt()]) → ok | {error, term()} | {error, {string(), term()}}

and create_opt is:

-type create_opt() :: compressed | cooked | dereference | verbose.

If the typespec is a statement of intention, then Dialyzer was correct… if very, very unclear.

That’s what drives me crazy about Dialyzer… every time I though it was wrong, it turned out that I was: but Dialyzer was so opaque about what it was complaining about that figuring out the cure was often times worse than the disease.

i think i agree to both of you @sbuttgereit and @LostKobrakai, at least partially :slight_smile:

Its an added bonus that dialyzer warns about things that “should not work”, in addition to things that “cannot work” :slight_smile:

Dialyzer is like the wise old monk that won’t stop hitting me over the head with a stick.

1 Like

its more like this :rofl:
Kung Fu Fighting GIF|100%x100%
couldnt find a gif with an old wise monk hitting with his stick :stuck_out_tongue:

1 Like

Close enough.

1 Like