Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No Erlang compile time errors for missing functions

Tags:

erlang

Why is there no compile time errors or warnings when I call a function in another module that doesn't exist or has the wrong arity?

The compiler has all of the exports information in a module to make this possible. Is it just not implemented yet or is there a technical reason why it is not possible that I am not seeing?

like image 769
Andy Till Avatar asked Mar 13 '13 22:03

Andy Till


2 Answers

I don't know why it's missing (probably because modules are completely separate and compilation of one doesn't depend on the other really - but that's just speculation). But I believe you can find problems like this with dialyzer static analysis. Have a look at http://www.erlang.org/doc/man/dialyzer.html

It's part of the system itself, so try including it in your workflow.

like image 65
viraptor Avatar answered Sep 20 '22 08:09

viraptor


It is as others have said. Modules are compiled separately and there is absolutely no guarantee that the environment which exists at compile-time is the same as the one that will exit at run-time. This implies that doing checks at compile-time about the existence of a module, or of a function in it, is basically meaningless. At run-time that module may or may not be loaded, the function you call may or may not be defined in the module, or it may do something completely different from what you expected.

All this is due to the very dynamic nature of Erlang systems. There is no real way as such to define what is in system at run-time. Hot code-loading is a part of this and works properly because of the dynamic nature of the system. It means you can redefine the system at run-time, you can load in new versions of existing modules with a different interface and you can load in completely new modules and remove existing modules.

For this to work all checks about the existence of a module or function must be done at run-time.

Tools like dialyzer can help with this but they do assume that you don't do anything "funny" at run-time and the system you check is the same as the system you run. Which is of course all good, but very static. And against Erlang's nature which is to be dynamic, in everything.

Unfortunately, in this case, you can't both have your cake and eat it.

like image 45
rvirding Avatar answered Sep 18 '22 08:09

rvirding