diff options
author | Björn Gustavsson <[email protected]> | 2012-08-22 14:54:45 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2012-08-22 16:16:26 +0200 |
commit | e4e5d08621137473674cf3cdce0b36a43a8d6d15 (patch) | |
tree | be27bd18de935d599efa2b48363d9df6d0edc766 /lib/compiler/test/bs_construct_SUITE.erl | |
parent | 064b42237d891d5fdcb6c1a351980b8291437618 (diff) | |
download | otp-e4e5d08621137473674cf3cdce0b36a43a8d6d15.tar.gz otp-e4e5d08621137473674cf3cdce0b36a43a8d6d15.tar.bz2 otp-e4e5d08621137473674cf3cdce0b36a43a8d6d15.zip |
compiler: Warn if the size of a binary segment is invalid
The compiler would silently accept and Dialyzer would crash on
code like:
<<X:(2.5)>>
It is never acceptable for Dialyzer to crash. The compiler should
at least generate a warning for such code. It is tempting to let
the compiler generate an error, but that would mean that code like:
Sz = 42.0,
<<X:Sz>>.
would be possible to compile with optimizations disabled, but not
with optimizations enabled.
Dialyzer crashes because it calls cerl:bitstr_bitsize/1, which
crashes if the type of size for the segment is invalid. The easiest
way to avoid that crash is to extend the sanity checks in v3_core
to also include the size field of binary segments. That will cause
the compiler to issue a warning and to replace the bad binary
construction with a call to erlang:error/1. (It also means that
Dialyzer will not issue a warning for bad size fields.)
Diffstat (limited to 'lib/compiler/test/bs_construct_SUITE.erl')
-rw-r--r-- | lib/compiler/test/bs_construct_SUITE.erl | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/lib/compiler/test/bs_construct_SUITE.erl b/lib/compiler/test/bs_construct_SUITE.erl index 31c7890f26..e8b30f44ce 100644 --- a/lib/compiler/test/bs_construct_SUITE.erl +++ b/lib/compiler/test/bs_construct_SUITE.erl @@ -468,6 +468,10 @@ opt(Config) when is_list(Config) -> ?line {'EXIT',_} = (catch <<<<23,56,0,2>>:64/float>>), ?line {'EXIT',_} = (catch <<<<23,56,0,2:7>>/binary>>), + %% Test constant propagation - there should be a warning. + BadSz = 2.5, + {'EXIT',_} = (catch <<<<N,56,0,2>>:BadSz/binary>>), + case id(false) of true -> ?line opt_dont_call_me(); false -> ok |