Age | Commit message (Collapse) | Author |
|
Handle immediate opaque types as aliases:
A declaration of dict/0
-opaque dict() :: dict(_, _).
-opaque dict(Key, Value) :: ...
is handled as an alias, that is, when using dict() it is immediately
replaced by dict(_, _).
This is a means to avoid having to handle equivalent opaque types
later. To be changed if it doesn't work well.
|
|
* bjorn/lc-warnings/OTP-11626:
dialyzer: Silence useless warnings about list comprehensions
|
|
* kostis/dialyzer-r17c0-fixes:
Shut off a dialyzer unmatched return warning
Add a spec for a function that does not return
|
|
|
|
Dialyzer will warn if the value of list comprehension is
ignored by putting it in a sequence like this:
[SomeSideEffect(E) || E <- Es],
ok
To avoid a warning, you'll have to write:
_ = [SomeSideEffect(E) || E <- Es],
ok
Most of the time, this warning is merely annoying because it does
not point out any real errors.
Kostis Sagonas suggested that by suppressing the warning for
list comprehension that return a list of a simple type (e.g. ['ok']),
there would be no warning for code such as:
[io:format("~p\n", [E]) || E <- Es],
ok
but there would be still be a warning for:
[file:close(Fd) || Fd <- Fds],
ok
because an error condition is ignored.
|
|
Dialyzer does not like list comprehensions for which the result is not
assigned to some variable (maybe anonymous). In this particular case,
the comprehension, containing only a filter but no generator, was used
to save some lines, but IMO this type of code, while "cute", is not so
easy to comprehend.
|
|
|
|
|
|
|
|
|
|
* hb/dialyzer/opaque_types_fixes/OTP-10397:
[dialyzer] Re-work the handling of opaque types
|
|
It is now OK to inspect and modify the internals of opaque types within
the scope of the module.
The contracts are used for decorating types with opaqueness when it is
harmless to do so. The opaqueness is propagated by the typesig module
and also by the dataflow module.
A lot of details have been fixed or updated. In particular the modules
erl_types and erl_bif_types have been modified extensively.
The version in vsn.mk has been updated to 2.7. The reason is a
modification of #opaque{} in erl_types.
Dialyzer seems to be about five percent slower than it used to be.
|
|
The branch that patched this file to handle the new "named funs"
added an extra argument to the main function of the module but
forgot to update its spec.
|
|
|
|
Dialyzer so far only supported letrecs at the top-level
and comprehension-like letrecs (i.e. that were directly applied)
in their body.
This commit address this issue by storing in the callgraph
bound letrec labels pointing to their functions. This information
is then used by the dataflow to properly lookup recursive
definitions.
|
|
|
|
R17 will come without support for 'gs' so the old gs-based GUI of dialyzer
has been removed.
|
|
|
|
A bug that made it impossible to do any analyses from the GUI has been
fixed. The bug was introduced in dialyzer-2.5.2.
|
|
* sa/dialyzer-bitstring-fixes/OTP-11027:
Minor refactorings
Fix minor error in natively compiled module list
Fix notification for duplicate modules
Fix an error in the type inference of bitstring data
|
|
|
|
Even though dialyzer_typesig is the module doing most of the work, compiling it
to native code twice will not make it faster than the rest. :-)
|
|
Dialyzer fails when asked to analyze multiple modules with the same name, but
the error message was erroneous. With this patch Dialyzer generates a correct
error message.
Bug reported and patch submitted by Maxim Treskin.
|
|
Dialyzer was constraining bitstring data used in the construction of other
bitstring values too much. These constraints have now been relaxed.
|
|
To reproduce, create an empty file "foo.erl" and run dialyzer on it.
Results without this patch:
$ dialyzer --src /tmp/foo.erl
Checking whether the PLT /Users/magnus/.dialyzer_r16_plt is up-to-date... yes
Proceeding with analysis...
dialyzer: Analysis failed with error:
Could not scan the following file(s): [{"/tmp/foo.erl",
["/tmp/foo.erl:1: no module definition\n"]}]
Last messages in the log cache:
Reading files and computing callgraph...
Results with this patch:
$ dialyzer --src /tmp/foo.erl
Checking whether the PLT /Users/magnus/.dialyzer_r16_plt is up-to-date... yes
Proceeding with analysis...
dialyzer: Analysis failed with error:
Could not scan the following file(s):
/tmp/foo.erl:1: no module definition
Last messages in the log cache:
Reading files and computing callgraph...
|
|
The function name can give information that the line number doesn't,
for example when using a parse transform that creates new functions.
|
|
|
|
* ks/dialyzer-R16B-final-fixes/OTP-10865:
Native code compilation changes
Code simplification
Simplify a case construct using inequality
Simplify a case construct using a boolean operator
Code simplifications + take out obsolete note
|
|
Add more files to be compiled to native code and
do the native code compilation in parallel if there are enough cores.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* sa/dialyzer-list-spec/OTP-10740:
Report spec discrepancy on mismatching lists
|
|
With silent rules, the output of make is less verbose and compilation
warnings are easier to spot. Silent rules are disabled by default and
can be disabled or enabled at will by make V=0 and make V=1.
|
|
This patch enables Dialyzer to detect cases where a function has a specification
for a return type containing some list with elements different than the ones
Dialyzer's own algorithm can infer e.g. a function specified to return [atom()]
when actually [[atom()]] is returned.
Previously Dialyzer remained silent, under normal operation, seeing that these
two types have the empty list as a common element, so they were not 'completely
irrelevant'.
|
|
|
|
|
|
Analysis is not always able to find the variable labels and names for any kind
of arguments passed to the ets module functions.
|
|
This extension allowed minimal detection of race conditions that were passing
through behaviour API calls, but had no tests in any suite and also caused a
crash in R15B02.
|
|
|
|
Dialyzer no longer outputs warnings for unused anonymous functions
("funs"). Warnings are still output for unused functions.
Funs in functions with -nowarn_unused_function attributes generated
warnings for unused functions. Unused list comprehensions also
generated warnings for unused funs.
|
|
|
|
Dialyzer forgot to stop a server process before finishing its analysis.
This is a concurrency error detected by Concuerror.
|
|
|
|
|
|
The original implementation of the type signature solver is called 'v1'
and the newly introduced alternative implementation is called 'v2'.
It is possible to run just the one of the solvers (in case there is a
bug in for instance the v2 implementation) or both solvers
("--solver v1 --solver v2"). In the latter case an error is thrown if
the outcome differ.
|
|
An alternative implementation of the solver in dialyzer_typesig has
been introduced. It is faster than the original implementation.
Note: there is code for "loop detection". Where a loop occurs, the
evaluation is stopped and the current solution returned. This
behaviour is consistent with how the original implementation works.
There are a few known cases where the loop detection kicks in. They
are due to bugs which will hopefully be fixed in a near future.
|