Erlang/OTP 29.0

This release of Erlang/OTP can be built from source or installed using pre-built packages for your OS or third-party tools (such as kerl, asdf or mise).

docker run -it erlang:29.0
Initial Release OTP 29.0
Git Tag OTP-29.0
Date 2026-05-13
Issue Id
ERIERL-1314
ERIERL-1315
ERIERL-1319
System OTP
Release 29
Application
Potential Incompatibilities

Highlights #

OTP-19747
Application(s):
erts
Related Id(s):

PR-10126

The JIT now generates better code for matching or creating binaries with multiple little-endian segments.

OTP-19784
Application(s):
compiler, erts
Related Id(s):

PR-10230, PR-10234

In the documentation for the compile module, a section has been added with recommendations for implementors of languages running on the BEAM. Documentation has also been added for the to_abstr, to_exp, and from_abstr options.

The documentation for erlc now lists .abstr as one of the supported options.

When compiling with the to_abstr option, the resulting .abstr file now retains any -doc attributes present in the source code.

OTP-19785
Application(s):
compiler, debugger, dialyzer, erts, stdlib
Related Id(s):

PR-10617

Native records as described in EEP-79 has been implemented.

A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.

Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.

OTP-19809
Application(s):
compiler, dialyzer, erts
Related Id(s):

PR-10276

The guard BIF is_integer/3 has been added. It follows the design of the original EEP-16, only changing the name from is_between to is_integer. This BIF takes in 3 parameters, Term, LowerBound, and UpperBound.

It returns true if Term, LowerBound, and UpperBound are all integers, and LowerBound =< Term =< UpperBound; otherwise, it returns false.

Example:

1> I = 42.
2> is_integer(I, 0, 100).
true
OTP-19826
Application(s):
stdlib
Related Id(s):

PR-10281

There are new functions for random permutation of a list: rand:shuffle/1 and rand:shuffle_s/2. They are inspired by a suggestion and discussion on ErlangForums.

OTP-19842
POTENTIAL INCOMPATIBILITY
 

In the default code path for the Erlang system, the current working directory (.) is now in the last position instead of the first.

OTP-19866
Application(s):
compiler
Related Id(s):

PR-9223

Function application is now left associative. That means one can now write:

f(X)(Y)

instead of:

(f(X))(Y)
OTP-19887
Application(s):
otp
Related Id(s):

PR-10417

The old-style type tests in guards (integer, atom, and so on) have been scheduled for removal in Erlang/OTP 30. They have been deprecated for a long time.

OTP-19898
Application(s):
compiler, stdlib
Related Id(s):

PR-9134

There will now be a warning when exporting variables out of a subexpression. For example:

case file:open(File, AllOpts = [write,{encoding,utf8}]) of
    {ok,Fd} ->
        {Fd,AllOpts}
end

To avoid the warning, this can be rewritten to:

AllOpts = [write,{encoding,utf8}],
case file:open(File, AllOpts) of
    {ok,Fd} ->
        {Fd,AllOpts}
end

The warning can be suppressed by giving option nowarn_export_var_subexpr to the compiler.

OTP-19918
Application(s):
compiler
Related Id(s):

PR-9115

There is a new option warn_obsolete_bool_op that instruct the compiler to emit warnings for the and and or operators. It is recommended to instead use the modern andalso and orelse operators, or , and ; in guards.

OTP-19922
Application(s):
stdlib
Related Id(s):

PR-10532

graph is a new module that is a functional equivalent of the digraph and digraph_utils modules.

OTP-19927
POTENTIAL INCOMPATIBILITY
 

Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:

1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
ok
2> fh(lists:seq(1, 10)).
* exception error: bad filter 2614250

In Erlang/OTP 29, attempting to bind a variable in a comprehension will fail by default:

1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
* 5:14: matches using '=' are not allowed in comprehension qualifiers
unless the experimental 'compr_assign' language feature is enabled.
With 'compr_assign' enabled, a match 'P = E' will behave as a
strict generator 'P <-:- [E]'."

However, this example will work as expected if the compr_assign feature is enabled when starting the runtime system:

$ erl -enable-feature compr_assign
. . .
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
ok
2> fh(lists:seq(1, 10)).
[2614250]

Here is another example how compr_assign can be used:

-module(example).
-feature(compr_assign, enable).
-export([cat/1]).

cat(Files) ->
    [Char || F <- Files,
             {ok, Bin} = file:read_file(F),
             Char <- unicode:characters_to_list(Bin)].
OTP-19938
Application(s):
compiler, stdlib
Related Id(s):

PR-10421

There will now be a warning when using the catch operator, which has been deprecated for a long time.

It is recommended to instead use trycatchend but is also possible to disable the warning by using the nowarn_deprecated_catch option.

OTP-19942
Application(s):
compiler, debugger, stdlib, syntax_tools
Related Id(s):

PR-9374

Multi-valued comprehensions according to EEP 78 has been implemented.

Example:

> [I, -I || I <- lists:seq(1, 5)].
[1,-1,2,-2,3,-3,4,-4,5,-5]
OTP-19943
Application(s):
compiler, stdlib
Related Id(s):

PR-10433

There will now be a warning for matches that unify constructors, such as the following:

m({a,B} = {Y,Z}) -> . . .

Such a match can be rewritten to:

m({a=Y,B=Y}) -> . . .

The compiler option nowarn_match_alias_pats can be used to disable the warning.

OTP-19960
Application(s):
otp

There is no longer a 32-bit Erlang/OTP build for Windows.

OTP-19963
Application(s):
erts, stdlib
Related Id(s):

PR-10626

While the iteration order for maps is undefined, it is now guaranteed that all ways of iterating over maps provides the elements in the same order. That is, all of the following ways of iterating will produce the elements in the same order:

  • maps:keys/1
  • maps:values/1
  • maps:to_list/1
  • maps:to_list(maps:iterator(M))
  • Map comprehension: [{K,V} || K := V <- M]
OTP-19965
POTENTIAL INCOMPATIBILITY
 

The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides protection against both classical and quantum computer attacks while maintaining backward compatibility through automatic fallback to other algorithms when peers don’t support it.

OTP-19968
Application(s):
compiler
Related Id(s):

PR-10646

The compiler now generates more efficient code for map comprehensions with constant values that don’t depend on the generator, such as the following:

#{K => 42} || K <- List}.
#{K => X || K <- List}.
#{K => {X, Y} || K <- List}.
OTP-19969
POTENTIAL INCOMPATIBILITY
 

The SSH daemon now defaults to disabled for shell and exec services, implementing the “secure by default” principle. This prevents authenticated users from executing arbitrary Erlang code unless explicitly configured.

Applications requiring shell or exec functionality must now explicitly enable:

  %% Enable Erlang shell
  ssh:daemon(Port, [{shell, {shell, start, []}} | Options])

  %% Enable Erlang term evaluation via exec
  ssh:daemon(Port, [{exec, erlang_eval} | Options])

  %% Restore complete old behavior
  ssh:daemon(Port, [{shell, {shell, start, []}},
                    {exec, erlang_eval}
                    | Options])
OTP-19980
Application(s):
ftp, odbc
Related Id(s):

PR-10804

The odbc application is now deprecated and is planned to be removed in Erlang/OTP 30.

The ftp and ct_ftp modules are now deprecated and are planned to be removed in Erlang/OTP 30.

OTP-20004
POTENTIAL INCOMPATIBILITY
 

The array module have been extended with several new functions. The internal representation have been changed to allow the new functionality and optimizations. Arrays serialized with term_to_binary/1 in previous releases are not compatible.

OTP-20015
Application(s):
erts, kernel
Related Id(s):

PR-10564

Added support for socket functions recvmmsg() and sendmmsg().

OTP-20023
Application(s):
stdlib
Related Id(s):

PR-10814, PR-10818, PR-10821

m:erl_tar will use less memory when extracting large tar entries to disk. Instead of reading each tar entry into memory, erl_tar will now stream data in chunks of 64KB. The chunk size is settable using the new {chunks,ChunkSize} option.

The new {max_size,Size} option will set a limit on the total size of extracted data to protect against filling up the disk.

Checking of symlinks has been improved. Some symlinks that were safe (such as dir/link -> ../file) used to be rejected.

OTP-20028
Application(s):
kernel, stdlib
Related Id(s):

PR-10905, PR-9940

Added a new module called io_ansi that allows the user to emit Virtual Terminal Sequences (a.k.a. ANSI sequences) to the terminal in order to add colors/styling to text or create fully-fledged terminal applications.

io_ansi uses the local terminfo database in order to be as cross-platform compatible as possible.

It also works across nodes so that if functions on a remote node call io_ansi:fwrite/1 it will use the destination terminal’s terminfo database to determine which sequences to emit. In practice, this means that you can call functions in a remote shell session that use io_ansi and it will properly detect the terminal sequences the target terminal can handle and will print using them correctly.

OTP-20032
Application(s):
tools
Related Id(s):

PR-10592

The ignore_xref attribute has been handled as a post-analysis filter by build tools such as Rebar3. In this release, xref itself does the filtering, ensuring that all tooling that calls xref for any purpose can rely on these declarations to just work.

OTP-20034
Application(s):
common_test
Related Id(s):

PR-10824, PR-9315

New in this release is ct_doctest, a module that allows the user to test documentation examples in Erlang module docs and documentation files.

ct_doctest allows you to:

  • Test code examples using shell syntax and their returns
  • Test code examples that should fail
  • Write example modules that are compiled and available in shell examples
  • Plugin other documentation parsing engines so that examples in, for example, edoc, asciidoc, and others can also be tested.

See the documentation for more details.

OTP-20066
Application(s):
asn1, common_test, compiler, crypto, debugger, dialyzer, diameter, edoc, eunit, inets, kernel, megaco, mnesia, observer, odbc, os_mon, otp, parsetools, public_key, reltool, runtime_tools, sasl, ssh, ssl, stdlib, syntax_tools, tftp, tools, wx, xmerl
Related Id(s):

PR-10839

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

OTP-20070
POTENTIAL INCOMPATIBILITY
 

The post-quantum hybrid algorithm x25519mlkem768 is now the most preferred key exchange group in the default configuration.

Post-quantum hybrid algorithms secp384r1mlkem1024 and secp256r1mlkem768 are supported but have to be configured. The same goes for the plain post-quantum algorithms mlkem1024, mlkem768, and mlkem512.

The most preferred signature algorithms is now post-quantum algorithms ML-DSA followed by the fastest SLH-DSA (slh_dsa_sha2_256f) algorithm, if such a certificate is available in the configuration. Other SLH-DSA variants are also supported but are added to the end of the preferred list.

All these algorithms were available in OTP-28.4 but none of them were preferred and some of them changed default status.

OTP-20072
Application(s):
stdlib
Related Id(s):

PR-10938, PR-10948

The json module now encodes and decodes quoted strings faster. Improvements of up to 55 percent has been measured when decoding JSON data with long strings.

The string:length/1, string:slice/2, and string:slice/3 functions have been optimized. For some strings, they can be up to twice as fast.

OTP-20078
POTENTIAL INCOMPATIBILITY
 

The SFTP subsystem is no longer enabled by default when starting an SSH daemon. To enable it, add the subsystems option explicitly:

ssh:daemon(Port, [{subsystems, [ssh_sftpd:subsystem_spec([])]} | Options])
OTP-20085
Application(s):
crypto, erts, public_key, tools
Related Id(s):

PR-10993

The runtime system now supports generating encrypted crash dumps. See the description of --enable-encrypted-crash-dumps in [Building and Installing Erlang/OTP].

OTP-20087
Application(s):
ssl
Related Id(s):

PR-11019

There is a new Hardening guide giving guidelines on how to strengthen the security for the ssl application.

OTP-20133
Application(s):
inets
Related Id(s):

PR-11073

There is a new Hardening guide with advice for configuring Inets to be more secure.

Potential Incompatibilities #

OTP-19695
Application(s):
kernel
Related Id(s):

GH-9822, PR-10013

Fixed (inet) module selection when calling (gen_tcp) listen and connect and (gen_udp) open. Depending on the order of the options, the module option (tcp_module or udp_module) was sometimes ignored.

OTP-19801
Application(s):
ssh
Related Id(s):

PR-10253

ssh:stop_deamon now uses supervisor:stop for shutting down daemons. With this change, the scenario when ssh:stop_daemon is called for a non-existing process results in calling process exiting. Previously an error tuple was returned (which was not documented).

OTP-19807
Application(s):
mnesia
Related Id(s):

PR-7315

The mnesia_registry module has been removed.

OTP-19842
HIGHLIGHT
 

In the default code path for the Erlang system, the current working directory (.) is now in the last position instead of the first.

OTP-19927
HIGHLIGHT
 

Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:

1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
ok
2> fh(lists:seq(1, 10)).
* exception error: bad filter 2614250

In Erlang/OTP 29, attempting to bind a variable in a comprehension will fail by default:

1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
* 5:14: matches using '=' are not allowed in comprehension qualifiers
unless the experimental 'compr_assign' language feature is enabled.
With 'compr_assign' enabled, a match 'P = E' will behave as a
strict generator 'P <-:- [E]'."

However, this example will work as expected if the compr_assign feature is enabled when starting the runtime system:

$ erl -enable-feature compr_assign
. . .
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
ok
2> fh(lists:seq(1, 10)).
[2614250]

Here is another example how compr_assign can be used:

-module(example).
-feature(compr_assign, enable).
-export([cat/1]).

cat(Files) ->
    [Char || F <- Files,
             {ok, Bin} = file:read_file(F),
             Char <- unicode:characters_to_list(Bin)].
OTP-19965
HIGHLIGHT
 

The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides protection against both classical and quantum computer attacks while maintaining backward compatibility through automatic fallback to other algorithms when peers don’t support it.

OTP-19969
HIGHLIGHT
 

The SSH daemon now defaults to disabled for shell and exec services, implementing the “secure by default” principle. This prevents authenticated users from executing arbitrary Erlang code unless explicitly configured.

Applications requiring shell or exec functionality must now explicitly enable:

  %% Enable Erlang shell
  ssh:daemon(Port, [{shell, {shell, start, []}} | Options])

  %% Enable Erlang term evaluation via exec
  ssh:daemon(Port, [{exec, erlang_eval} | Options])

  %% Restore complete old behavior
  ssh:daemon(Port, [{shell, {shell, start, []}},
                    {exec, erlang_eval}
                    | Options])
OTP-19975
Application(s):
erts
Related Id(s):

PR-10674

Changed ets:update_counter/4 and ets:update_element/4 to always reject default tuples smaller than the keypos of the table. Such keyless tuples are now rejected even if the key exists in the table and the default tuple would not be used. This is a subtle semantic change but is a nicer behavior for development and testing as it will detect faulty default tuple arguments earlier.

OTP-19995
Application(s):
ssh
Related Id(s):

PR-10739

Added explicit size validation guards for pre-authentication SSH messages to improve defense-in-depth against DoS attacks. Messages now have per-field size limits based on RFC specifications:

  • Transport layer messages (DISCONNECT, IGNORE, DEBUG)
  • Key exchange messages (DH, ECDH, DH-GEX)
  • Service request messages (SERVICE_REQUEST, SERVICE_ACCEPT, EXT_INFO)

This change enhances the existing 256KB global packet size limit with granular per-message validation. Compliant implementations are not affected.

OTP-20004
HIGHLIGHT
 

The array module have been extended with several new functions. The internal representation have been changed to allow the new functionality and optimizations. Arrays serialized with term_to_binary/1 in previous releases are not compatible.

OTP-20019
Application(s):
ssh
Related Id(s):

PR-10820

The SFTP subsystem root option now properly rejects relative paths at daemon startup. Previously, relative paths would cause unpredictable behavior as file operations resolved relative to the Erlang VM’s current working directory. The option now requires an absolute path or empty string.

OTP-20061
Application(s):
stdlib
Related Id(s):

PR-10910

The gb_sets:from_ordset/1 and gb_trees:from_orddict/1 functions would trust their inputs. If the input contained duplicates or was not properly sorted, the resulting gb_set or gb_tree would be invalid, and any number of interesting problems could occur.

In this release, these functions will raise an exception if their input is not valid. That could mean that incorrect programs that seemed to work could now stop working altogether.

There is also a new gb_trees:from_list/1 function for directly creating a gb_tree from a list.

OTP-20070
HIGHLIGHT
 

The post-quantum hybrid algorithm x25519mlkem768 is now the most preferred key exchange group in the default configuration.

Post-quantum hybrid algorithms secp384r1mlkem1024 and secp256r1mlkem768 are supported but have to be configured. The same goes for the plain post-quantum algorithms mlkem1024, mlkem768, and mlkem512.

The most preferred signature algorithms is now post-quantum algorithms ML-DSA followed by the fastest SLH-DSA (slh_dsa_sha2_256f) algorithm, if such a certificate is available in the configuration. Other SLH-DSA variants are also supported but are added to the end of the preferred list.

All these algorithms were available in OTP-28.4 but none of them were preferred and some of them changed default status.

OTP-20076
Application(s):
erts
Related Id(s):

PR-10958, PR-10969

The old Tcl-based implementation of erl_errno_id() has been replaced by our own implementation now supporting more errno values on modern operating systems. It also returns the string "errno_<ERRNO_INTEGER>" corresponding to the integer given as argument if the errno integer is unknown instead of as previously just return the string "unknown".

The result of erl_errno_id() is often converted into an atom and passed as an error from a driver or a NIF.

OTP-20078
HIGHLIGHT
 

The SFTP subsystem is no longer enabled by default when starting an SSH daemon. To enable it, add the subsystems option explicitly:

ssh:daemon(Port, [{subsystems, [ssh_sftpd:subsystem_spec([])]} | Options])
OTP-20080
Application(s):
ssl
Related Id(s):

PR-10979

Secure renegotiation for TLS-1.2 specified in RFC 5746 from 2010 is now always used. The interoperability fallback option {secure_renegotiate,SecureRenegotiate} is no longer needed.

OTP-20095
Application(s):
erts
Related Id(s):

PR-10619, PR-11004

The erlang:suspend_process/1 and erlang:suspend_process/2 BIFs now also suspend BIF timers that will send messages to the process if the timer was created using the PID of the process as destination. Timers created using registered names are not affected.

OTP-20102
Application(s):
erts, kernel
Related Id(s):

GH-10968, PR-11059

The TOS handling on socket has been significantlyupdated and improved. Socket did not properly handle set, get and recv (cmsg) of TOS.

Note that the returned TOS value has been changed. It was previously an atom or an integer. Now it is a map with different interpretations of the TOS octet. See the documentation.

OTP-29.0 #

OTP-20111
Related Id(s):

GH-10342, PR-10346

The start_erl script will now work on embedded systems.

OTP-19763
Related Id(s):

PR-10145, PR-10166, PR-10168, PR-10189, PR-10193, PR-10195, PR-10197, PR-10202, OTP-19652, OTP-19775, OTP-19779

Vendor dependencies and OpenVEX statements in the otp repository is now scanned for vulnerabilities. It is verified that OTP security issues reported at Github exist in the published OpenVEX statements, and issues are automatically opened in the otp repository if vendor vulnerabilities are detected.

OTP-19766
Related Id(s):

GH-10151, PR-10187

Documentation about how to validate the SBOM using sigstore has been added.

OTP-19887
HIGHLIGHT
 

The old-style type tests in guards (integer, atom, and so on) have been scheduled for removal in Erlang/OTP 30. They have been deprecated for a long time.

OTP-19933
Related Id(s):

PR-10573

Removed the undocumented dyn_erl utility.

OTP-19960

There is no longer a 32-bit Erlang/OTP build for Windows.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

OTP-20092
Related Id(s):

PR-10998

The Upcoming Potential Incompatibilities page has been updated to note that in Erlang/OTP 30, erlang:fun_info(Fun, pid) will no longer retrieve a pid, but will raise a badarg exception.

OTP-20103
Related Id(s):

PR-11000

Add security improvements to GitHub Actions workflows based on findings from zizmor, a GitHub Actions security linter.

OTP-20132
Related Id(s):

PR-11047

Improve mermaid diagram rending in documentation.

asn1-5.5 #

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of asn1-5.5

erts-14.0, kernel-9.0, stdlib-5.0

common_test-1.31 #

OTP-20010
Related Id(s):

PR-10783

Improved support for QuickCheck when writing property tests.

OTP-19744
Related Id(s):

PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730

The legacy and and or operators have been replaced with other language constructs.

OTP-19910
Related Id(s):

PR-10277

'EXIT' messages are now formatted in the same way as badmatch errors.

OTP-19925
Related Id(s):

GH-10260, PR-10269

Error notifications now contain the name of the source file in which the error occurred.

OTP-20034
HIGHLIGHT
 

New in this release is ct_doctest, a module that allows the user to test documentation examples in Erlang module docs and documentation files.

ct_doctest allows you to:

  • Test code examples using shell syntax and their returns
  • Test code examples that should fail
  • Write example modules that are compiled and available in shell examples
  • Plugin other documentation parsing engines so that examples in, for example, edoc, asciidoc, and others can also be tested.

See the documentation for more details.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of common_test-1.31

compiler-10.0, crypto-4.5, debugger-4.1, erts-7.0, ftp-1.0, inets-6.0, kernel-11.0, observer-2.1, runtime_tools-1.8.16, sasl-2.5, snmp-5.1.2, ssh-4.0, stdlib-8.0, syntax_tools-1.7, tools-3.2, xmerl-1.3.8

compiler-10.0 #

OTP-19751
Related Id(s):

GH-10125, PR-10144

For a function such as the following:

bar(S0) ->
    S1 = setelement(8, S0, a),
    S2 = setelement(7, S1, b),
    setelement(5, S2, c).

the compiler would keep all of the calls to setelement/3 and emit extra unnecessary set_tuple_element instructions.

This has been corrected so that the compiler will never emit code that uses the set_tuple_element instruction. In a future release, support for the set_tuple_element will be removed from the runtime system.

OTP-19991
Related Id(s):

GH-10557, PR-10735

beam_lib:strip/1 will now retain the Beam debug information chunk produced by the beam_debug_info option. The chunk will also be retained when combing the beam_debug_info option with the undocumented slim option.

The runtime system will no longer crash when attempting to load modules that have been compiled with beam_debug_info but lack the actual Beam debug info chunk.

OTP-19672
Related Id(s):

PR-9934

In comprehensions, a generator that builds a list with a single element will now be optimized to avoid building and matching the list. Example:

[H || E <- List, H <- [erlang:phash2(E)], H rem 10 =:= 0]
OTP-19784
HIGHLIGHT
 

In the documentation for the compile module, a section has been added with recommendations for implementors of languages running on the BEAM. Documentation has also been added for the to_abstr, to_exp, and from_abstr options.

The documentation for erlc now lists .abstr as one of the supported options.

When compiling with the to_abstr option, the resulting .abstr file now retains any -doc attributes present in the source code.

OTP-19785
HIGHLIGHT
 

Native records as described in EEP-79 has been implemented.

A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.

Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.

OTP-19809
HIGHLIGHT
 

The guard BIF is_integer/3 has been added. It follows the design of the original EEP-16, only changing the name from is_between to is_integer. This BIF takes in 3 parameters, Term, LowerBound, and UpperBound.

It returns true if Term, LowerBound, and UpperBound are all integers, and LowerBound =< Term =< UpperBound; otherwise, it returns false.

Example:

1> I = 42.
2> is_integer(I, 0, 100).
true
OTP-19866
HIGHLIGHT
 

Function application is now left associative. That means one can now write:

f(X)(Y)

instead of:

(f(X))(Y)
OTP-19898
HIGHLIGHT
 

There will now be a warning when exporting variables out of a subexpression. For example:

case file:open(File, AllOpts = [write,{encoding,utf8}]) of
    {ok,Fd} ->
        {Fd,AllOpts}
end

To avoid the warning, this can be rewritten to:

AllOpts = [write,{encoding,utf8}],
case file:open(File, AllOpts) of
    {ok,Fd} ->
        {Fd,AllOpts}
end

The warning can be suppressed by giving option nowarn_export_var_subexpr to the compiler.

OTP-19918
HIGHLIGHT
 

There is a new option warn_obsolete_bool_op that instruct the compiler to emit warnings for the and and or operators. It is recommended to instead use the modern andalso and orelse operators, or , and ; in guards.

OTP-19927
HIGHLIGHT, POTENTIAL INCOMPATIBILITY
 

Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:

1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
ok
2> fh(lists:seq(1, 10)).
* exception error: bad filter 2614250

In Erlang/OTP 29, attempting to bind a variable in a comprehension will fail by default:

1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
* 5:14: matches using '=' are not allowed in comprehension qualifiers
unless the experimental 'compr_assign' language feature is enabled.
With 'compr_assign' enabled, a match 'P = E' will behave as a
strict generator 'P <-:- [E]'."

However, this example will work as expected if the compr_assign feature is enabled when starting the runtime system:

$ erl -enable-feature compr_assign
. . .
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
ok
2> fh(lists:seq(1, 10)).
[2614250]

Here is another example how compr_assign can be used:

-module(example).
-feature(compr_assign, enable).
-export([cat/1]).

cat(Files) ->
    [Char || F <- Files,
             {ok, Bin} = file:read_file(F),
             Char <- unicode:characters_to_list(Bin)].
OTP-19938
HIGHLIGHT
 

There will now be a warning when using the catch operator, which has been deprecated for a long time.

It is recommended to instead use trycatchend but is also possible to disable the warning by using the nowarn_deprecated_catch option.

OTP-19942
HIGHLIGHT
 

Multi-valued comprehensions according to EEP 78 has been implemented.

Example:

> [I, -I || I <- lists:seq(1, 5)].
[1,-1,2,-2,3,-3,4,-4,5,-5]
OTP-19943
HIGHLIGHT
 

There will now be a warning for matches that unify constructors, such as the following:

m({a,B} = {Y,Z}) -> . . .

Such a match can be rewritten to:

m({a=Y,B=Y}) -> . . .

The compiler option nowarn_match_alias_pats can be used to disable the warning.

OTP-19968
HIGHLIGHT
 

The compiler now generates more efficient code for map comprehensions with constant values that don’t depend on the generator, such as the following:

#{K => 42} || K <- List}.
#{K => X || K <- List}.
#{K => {X, Y} || K <- List}.
OTP-20020
Related Id(s):

GH-10807, PR-10819

Compilation times of modules with a huge number of calls to element/2 has been improved.

OTP-20048
Related Id(s):

PR-9814

The format of the debug information stored by the beam_debug_info option (used by the edb debugger) has been updated to more easily extendible and to contain more information about call targets. (See the linked PR for more details.)

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of compiler-10.0

crypto-5.1, erts-13.0, kernel-8.4, stdlib-8.0

crypto-5.9 #

OTP-20025
Related Id(s):

PR-10817

Fixed crypto:hash_equals/2 and FIPS when crypto is statically linked to the beam (with --enable-static-nifs and --disable-dynamic-ssl-lib).

OTP-19882
Related Id(s):

PR-10453, OTP-19827

The rand:bytes/1 and rand:bytes_s/2 functions have been optimized by implementing a new internal callback function that crypto:rand_seed_alg/1 and crypto:alg_seed_alg_s/1 have been updated to use.

A new algorithm crypto_prng1, which also takes advantage of this new internal callback, has been added to crypto:rand_seed_alg/2 and crypto:rand_seed_alg_s/2. It is much faster then the existing crypto_aes, in particular for generating bytes.

OTP-20035
Related Id(s):

PR-10830

In interactive mode, application crypto is automatically loaded when the crypto module is loaded. This will ensure that the correct value of configuration parameter fips_mode is used to initialize OpenSSL if module crypto is called/loaded before the application crypto has been loaded. In embedded mode, module crypto will fail to load if the application has not been loaded.

OTP-20036
Related Id(s):

PR-10836

OpenSSL engine support has been removed on Windows.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

OTP-20085
HIGHLIGHT
 

The runtime system now supports generating encrypted crash dumps. See the description of --enable-encrypted-crash-dumps in [Building and Installing Erlang/OTP].

Full runtime dependencies of crypto-5.9

erts-9.0, kernel-6.0, stdlib-3.9

debugger-7.0 #

OTP-19785
HIGHLIGHT
 

Native records as described in EEP-79 has been implemented.

A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.

Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.

OTP-19906
Related Id(s):

PR-10519

Tools such as the debugger, beam_lib, and xref no longer support BEAM files created before OTP 13B.

OTP-19942
HIGHLIGHT
 

Multi-valued comprehensions according to EEP 78 has been implemented.

Example:

> [I, -I || I <- lists:seq(1, 5)].
[1,-1,2,-2,3,-3,4,-4,5,-5]
OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of debugger-7.0

compiler-8.0, erts-15.0, kernel-10.0, stdlib-7.0, wx-2.0

dialyzer-6.0 #

OTP-19785
HIGHLIGHT
 

Native records as described in EEP-79 has been implemented.

A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.

Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.

OTP-19809
HIGHLIGHT
 

The guard BIF is_integer/3 has been added. It follows the design of the original EEP-16, only changing the name from is_between to is_integer. This BIF takes in 3 parameters, Term, LowerBound, and UpperBound.

It returns true if Term, LowerBound, and UpperBound are all integers, and LowerBound =< Term =< UpperBound; otherwise, it returns false.

Example:

1> I = 42.
2> is_integer(I, 0, 100).
true
OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of dialyzer-6.0

compiler-10.0, erts-12.0, kernel-8.0, stdlib-5.0, syntax_tools-2.0

diameter-2.7 #

OTP-19744
Related Id(s):

PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730

The legacy and and or operators have been replaced with other language constructs.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of diameter-2.7

erts-10.0, kernel-3.2, ssl-9.0, stdlib-5.0

edoc-1.5 #

OTP-20030
Related Id(s):

PR-10770

Changed behavior of EDoc so that when a module defines a private type and a private function spec uses it, that type no longer gets included in the EDoc chunk.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of edoc-1.5

erts-11.0, inets-5.10, kernel-7.0, stdlib-4.0, syntax_tools-2.0, xmerl-1.3.7

eldap-1.3 #

OTP-19964

Only minor internal changes.

Full runtime dependencies of eldap-1.3

asn1-3.0, erts-6.0, kernel-3.0, ssl-5.3.4, stdlib-3.4

erl_interface-5.8 #

OTP-19734
Related Id(s):

GH-10071, PR-10078

Improved name consistency of EPMD protocol messages in documentation and code. Renamed PORT_PLEASE2_REQ to PORT2_REQ and added prefix EPMD_.

OTP-20045
Related Id(s):

PR-10870

Replaced embedded OpenSSL MD5 implementation.

OTP-16607
Related Id(s):

OTP-16608

The ei API for decoding/encoding terms is not fully 64-bit compatible since terms that have a representation on the external term format larger than 2 GB cannot be handled.

erts-17.0 #

OTP-19751
Related Id(s):

GH-10125, PR-10144

For a function such as the following:

bar(S0) ->
    S1 = setelement(8, S0, a),
    S2 = setelement(7, S1, b),
    setelement(5, S2, c).

the compiler would keep all of the calls to setelement/3 and emit extra unnecessary set_tuple_element instructions.

This has been corrected so that the compiler will never emit code that uses the set_tuple_element instruction. In a future release, support for the set_tuple_element will be removed from the runtime system.

OTP-19874
Related Id(s):

GH-10341, PR-10348

Improved the handling of the logging directory for the start script on Unix-like systems, so that it no longer crashes when $ROOTDIR/log is not writable.

OTP-19935
Related Id(s):

PR-10549

The -nocookie option for erl is now documented.

OTP-19991
Related Id(s):

GH-10557, PR-10735

beam_lib:strip/1 will now retain the Beam debug information chunk produced by the beam_debug_info option. The chunk will also be retained when combing the beam_debug_info option with the undocumented slim option.

The runtime system will no longer crash when attempting to load modules that have been compiled with beam_debug_info but lack the actual Beam debug info chunk.

OTP-20026
Related Id(s):

PR-10805

Fixed potential symbol clashing on MacOS by passing RTLD_LOCAL to dlopen. This will make symbols to not be resolvable between subsequently loaded NIF/drivers, which is the default behavior on Linux and BSD.

OTP-20088
Related Id(s):

PR-10965

The configure script used to call isfinite() with argument 0. That could fail on some platforms. This has been changed to call isfinite() with 1.0 instead.

OTP-20102
POTENTIAL INCOMPATIBILITY
 

The TOS handling on socket has been significantlyupdated and improved. Socket did not properly handle set, get and recv (cmsg) of TOS.

Note that the returned TOS value has been changed. It was previously an atom or an integer. Now it is a map with different interpretations of the TOS octet. See the documentation.

OTP-20123

Fixed erlang:md5_init to always return the same deterministic context binary. Only an issue in OTP 28.5 when OTP was built with --disable-builtin-openssl or --enable-use-embedded-3pp-alternatives.

OTP-20126
Related Id(s):

PR-11067

Added explicit configure test for C++ function std::to_chars if options --disable-builtin-ryu or --enable-use-embedded-3pp-alternatives is used.

OTP-19643
Related Id(s):

PR-9864

The exported name space of the beam executable has been cleaned to only expose symbols of documented interfaces like NIF and driver APIs. This will avoid accidental name clashes with, for example, our statically linked variants of PCRE2 and ZSTD. NIFs and drivers that abuse undocumented internal interfaces will fail to load due to this change.

OTP-19734
Related Id(s):

GH-10071, PR-10078

Improved name consistency of EPMD protocol messages in documentation and code. Renamed PORT_PLEASE2_REQ to PORT2_REQ and added prefix EPMD_.

OTP-19747
HIGHLIGHT
 

The JIT now generates better code for matching or creating binaries with multiple little-endian segments.

OTP-19784
HIGHLIGHT
 

In the documentation for the compile module, a section has been added with recommendations for implementors of languages running on the BEAM. Documentation has also been added for the to_abstr, to_exp, and from_abstr options.

The documentation for erlc now lists .abstr as one of the supported options.

When compiling with the to_abstr option, the resulting .abstr file now retains any -doc attributes present in the source code.

OTP-19785
HIGHLIGHT
 

Native records as described in EEP-79 has been implemented.

A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.

Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.

OTP-19793
Related Id(s):

PR-9984

Task stealing between schedulers has been further optimized.

OTP-19809
HIGHLIGHT
 

The guard BIF is_integer/3 has been added. It follows the design of the original EEP-16, only changing the name from is_between to is_integer. This BIF takes in 3 parameters, Term, LowerBound, and UpperBound.

It returns true if Term, LowerBound, and UpperBound are all integers, and LowerBound =< Term =< UpperBound; otherwise, it returns false.

Example:

1> I = 42.
2> is_integer(I, 0, 100).
true
OTP-19811
Related Id(s):

PR-10207

Calls to trace:info(_, {M,F,A}, Item), with Item as call_time, call_memory, or all, will no longer block all scheduler threads from running.

OTP-19834

Full support for SCTP in socket. Not (yet) supported for FreeBSD.

OTP-19842
POTENTIAL INCOMPATIBILITY
 

In the default code path for the Erlang system, the current working directory (.) is now in the last position instead of the first.

OTP-19906
Related Id(s):

PR-10519

Tools such as the debugger, beam_lib, and xref no longer support BEAM files created before OTP 13B.

OTP-19919
Related Id(s):

PR-7118

Optimized ETS named table lookup scalability by replacing read locks with lockless atomic operations.

OTP-19933
Related Id(s):

PR-10573

Removed the undocumented dyn_erl utility.

OTP-19936
Related Id(s):

GH-10345, PR-10511

Added zstd:flush/2 for flushing compressed data without closing the compression context.

OTP-19963
HIGHLIGHT
 

While the iteration order for maps is undefined, it is now guaranteed that all ways of iterating over maps provides the elements in the same order. That is, all of the following ways of iterating will produce the elements in the same order:

  • maps:keys/1
  • maps:values/1
  • maps:to_list/1
  • maps:to_list(maps:iterator(M))
  • Map comprehension: [{K,V} || K := V <- M]
OTP-19966
Related Id(s):

PR-10615

Improved the performance of code loading.

OTP-19975
POTENTIAL INCOMPATIBILITY
 

Changed ets:update_counter/4 and ets:update_element/4 to always reject default tuples smaller than the keypos of the table. Such keyless tuples are now rejected even if the key exists in the table and the default tuple would not be used. This is a subtle semantic change but is a nicer behavior for development and testing as it will detect faulty default tuple arguments earlier.

OTP-20002
Related Id(s):

PR-10647

Improved compatibility with systems that lack certain shell utilities.

OTP-20003

It was previously not possible to check on the socket nif load result. A successful load was self-evident, but a failure was only visible from the fact that most socket functions failed with notsup. This has now been improved such that the (socket nif) load result is visible in the info map (from socket:info/0).

OTP-20013
Related Id(s):

PR-10894, PR-10986, OTP-20106

The default for the configure option --{enable,disable}-use-embedded-3pp-alternatives has changed and the subset of embedded third-party products (3pps) affected by it has also changed. Currently this option affects zstd, zlib, ryu (with STL). By default zstd and zlib available on the OS will be used if they fulfill the requirements. The builtin ryu (with STL) will be used by default. The 3pps openssl and tcl that previously were present have been replaced by our own implementations.

Requirements for the affected 3pps alternatives are still the same as before:

  • zstd - Static library and include files of at least version 1.5.6 needs to be available.
  • zlib - Library and include files of at least version 1.2.5 needs to be available.
  • ryu (with STL) - A usable C++ compiler with C++17 library support.
OTP-20015
HIGHLIGHT
 

Added support for socket functions recvmmsg() and sendmmsg().

OTP-20016
Related Id(s):

PR-10782

There is a new NIF function enif_term_size().

OTP-20017
Related Id(s):

PR-10754

Call trace match specs can use [Arg1, Arg2 | '_'] syntax to match functions with at least N number of arguments.

OTP-20045
Related Id(s):

PR-10870

Replaced embedded OpenSSL MD5 implementation.

OTP-20048
Related Id(s):

PR-9814

The format of the debug information stored by the beam_debug_info option (used by the edb debugger) has been updated to more easily extendible and to contain more information about call targets. (See the linked PR for more details.)

OTP-20069
Related Id(s):

PR-10801

There are new functions erlang:exit_signal/2,3 replacing the old erlang:exit/2,3. The primary purpose is better naming to distinguish between exit exceptions and exit signals. The new exit_signal functions will also avoid a historical quirk when a process sends an exit signal to itself with reason normal.

The old erlang:exit/2,3 will work as before, but it is recommended to use the new exit:signal/2,3 functions for new or modified code. Deprecation of erlang:exit/2,3 with a compiler warning is planned for OTP 30.

OTP-20076
POTENTIAL INCOMPATIBILITY
 

The old Tcl-based implementation of erl_errno_id() has been replaced by our own implementation now supporting more errno values on modern operating systems. It also returns the string "errno_<ERRNO_INTEGER>" corresponding to the integer given as argument if the errno integer is unknown instead of as previously just return the string "unknown".

The result of erl_errno_id() is often converted into an atom and passed as an error from a driver or a NIF.

OTP-20085
HIGHLIGHT
 

The runtime system now supports generating encrypted crash dumps. See the description of --enable-encrypted-crash-dumps in [Building and Installing Erlang/OTP].

OTP-20090
Related Id(s):

PR-10478

When implementing an alternate distribution implementors can now use an alternate handshake complete fun of arity 4 if needed.

OTP-20095
POTENTIAL INCOMPATIBILITY
 

The erlang:suspend_process/1 and erlang:suspend_process/2 BIFs now also suspend BIF timers that will send messages to the process if the timer was created using the PID of the process as destination. Timers created using registered names are not affected.

OTP-20115
Related Id(s):

PR-10929

Added support for socket option SO_TIMESTAMPNS (not available on all platforms).

Full runtime dependencies of erts-17.0

kernel-9.0, sasl-3.3, stdlib-4.1

et-1.8 #

OTP-19964

Only minor internal changes.

Full runtime dependencies of et-1.8

erts-9.0, kernel-5.3, runtime_tools-1.10, stdlib-3.4, wx-1.2

eunit-2.11 #

OTP-19997
Related Id(s):

PR-10614

Added randomDelay macro.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of eunit-2.11

erts-9.0, kernel-11.0, stdlib-6.0

ftp-1.2.5 #

OTP-19980
HIGHLIGHT
 

The odbc application is now deprecated and is planned to be removed in Erlang/OTP 30.

The ftp and ct_ftp modules are now deprecated and are planned to be removed in Erlang/OTP 30.

Full runtime dependencies of ftp-1.2.5

erts-7.0, kernel-6.0, runtime_tools-1.15.1, ssl-10.2, stdlib-3.5

inets-9.7 #

OTP-20128
Related Id(s):

ERIERL-1314, PR-11079

A call to httpd:reload_config/2 now validates the new configuration before removing the old one, leaving the server running in case of faulty config, instead of putting it in an unrecoverable state.

OTP-19587
Related Id(s):

GH-8841, PR-9712

A new option max_connections_open has been added to the httpc HTTP client profile configuration. It limits the maximum number of concurrent HTTP handler processes that can be open simultaneously.

When the limit is reached, new requests are queued internally and started automatically as existing handlers complete. This prevents bandwidth exhaustion in high-load scenarios where too many parallel connections cause remote servers to close sockets before transfers finish (the socket_closed_remotely error).

The option can be set via httpc:set_options([{max_connections_open, 10}], Profile).

The default value is infinity (unlimited), preserving backward compatibility. The value must be a positive integer or infinity and must be greater than or equal to max_sessions.

OTP-19744
Related Id(s):

PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730

The legacy and and or operators have been replaced with other language constructs.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

OTP-20071
Related Id(s):

PR-10950

The mod_cgi and mod_actions modules are now deprecated and are scheduled to be removed in OTP 30.

OTP-20133
HIGHLIGHT
 

There is a new Hardening guide with advice for configuring Inets to be more secure.

Full runtime dependencies of inets-9.7

erts-14.0, kernel-9.0, mnesia-4.12, public_key-1.13, runtime_tools-1.8.14, ssl-9.0, stdlib-5.0, stdlib-6.0

jinterface-1.16 #

OTP-19956
Related Id(s):

PR-10556

The jinterface build now honors SOURCE_DATE_EPOCH for deterministic build of OtpErlang.jar.

OTP-20073
Related Id(s):

PR-10951

Removed prebuilt java files from source tar file to avoid issues with different version of the java runtime.

kernel-11.0 #

OTP-19695
POTENTIAL INCOMPATIBILITY
 

Fixed (inet) module selection when calling (gen_tcp) listen and connect and (gen_udp) open. Depending on the order of the options, the module option (tcp_module or udp_module) was sometimes ignored.

OTP-19917
Related Id(s):

PR-10514

The TCP/UDP compatibility layer has been fixed so that inet_backend = socket now supports socket options reuseport and reuseport_lb for gen_tcp and gen_udp.

OTP-20054
Related Id(s):

GH-10214, PR-10259

Some errors in config files for the application controller would result in very cryptic crashes. Error handling has been improved to ensure that the file name and line number of the offending token are now printed.

OTP-20102
POTENTIAL INCOMPATIBILITY
 

The TOS handling on socket has been significantlyupdated and improved. Socket did not properly handle set, get and recv (cmsg) of TOS.

Note that the returned TOS value has been changed. It was previously an atom or an integer. Now it is a map with different interpretations of the TOS octet. See the documentation.

OTP-20124
Related Id(s):

PR-10808

Replaced a sleep clause in user_drv shutdown with a flush of the output buffer.

OTP-19708
Related Id(s):

PR-9894

Added an option to set the erl_boot_server listen port.

OTP-19713
Related Id(s):

PR-9866

The memory footprint of some supervisors has been reduced by purging obsoleted data when the supervisor is transitioning to and from hibernation.

OTP-19734
Related Id(s):

GH-10071, PR-10078

Improved name consistency of EPMD protocol messages in documentation and code. Renamed PORT_PLEASE2_REQ to PORT2_REQ and added prefix EPMD_.

OTP-19744
Related Id(s):

PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730

The legacy and and or operators have been replaced with other language constructs.

OTP-19786
Related Id(s):

PR-10134

Refactored a kernel_load_completed clause in the init module for conciseness.

OTP-19834

Full support for SCTP in socket. Not (yet) supported for FreeBSD.

OTP-19842
POTENTIAL INCOMPATIBILITY
 

In the default code path for the Erlang system, the current working directory (.) is now in the last position instead of the first.

OTP-20003

It was previously not possible to check on the socket nif load result. A successful load was self-evident, but a failure was only visible from the fact that most socket functions failed with notsup. This has now been improved such that the (socket nif) load result is visible in the info map (from socket:info/0).

OTP-20015
HIGHLIGHT
 

Added support for socket functions recvmmsg() and sendmmsg().

OTP-20028
HIGHLIGHT
 

Added a new module called io_ansi that allows the user to emit Virtual Terminal Sequences (a.k.a. ANSI sequences) to the terminal in order to add colors/styling to text or create fully-fledged terminal applications.

io_ansi uses the local terminfo database in order to be as cross-platform compatible as possible.

It also works across nodes so that if functions on a remote node call io_ansi:fwrite/1 it will use the destination terminal’s terminfo database to determine which sequences to emit. In practice, this means that you can call functions in a remote shell session that use io_ansi and it will properly detect the terminal sequences the target terminal can handle and will print using them correctly.

OTP-20029
Related Id(s):

PR-10755

Polished the documentation groups, essentially removed groups that did nothing but obscure the documentation.

OTP-20055
Related Id(s):

PR-10426

Added a new behavior, data_publisher, for building eventually consistent, replicated data stores across distributed nodes. This is a generalization of the pg module.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

OTP-20090
Related Id(s):

PR-10478

When implementing an alternate distribution implementors can now use an alternate handshake complete fun of arity 4 if needed.

OTP-20115
Related Id(s):

PR-10929

Added support for socket option SO_TIMESTAMPNS (not available on all platforms).

OTP-20117
Related Id(s):

PR-11031

Added a flag log_missed_net_ticks = true | false that controls whether a warning is logged for each missed sub-tick on a distribution connection. A sub-tick is missed when no data has been received from a connected node during one tick interval. A warning is emitted on every subsequent missed sub-tick until the node is declared down after net_tickintensity consecutive missed sub-ticks, at which point a final timeout warning is always logged regardless of this setting. Defaults to false.

Full runtime dependencies of kernel-11.0

crypto-5.8, erts-17.0, sasl-3.0, stdlib-8.0

megaco-4.9 #

OTP-20114
Related Id(s):

PR-11025

Running Dialyzer on Windows in an Erlang repo, causes Dialyzer warnings for the megaco_flex_scanner module. This is because the flex scanner is not built on Windows. These warnings are now suppressed.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of megaco-4.9

asn1-3.0, debugger-4.0, erts-12.0, et-1.5, kernel-8.0, runtime_tools-1.8.14, stdlib-2.5

mnesia-4.26 #

OTP-19611
Related Id(s):

GH-8993, PR-9475

mnesia now has new functions select_reverse/1-6 supporting iteration over tables in reverse order.

OTP-19807
POTENTIAL INCOMPATIBILITY
 

The mnesia_registry module has been removed.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of mnesia-4.26

erts-9.0, kernel-5.3, stdlib-5.0

observer-2.19 #

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of observer-2.19

erts-15.0, et-1.5, kernel-10.0, runtime_tools-2.1, stdlib-5.0, wx-2.3

odbc-2.17 #

OTP-19980
HIGHLIGHT
 

The odbc application is now deprecated and is planned to be removed in Erlang/OTP 30.

The ftp and ct_ftp modules are now deprecated and are planned to be removed in Erlang/OTP 30.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of odbc-2.17

erts-6.0, kernel-3.0, stdlib-2.0

os_mon-2.12 #

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of os_mon-2.12

erts-14.0, kernel-9.0, sasl-4.2.1, stdlib-5.0

parsetools-2.8 #

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of parsetools-2.8

erts-6.0, kernel-3.0, stdlib-3.4

public_key-1.21 #

OTP-19744
Related Id(s):

PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730

The legacy and and or operators have been replaced with other language constructs.

OTP-19822
Related Id(s):

PR-10033

Added an option for relaxed encoding of certificates to allow some values to be empty. This may be used by other applications for interoperability reasons. This option is not used by the ssl application.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

OTP-20085
HIGHLIGHT
 

The runtime system now supports generating encrypted crash dumps. See the description of --enable-encrypted-crash-dumps in [Building and Installing Erlang/OTP].

Full runtime dependencies of public_key-1.21

asn1-5.0, crypto-5.8, erts-13.0, kernel-8.0, stdlib-4.0

reltool-1.1 #

OTP-19933
Related Id(s):

PR-10573

Removed the undocumented dyn_erl utility.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of reltool-1.1

erts-15.0, kernel-9.0, sasl-4.2.1, stdlib-5.0, tools-2.6.14, wx-2.3

runtime_tools-2.4 #

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of runtime_tools-2.4

erts-16.0, kernel-10.0, mnesia-4.12, stdlib-6.0

sasl-4.4 #

OTP-19949
Related Id(s):

PR-10601

UNC paths are now handled on Windows.

OTP-19933
Related Id(s):

PR-10573

Removed the undocumented dyn_erl utility.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of sasl-4.4

erts-15.0, kernel-6.0, stdlib-4.0, tools-2.6.14

snmp-5.20.3 #

OTP-19744
Related Id(s):

PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730

The legacy and and or operators have been replaced with other language constructs.

Full runtime dependencies of snmp-5.20.3

asn1-5.4, crypto-4.6, erts-12.0, kernel-8.0, mnesia-4.12, runtime_tools-1.8.14, stdlib-5.0

ssh-6.0 #

OTP-19982
Related Id(s):

PR-10571

Password-based authentication has been updated to follow current security best practices. Key-based authentication remains recommended for production systems.

OTP-19995
POTENTIAL INCOMPATIBILITY
 

Added explicit size validation guards for pre-authentication SSH messages to improve defense-in-depth against DoS attacks. Messages now have per-field size limits based on RFC specifications:

  • Transport layer messages (DISCONNECT, IGNORE, DEBUG)
  • Key exchange messages (DH, ECDH, DH-GEX)
  • Service request messages (SERVICE_REQUEST, SERVICE_ACCEPT, EXT_INFO)

This change enhances the existing 256KB global packet size limit with granular per-message validation. Compliant implementations are not affected.

OTP-20019
POTENTIAL INCOMPATIBILITY
 

The SFTP subsystem root option now properly rejects relative paths at daemon startup. Previously, relative paths would cause unpredictable behavior as file operations resolved relative to the Erlang VM’s current working directory. The option now requires an absolute path or empty string.

OTP-20127
Related Id(s):

PR-11078

Dynamic atom creation has been replaced with static lookups in ssh_transport and ssh_connection, using a dedicated OID-to-algorithm mapping function in ssh_message.

OTP-19709
Related Id(s):

PR-10115

Using KEX strict extension names as specified in draft-ietf-sshm-strict-kex-00. Pre standard names are still supported.

OTP-19750
Related Id(s):

PR-10372, PR-9125

Added an alive option to detect and terminate dead SSH connections. Functionally equivalent to OpenSSH’s ClientAlive/ServerAlive settings.

OTP-19801
POTENTIAL INCOMPATIBILITY
 

ssh:stop_deamon now uses supervisor:stop for shutting down daemons. With this change, the scenario when ssh:stop_daemon is called for a non-existing process results in calling process exiting. Previously an error tuple was returned (which was not documented).

OTP-19965
HIGHLIGHT, POTENTIAL INCOMPATIBILITY
 

The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides protection against both classical and quantum computer attacks while maintaining backward compatibility through automatic fallback to other algorithms when peers don’t support it.

OTP-19969
HIGHLIGHT, POTENTIAL INCOMPATIBILITY
 

The SSH daemon now defaults to disabled for shell and exec services, implementing the “secure by default” principle. This prevents authenticated users from executing arbitrary Erlang code unless explicitly configured.

Applications requiring shell or exec functionality must now explicitly enable:

  %% Enable Erlang shell
  ssh:daemon(Port, [{shell, {shell, start, []}} | Options])

  %% Enable Erlang term evaluation via exec
  ssh:daemon(Port, [{exec, erlang_eval} | Options])

  %% Restore complete old behavior
  ssh:daemon(Port, [{shell, {shell, start, []}},
                    {exec, erlang_eval}
                    | Options])
OTP-20031
Related Id(s):

PR-10838

Added SFTP resource limits section to hardening guide covering max_handles, max_path, and max_files with deployment recommendations.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

OTP-20078
HIGHLIGHT, POTENTIAL INCOMPATIBILITY
 

The SFTP subsystem is no longer enabled by default when starting an SSH daemon. To enable it, add the subsystems option explicitly:

ssh:daemon(Port, [{subsystems, [ssh_sftpd:subsystem_spec([])]} | Options])
OTP-20079
Related Id(s):

PR-10970

The SSH hardening guide has been improved with a timeout overview table replacing the previous image, corrected terminology (“authenticated” instead of “authorized”), and new examples for loopback binding, public key user checking, and password lockout using ETS.

OTP-20099
Related Id(s):

PR-11010

With this change usage of zlib compression algorithm in SSH is deprecated and scheduled for removal in OTP 30.0

OTP-20100
Related Id(s):

PR-11012

Updated SSH documentation with current OTP 29 algorithm defaults, including the new mlkem768x25519-sha256 post-quantum key exchange. Fixed stale examples, typos, and improved document structure.

Full runtime dependencies of ssh-6.0

crypto-5.7, erts-14.0, kernel-10.3, public_key-1.6.1, runtime_tools-1.15.1, stdlib-8.0

ssl-11.7 #

OTP-20116
Related Id(s):

GH-11030, PR-11062

Add missing clauses to ssl_handshake:extension_value/1. If an hello extension, missing a handling clause was present in a paused handshake, the handshake would fail.

OTP-19744
Related Id(s):

PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730

The legacy and and or operators have been replaced with other language constructs.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

OTP-20070
HIGHLIGHT, POTENTIAL INCOMPATIBILITY
 

The post-quantum hybrid algorithm x25519mlkem768 is now the most preferred key exchange group in the default configuration.

Post-quantum hybrid algorithms secp384r1mlkem1024 and secp256r1mlkem768 are supported but have to be configured. The same goes for the plain post-quantum algorithms mlkem1024, mlkem768, and mlkem512.

The most preferred signature algorithms is now post-quantum algorithms ML-DSA followed by the fastest SLH-DSA (slh_dsa_sha2_256f) algorithm, if such a certificate is available in the configuration. Other SLH-DSA variants are also supported but are added to the end of the preferred list.

All these algorithms were available in OTP-28.4 but none of them were preferred and some of them changed default status.

OTP-20080
POTENTIAL INCOMPATIBILITY
 

Secure renegotiation for TLS-1.2 specified in RFC 5746 from 2010 is now always used. The interoperability fallback option {secure_renegotiate,SecureRenegotiate} is no longer needed.

OTP-20087
HIGHLIGHT
 

There is a new Hardening guide giving guidelines on how to strengthen the security for the ssl application.

Full runtime dependencies of ssl-11.7

crypto-5.8, erts-16.0, inets-5.10.7, kernel-10.3, public_key-1.20.3, runtime_tools-1.15.1, stdlib-7.0

stdlib-8.0 #

OTP-19932
Related Id(s):

PR-10510

Fixed an issue in digraph_utils:roots/1 where roots could be missed in some cases.

OTP-19991
Related Id(s):

GH-10557, PR-10735

beam_lib:strip/1 will now retain the Beam debug information chunk produced by the beam_debug_info option. The chunk will also be retained when combing the beam_debug_info option with the undocumented slim option.

The runtime system will no longer crash when attempting to load modules that have been compiled with beam_debug_info but lack the actual Beam debug info chunk.

OTP-20001
Related Id(s):

GH-10650, PR-10653

Fixed a crash when zstd:compress/2 was asked to compress empty data.

OTP-20124
Related Id(s):

PR-10808

Replaced a sleep clause in user_drv shutdown with a flush of the output buffer.

OTP-20125
Related Id(s):

PR-11069

The calendar:seconds_to_time/1 function now checks the range for each of the components of a time tuple ({Hours,Minutes,Seconds}) and fail with an exception if a component is out of range.

OTP-19663
Related Id(s):

PR-9899

Error return values from functions in zip now also specify which file in the archive the error belongs to.

OTP-19744
Related Id(s):

PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730

The legacy and and or operators have been replaced with other language constructs.

OTP-19783
Related Id(s):

PR-10161

The undocumented and unsupported function lists:zf/2 is now deprecated.

OTP-19785
HIGHLIGHT
 

Native records as described in EEP-79 has been implemented.

A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.

Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.

OTP-19800
Related Id(s):

PR-9209

The new supervior:stop/1,2 functions can be used to manage the dynamic parts of a supervisor tree in an application from outside the tree but in the same application.

OTP-19815
Related Id(s):

PR-10304

Added a new constructor array:from/2.

OTP-19826
HIGHLIGHT
 

There are new functions for random permutation of a list: rand:shuffle/1 and rand:shuffle_s/2. They are inspired by a suggestion and discussion on ErlangForums.

OTP-19838
Related Id(s):

PR-10338

The undocumented functions erl_eval:extended_parse_exprs/1 and erl_eval:extended_parse_term/1 will now be faster when called with a long list of tokens. (These functions are used by qlc and the shell.)

OTP-19853
Related Id(s):

PR-10382

The unicode module now supports the Unicode 17 standard.

OTP-19858
Related Id(s):

PR-10387

Added functions to unicode for recognizing whitespaces and identifiers.

OTP-19882
Related Id(s):

PR-10453, OTP-19827

The rand:bytes/1 and rand:bytes_s/2 functions have been optimized by implementing a new internal callback function that crypto:rand_seed_alg/1 and crypto:alg_seed_alg_s/1 have been updated to use.

A new algorithm crypto_prng1, which also takes advantage of this new internal callback, has been added to crypto:rand_seed_alg/2 and crypto:rand_seed_alg_s/2. It is much faster then the existing crypto_aes, in particular for generating bytes.

OTP-19898
HIGHLIGHT
 

There will now be a warning when exporting variables out of a subexpression. For example:

case file:open(File, AllOpts = [write,{encoding,utf8}]) of
    {ok,Fd} ->
        {Fd,AllOpts}
end

To avoid the warning, this can be rewritten to:

AllOpts = [write,{encoding,utf8}],
case file:open(File, AllOpts) of
    {ok,Fd} ->
        {Fd,AllOpts}
end

The warning can be suppressed by giving option nowarn_export_var_subexpr to the compiler.

OTP-19903
Related Id(s):

PR-10422

There are new functions in the shell for returning process information.

The pi/1 function is shortcut for erlang:process_info/1. The pi/3 function takes the three numbers from a pid, constructs a pid, and calls process_info/1.

Examples:

1> pi(<0.90.0>).
[{current_function,{c,pinfo,1}},
{initial_call,{erlang,apply,2}},
{status,running},
...
2> pi(0, 90, 0).
[{current_function,{c,pinfo,1}},
{initial_call,{erlang,apply,2}},
{status,running},
...
OTP-19906
Related Id(s):

PR-10519

Tools such as the debugger, beam_lib, and xref no longer support BEAM files created before OTP 13B.

OTP-19912
Related Id(s):

PR-10449

The calendar module has been updated to use the much faster than before Neri-Schneider algorithm for Gregorian calendar calculations, and been extended to handle negative years.

OTP-19922
HIGHLIGHT
 

graph is a new module that is a functional equivalent of the digraph and digraph_utils modules.

OTP-19927
HIGHLIGHT, POTENTIAL INCOMPATIBILITY
 

Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:

1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
ok
2> fh(lists:seq(1, 10)).
* exception error: bad filter 2614250

In Erlang/OTP 29, attempting to bind a variable in a comprehension will fail by default:

1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
* 5:14: matches using '=' are not allowed in comprehension qualifiers
unless the experimental 'compr_assign' language feature is enabled.
With 'compr_assign' enabled, a match 'P = E' will behave as a
strict generator 'P <-:- [E]'."

However, this example will work as expected if the compr_assign feature is enabled when starting the runtime system:

$ erl -enable-feature compr_assign
. . .
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0].
ok
2> fh(lists:seq(1, 10)).
[2614250]

Here is another example how compr_assign can be used:

-module(example).
-feature(compr_assign, enable).
-export([cat/1]).

cat(Files) ->
    [Char || F <- Files,
             {ok, Bin} = file:read_file(F),
             Char <- unicode:characters_to_list(Bin)].
OTP-19933
Related Id(s):

PR-10573

Removed the undocumented dyn_erl utility.

OTP-19934
Related Id(s):

PR-10524

The functions erl_tar:add/3 and erl_tar:add/4 now accepts the {mode,Mode} option for setting the permission of the file.

OTP-19936
Related Id(s):

GH-10345, PR-10511

Added zstd:flush/2 for flushing compressed data without closing the compression context.

OTP-19938
HIGHLIGHT
 

There will now be a warning when using the catch operator, which has been deprecated for a long time.

It is recommended to instead use trycatchend but is also possible to disable the warning by using the nowarn_deprecated_catch option.

OTP-19942
HIGHLIGHT
 

Multi-valued comprehensions according to EEP 78 has been implemented.

Example:

> [I, -I || I <- lists:seq(1, 5)].
[1,-1,2,-2,3,-3,4,-4,5,-5]
OTP-19943
HIGHLIGHT
 

There will now be a warning for matches that unify constructors, such as the following:

m({a,B} = {Y,Z}) -> . . .

Such a match can be rewritten to:

m({a=Y,B=Y}) -> . . .

The compiler option nowarn_match_alias_pats can be used to disable the warning.

OTP-19963
HIGHLIGHT
 

While the iteration order for maps is undefined, it is now guaranteed that all ways of iterating over maps provides the elements in the same order. That is, all of the following ways of iterating will produce the elements in the same order:

  • maps:keys/1
  • maps:values/1
  • maps:to_list/1
  • maps:to_list(maps:iterator(M))
  • Map comprehension: [{K,V} || K := V <- M]
OTP-20004
HIGHLIGHT, POTENTIAL INCOMPATIBILITY
 

The array module have been extended with several new functions. The internal representation have been changed to allow the new functionality and optimizations. Arrays serialized with term_to_binary/1 in previous releases are not compatible.

OTP-20023
HIGHLIGHT
 

m:erl_tar will use less memory when extracting large tar entries to disk. Instead of reading each tar entry into memory, erl_tar will now stream data in chunks of 64KB. The chunk size is settable using the new {chunks,ChunkSize} option.

The new {max_size,Size} option will set a limit on the total size of extracted data to protect against filling up the disk.

Checking of symlinks has been improved. Some symlinks that were safe (such as dir/link -> ../file) used to be rejected.

OTP-20028
HIGHLIGHT
 

Added a new module called io_ansi that allows the user to emit Virtual Terminal Sequences (a.k.a. ANSI sequences) to the terminal in order to add colors/styling to text or create fully-fledged terminal applications.

io_ansi uses the local terminfo database in order to be as cross-platform compatible as possible.

It also works across nodes so that if functions on a remote node call io_ansi:fwrite/1 it will use the destination terminal’s terminfo database to determine which sequences to emit. In practice, this means that you can call functions in a remote shell session that use io_ansi and it will properly detect the terminal sequences the target terminal can handle and will print using them correctly.

OTP-20029
Related Id(s):

PR-10755

Polished the documentation groups, essentially removed groups that did nothing but obscure the documentation.

OTP-20061
POTENTIAL INCOMPATIBILITY
 

The gb_sets:from_ordset/1 and gb_trees:from_orddict/1 functions would trust their inputs. If the input contained duplicates or was not properly sorted, the resulting gb_set or gb_tree would be invalid, and any number of interesting problems could occur.

In this release, these functions will raise an exception if their input is not valid. That could mean that incorrect programs that seemed to work could now stop working altogether.

There is also a new gb_trees:from_list/1 function for directly creating a gb_tree from a list.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

OTP-20072
HIGHLIGHT
 

The json module now encodes and decodes quoted strings faster. Improvements of up to 55 percent has been measured when decoding JSON data with long strings.

The string:length/1, string:slice/2, and string:slice/3 functions have been optimized. For some strings, they can be up to twice as fast.

Full runtime dependencies of stdlib-8.0

compiler-5.0, crypto-4.5, erts-16.0.3, kernel-11.0, sasl-3.0, syntax_tools-3.2.1

syntax_tools-4.1 #

OTP-20077
Related Id(s):

PR-10243, PR-10962

merl:compile_and_load/1 could crash when compiling code containing comments.

merl:quote/2 would fail to handle literal UTF-8 encoded binaries.

OTP-19744
Related Id(s):

PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730

The legacy and and or operators have been replaced with other language constructs.

OTP-19942
HIGHLIGHT
 

Multi-valued comprehensions according to EEP 78 has been implemented.

Example:

> [I, -I || I <- lists:seq(1, 5)].
[1,-1,2,-2,3,-3,4,-4,5,-5]
OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of syntax_tools-4.1

compiler-9.0, erts-16.0, kernel-10.3, stdlib-8.0

tftp-1.3 #

OTP-19744
Related Id(s):

PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730

The legacy and and or operators have been replaced with other language constructs.

OTP-19996
Related Id(s):

PR-10753

All use of legacy catch in the TFTP application has been rewritten.

In the process, deep return using exit/1 or throw/1 from callbacks has been changed to only work with throw/1, as customary. This was considered a misfeature.

Explicit loading of callback module or logger module has been removed, since that was against what one would expect for embedded mode.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of tftp-1.3

erts-6.0, kernel-6.0, stdlib-5.0

tools-4.2 #

OTP-19921
Related Id(s):

GH-8569, PR-10642

Fixed “unbalanced parenthesis” issue when pressing TAB in emacs erlang shell.

OTP-20059
Related Id(s):

PR-10892

The minimum supported Emacs version for erlang-mode has been raised from 24.3 to 27.1. Compatibility shims for older Emacs versions have been removed.

The erlang-mode package version now tracks the Erlang/OTP release version (29.0) for consistent version numbers across package managers.

OTP-19906
Related Id(s):

PR-10519

Tools such as the debugger, beam_lib, and xref no longer support BEAM files created before OTP 13B.

OTP-20032
HIGHLIGHT
 

The ignore_xref attribute has been handled as a post-analysis filter by build tools such as Rebar3. In this release, xref itself does the filtering, ensuring that all tooling that calls xref for any purpose can rely on these declarations to just work.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

OTP-20085
HIGHLIGHT
 

The runtime system now supports generating encrypted crash dumps. See the description of --enable-encrypted-crash-dumps in [Building and Installing Erlang/OTP].

Full runtime dependencies of tools-4.2

compiler-8.5, crypto-5.9, erts-15.0, kernel-10.0, public_key-1.21, runtime_tools-2.1, stdlib-6.0

wx-2.6 #

OTP-20119
Related Id(s):

ERIERL-1315, PR-11032

The examples for wx are now only installed in one place (in doc/examples).

OTP-19766
Related Id(s):

GH-10151, PR-10187

Documentation about how to validate the SBOM using sigstore has been added.

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of wx-2.6

erts-12.0, kernel-8.0, stdlib-5.0

xmerl-2.2 #

OTP-20066
HIGHLIGHT
 

Added support for -unsafe attributes, which is used to mark functions as unsafe to use.

This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.

Furthermore, xref can now be used to find calls to functions in another application that lack a -doc attribute (undocumented_function_calls), calls to functions in another application marked -doc false. (private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).

Full runtime dependencies of xmerl-2.2

erts-6.0, kernel-8.4, stdlib-2.5

Thanks To #

Alexandre Rodrigues, Alex Mickelson, Andreas Hasselberg, Andrew Bennett, Ayanda Dube, Bentheburrito, Bernhard M. Wiedemann, Bozhidar Batsov, Claes Nästén, Daniel Gorin, Daniel Kukula, dependabot[bot], Eksperimental, Eric Meadows-Jönsson, erlang-bot-app[bot], felipe stival, Fernando Areias, Holger Weiß, Ievgen Pyrogov, Ilya Averyanov, ilya-klyuchnikov, Ilya Klyuchnikov, Jan Uhlig, Jérôme de Bretagne, João Henrique Ferreira de Freitas, Johannes Christ, Jonatan Männchen, José Valim, krishnadas, Loïc Hoguin, loscher, lud, Maria Scott, Marko Mindek, matt, Mend Renovate, Michael Daniels, Michał Muskała, Nelson Vides, Nick Vatamaniuc, Olexandr88, Paul Guyot, Paulo F. Oliveira, Paulo Tomé, Petr Sumbera, Preet, Radek Szymczyszyn, Rasmus Précenth, Richard Carlsson, Robert Ismo, Robin Morisset, Sam Weaver, Sébastien Saint-Sevin, Sergey Fedorov, siiky, Simon Cornish, spoo, Stefan Grundmann, Takeru Ohta, Vadim Yanitskiy, Vance Shipley, Wade Mealing, Wei Huang, williamthome, yagogarea, Zabrane, Zeyu Zhang, наб