Erlang/OTP 26.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 or asdf).

docker run -it erlang:26.0

Highlights #

OTP-14835
Application(s):
kernel, stdlib
Related Id(s):
PR-5924

The Erlang shell has been improved to support the following features:

-- Auto-complete variables, record names, record field names, map keys, function parameter types and filenames.

-- Open external editor in the shell (with C-o) to edit the current expression in an editor.

-- Support defining records (with types), functions and function typespecs, and custom types in the shell.

-- Do not save pager commands, and input to io:getline in history.

OTP-15903
Application(s):
ssl

Improved error checking and handling of ssl options.

OTP-17932
Application(s):
erts, kernel, stdlib
Related Id(s):
GH-3150 , GH-3390 , GH-4225 , GH-4343 , PR-6144

*** POTENTIAL INCOMPATIBILITY ***

The TTY/terminal subsystem has been rewritten by moving more code to Erlang from the old linked-in driver and implementing all the I/O primitives needed in a NIF instead.

On Unix platforms the user should not notice a lot of difference, besides better handling of unicode characters and fixing of some long standing bugs.

Windows users will notice that erl.exe has the same functionality as a normal Unix shell and that werl.exe has been removed and replaced with a symlink to erl.exe. This makes the Windows Erlang terminal experience identical to that of Unix.

The re-write brings with it a number of bug fixes and feature additions:

-- The TTY is now reset when Erlang exits, fixing zsh to not break when terminating an Erlang session.

-- standard_error now uses the same unicode mode as standard_io.

-- Hitting backspace when searching the shell history with an empty search string no longer breaks the shell.

-- Tab expansion now works on remote nodes started using the JCL interface.

-- It is now possible to configure the shell slogan and the session slogans (that is the texts that appear when you start an Erlang shell). See the kernel documentation for more details.

-- Added shell:start_interactive for starting the interactive shell from a non-interactive Erlang session (for example an escript).

-- On Windows, when starting in detached mode the standard handler are now set to nul devices instead of being unset.

-- Standard I/O now always defaults to unicode mode if supported. Previously the default was latin1 if the runtime system had been started with -oldshell or -noshell (for example in an escript). To send raw bytes over standard out, one now explicitly has to specify io:setopts(standard_io, [{encoding, latin1}]).

OTP-18029
Application(s):
erts, kernel

Add support for socket on Windows.

-- Pre release status.

-- Error codes not finalized.

-- No explicit support for Windows specific options (socket options, flags for read and write).

-- New async api for Windows (completion). See the Asynchronous calls chapter in the (Socket Usage) Users Guide.

-- To ensure platform independence, gen_tcp and gen_udp is *intended* to be used (not yet updated).

OTP-18135
Application(s):
erts
Related Id(s):
GH-4965 , PR-6046

*** POTENTIAL INCOMPATIBILITY ***

As announced when OTP 25 was released, multi time warp mode is now enabled by default. This assumes that all code executing on the system is time warp safe.

If you have old code in the system that is not time warp safe, you now explicitly need to start the system in no time warp mode (or singe time warp mode if it is partially time warp safe) in order to avoid problems. When starting the system in no time warp mode, the system behaves as it did prior to the introduction of the extended time functionality introduced in OTP 18.

If you have code that is not time warp safe, you are strongly encouraged to change this so that you can use multi time warp mode. Compared to no time warp mode, multi time warp mode improves scalability and performance as well as accuracy and precision of time measurements.

OTP-18137
Application(s):
compiler, erts
Related Id(s):
PR-6259 , PR-6404 , PR-6576 , PR-6804

There are several new optimization for binary syntax in the JIT:

-- Creation and matching of binaries with segments of fixed sizes have been optimized.

-- Creation and matching of UTF-8 segments have been optimized.

-- Appending to binaries has been optimized.

OTP-18185
Application(s):
compiler, erts
Related Id(s):
GH-6139

The compiler and JIT now generate better code for creation of small maps where all keys are literals known at compile time.

OTP-18188
Application(s):
dialyzer
Related Id(s):
PR-5997

Dialyzer has a new incremental mode that be invoked by giving the --incremental option when running Dialyzer. This new incremental mode is likely to become the default in a future release.

Incremental mode primarily differs from the previous, "classic", ways of running Dialyzer, in that its model is optimised around the common use case of regularly analysing a single codebase, tweaking the code, analysing it again, and so on, without explicit reference to the building and checking of a PLT.

In this mode the PLT file acts much more like a true cache, where users provide a codebase and a set of files they care about, and Dialyzer does the legwork in terms of deciding how to most efficiently report all of the relevant warnings given the cached results it may already have in the PLT (and if a PLT doesn't exist, incremental mode will create one).

OTP-18228
Application(s):
stdlib
Related Id(s):
GH-5639

The performance of the base64 module has been significantly improved. For example, on an x86_64 system with the JIT both encode and decode are more than three times faster than in Erlang/OTP 25.

OTP-18235
Application(s):
kernel, ssl
Related Id(s):
PR-5840 , PR-6104

Support for Kernel TLS (kTLS), has been added to the SSL application, for TLS distribution (-proto_dist inet_tls), the SSL option {ktls, true}. Using this for general SSL sockets is uncomfortable, undocumented and not recommended since it requires very platform dependent raw options.

This, for now, only works for some not too old Linux distributions. Roughly, a kernel 5.2.0 or later with support for UserLand Protocols and the kernel module tls is required.

OTP-18278
Application(s):
kernel, stdlib
Related Id(s):
PR-6260

The Erlang shell's auto-completion when typing tab has been changed to happen after the editing current line instead of before it.

This behaviour can be configured using a the shell_expand_location STDLIB configuration parameter.

OTP-18297
Application(s):
compiler, stdlib
Related Id(s):
GH-6348

A limitation in the binary syntax has been removed. It is now possible to match binary patterns in parallel. Example: <<A:8>> = <<B:4,C:4>> = Bin

OTP-18318
Application(s):
stdlib
Related Id(s):
PR-6347

In the lists module, the zip family of functions now takes options to allow handling lists of different lengths.

OTP-18334
Application(s):
erts
Related Id(s):
PR-6434

Support for UTF-8 atoms and strings in the NIF interface including new functions enif_make_new_atom, enif_make_new_atom_len and enif_get_string_length.

OTP-18367
Application(s):
compiler, erts, stdlib
Related Id(s):
GH-6544

The BIFs min/2 and max/2 are now allowed to be used in guards and match specs.

OTP-18413
Application(s):
compiler, erts, stdlib, syntax_tools, tools
Related Id(s):
EEP-58 , PR-6727

Map comprehensions as suggested in EEP 58 has now been implemented.

OTP-18414
Application(s):
erts, stdlib
Related Id(s):
PR-6151

Some map operations have been optimized by changing the internal sort order of atom keys. This changes the (undocumented) order of how atom keys in small maps are printed and returned by maps:to_list/1 and maps:next/1. The new order is unpredictable and may change between different invocations of the Erlang VM.

For applications where order is important, there is a new function maps:iterator/2 for creating iterators that return the map elements in a deterministic order. There are also new modifiers k and K for the format string for io:format() to support printing map elements ordered.

OTP-18431
Application(s):
compiler, stdlib
Related Id(s):
PR-6739

Improved the selective receive optimization, which can now be enabled for references returned from other functions.

This greatly improves the performance of gen_server:send_request/3, gen_server:wait_response/2, and similar functions.

OTP-18435
Application(s):
erts
Related Id(s):
PR-6827

The amount of significant bits in node local process identifiers and port identifiers has been extended from 28 bits to 60 bits on 64-bit runtime systems. This makes these identifiers large enough to in practice never having to be reused during the life time of a node.

OTP-18440
Application(s):
erts
Related Id(s):
PR-6351

New trace feature call_memory. Similar to call_time tracing, but instead of measure accumulated time in traced functions it measures accumulated heap space consumed by traced functions. It can be used to compare how much different functions are contributing to garbage collection being triggered.

OTP-18445
Application(s):
erts, stdlib

It is no longer necessary to enable a feature in the runtime system in order to load modules that are using it. It is sufficient to enable the feature in the compiler when compiling it.

That means that to use feature maybe_expr in Erlang/OTP 26, it is sufficient to enable it during compilation.

In Erlang/OTP 27, feature maybe_expr will be enabled by default, but it will be possible to disable it.

OTP-18459
Application(s):
ssl

Add encoding and decoding of use_srtp hello extension to facilitate for DTLS users to implement SRTP functionality.

OTP-18491
Application(s):
parsetools
Related Id(s):
PR-6882

Leex has been extended with optional column number support.

OTP-18495
Application(s):
stdlib
Related Id(s):
PR-6943

The family of enumeration functions in module lists has been extended with enumerate/3 that allows a step value to be supplied.

OTP-18498
Application(s):
erts

Reintroduced the optimization that turned anonymous functions without free variables into literals (OTP-15195). This optimization was lost during refactoring in OTP 24.

Alongside this fix, we plan to remove the "fun creator pid" feature in OTP 27. See Upcoming Potential Incompatibilities for more details.

OTP-18500
Application(s):
stdlib

Update Unicode to version 15.0.0.

OTP-18522
Application(s):
dialyzer, erts, stdlib

Added the new built-in type dynamic() introduced in EEP-61, improving support for gradual type checkers.

Potential Incompatibilities #

OTP-14771
Application(s):
ssl

Remove less that 256 bit ECC from default supported ECC pre TLS-1.3

OTP-17771
Application(s):
erts
Related Id(s):
GH-5325 , PR-6370

The enif_set_option() function has been introduced into the NIF API. It can be used in order to set the ERL_NIF_OPT_DELAY_HALT and/or ERL_NIF_OPT_ON_HALT options with which one can synchronize halt of the runtime system with flushing enabled and execution of NIFs. Halt of the runtime system without flushing enabled, now terminates the runtime system without execution of atexit/on_exit handlers that may have been installed into the runtime system which might be considered a potential incompatibility.

OTP-17932
Application(s):
erts, kernel, stdlib
Related Id(s):
GH-3150 , GH-3390 , GH-4225 , GH-4343 , PR-6144

*** HIGHLIGHT ***

The TTY/terminal subsystem has been rewritten by moving more code to Erlang from the old linked-in driver and implementing all the I/O primitives needed in a NIF instead.

On Unix platforms the user should not notice a lot of difference, besides better handling of unicode characters and fixing of some long standing bugs.

Windows users will notice that erl.exe has the same functionality as a normal Unix shell and that werl.exe has been removed and replaced with a symlink to erl.exe. This makes the Windows Erlang terminal experience identical to that of Unix.

The re-write brings with it a number of bug fixes and feature additions:

-- The TTY is now reset when Erlang exits, fixing zsh to not break when terminating an Erlang session.

-- standard_error now uses the same unicode mode as standard_io.

-- Hitting backspace when searching the shell history with an empty search string no longer breaks the shell.

-- Tab expansion now works on remote nodes started using the JCL interface.

-- It is now possible to configure the shell slogan and the session slogans (that is the texts that appear when you start an Erlang shell). See the kernel documentation for more details.

-- Added shell:start_interactive for starting the interactive shell from a non-interactive Erlang session (for example an escript).

-- On Windows, when starting in detached mode the standard handler are now set to nul devices instead of being unset.

-- Standard I/O now always defaults to unicode mode if supported. Previously the default was latin1 if the runtime system had been started with -oldshell or -noshell (for example in an escript). To send raw bytes over standard out, one now explicitly has to specify io:setopts(standard_io, [{encoding, latin1}]).

OTP-18135
Application(s):
erts
Related Id(s):
GH-4965 , PR-6046

*** HIGHLIGHT ***

As announced when OTP 25 was released, multi time warp mode is now enabled by default. This assumes that all code executing on the system is time warp safe.

If you have old code in the system that is not time warp safe, you now explicitly need to start the system in no time warp mode (or singe time warp mode if it is partially time warp safe) in order to avoid problems. When starting the system in no time warp mode, the system behaves as it did prior to the introduction of the extended time functionality introduced in OTP 18.

If you have code that is not time warp safe, you are strongly encouraged to change this so that you can use multi time warp mode. Compared to no time warp mode, multi time warp mode improves scalability and performance as well as accuracy and precision of time measurements.

OTP-18140
Application(s):
erl_interface, erts, jinterface, kernel
Related Id(s):
PR-6072

As announced since the release of OTP 24, support for:

-- version 4 node container types in the external term format are now mandatory. That is, references supporting up to 5 32-bit integer identifiers, and process and port identifiers with support for 64-bit data storage. The distribution flag DFLAG_V4_NC is therefor now also mandatory. OTP has since OTP 24 supported this. Also note that the external format produced by term_to_binary() and term_to_iovec() will unconditionally produce pids, ports, and references supporting this larger format.

-- the new link protocol introduced in OTP 23.3 is now mandatory. The distribution flag DFLAG_UNLINK_ID is therefor now also mandatory.

Due to the above, OTP 26 nodes will refuse to connect to OTP nodes from releases prior to OTP 24.

OTP-18168
Application(s):
ssl
Related Id(s):
GH-6014 , PR-6019

With this change, stateless tickets generated by server with anti_replay option enabled can be used for creating ClientHello throughout ticket lifetime. Without this change, usability was limited to WindowSize number of seconds configured for anti_replay option.

OTP-18210
Application(s):
kernel
Related Id(s):
GH-5877 , PR-5878

Fixed a bug where duplicate keys were allowed in the .app file of an application. Duplicate keys are now rejected and the application will not start if they exist.

OTP-18285
Application(s):
kernel, ssh, stdlib
Related Id(s):
PR-6262

Typing Ctrl+L in a shell now clears the screen and redraws the current line instead of only redrawing the current line. To only redraw the current line, you must now type Alt+L. This brings the behaviour of Ctrl+L closer to how bash and other shells work.

OTP-18344
Application(s):
erts, kernel
Related Id(s):
GH-6461 , OTP-18324 , PR-6481 , PR-6522 , PR-6944

The following inet:setopts/2 options have been introduced:

-- reuseport -- Reuse of local port. Load balancing may or may not be provided depending on underlying OS.

-- reuseport_lb -- Reuse of local port. Load balancing provided.

-- exclusiveaddruse -- Exclusive address/port usage on Windows. This socket option is Windows specific and will silently be ignored on other systems.

The behavior of setting reuseaddr on Windows have changed in a *backwards incompatible* way. The underlying SO_REUSEADDR socket option is now only set if both the reusaddr and the reuseport inet options have been set. This since the underlying SO_REUSEADDR socket option on Windows behaves similar to how BSD behaves if both the underlying socket options SO_REUSEADDR and SO_REUSEPORT have been set. See the documentation of the reuseaddr option for more information.

OTP-18438
Application(s):
ssl
Related Id(s):
GH-6679

For security reasons remove support for SHA1 and DSA algorithms from default values.

OTP-18439
Application(s):
dialyzer
Related Id(s):
GH-5695 , GH-6942 , PR-6822

Dialyzer has enabled (by default) warnings about unknown types and functions.

Prior to this change, Dialyzer had warnings about unknown types and functions disabled (by default).

This default value has been overwritten; Dialyzer now warns about unknown types and functions (as requested by the community in GH-5695). Thus, the following two examples are equivalent, i.e., passing the -Wunknown function is enabled by default:

dialyzer moduler.erl -Wunknown -Wmissing_return

dialyzer moduler.erl -Wmissing_return

Dialyzer has a new flag, -Wno_unknown. Its purpose is to suppress warnings about unknown functions and types.

Users who wish to suppress these warnings can invoke Dialyzer using this flag. Example: dialyzer module.erl -Wno_unknown

OTP-18455
Application(s):
ssl
Related Id(s):
GH-5899

Change the client default verify option to verify_peer. Note that this makes it mandatory to also supply trusted CA certificates or explicitly set verify to verify_none. This also applies when using the so called anonymous test cipher suites defined in TLS versions pre TLS-1.3.

OTP-18471
Application(s):
kernel, stdlib
Related Id(s):
GH-6339 , PR-6843

proc_lib:start*/* has become synchronous when the started process fails. This requires that a failing process use a new function proc_lib:init_fail/2,3, or exits, to indicate failure. All OTP behaviours have been fixed to do this.

All these start functions now consume the 'EXIT' message from a process link for all error returns. Previously it was only the start_link/* functions that did this, and only when the started function exited, not when it used init_ack/1,2 or init_fail/2,3 to create the return value.

OTP-18488
Application(s):
reltool
Related Id(s):
PR-6836

Support for the experimental code archives feature has been removed from reltool.

OTP-18490
Application(s):
diameter, inets, mnesia, reltool, snmp, ssh, tftp, wx
Related Id(s):
GH-6339 , OTP-18471 , PR-6843

The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

OTP-18505
Application(s):
erts
Related Id(s):
PR-6991

The default encoding of atoms by term_to_binary and term_to_iovec have changed from Latin1 to UTF-8. The old encoding can still be obtained with options {minor_version, 1}.

Apart from encoding code points between 128 and 255 with two bytes (UTF-8) instead of one, most atoms will occupy one less byte as the length field use only one byte instead of two if possible.

OTP-18530
Application(s):
inets

IP display string will now always be in lower case, effects ipv6 addresses.

OTP-18531
Application(s):
ssl

If a user cancel alert with level warning is received during handshake make it be handled the same regardless of TLS version. If it is received in connection in TLS-1.3 regard it as an error as it is inappropriate.

In TLS-1.3 all error alerts are considered FATAL regardless of legacy alert type. But make sure legacy type is printed in logs to not confuse users that are expecting the same legacy type as sent by peer.

OTP-18536
Application(s):
inets

Removed deprecated functions

OTP-18549
Application(s):
erts, runtime_tools
Related Id(s):
PR-7105

Removed the experimental erts_alloc_config module. It no longer produced good configurations and cannot be fixed in a reasonably backwards compatible manner. It has since OTP 25 been deprecated and scheduled for removal in OTP 26.

OTP-18551
Application(s):
kernel
Related Id(s):
PR-7106

Removed code:is_module_native/1 since HiPE has been removed. It has since OTP 24 been deprecated and scheduled for removal in OTP 26.

Removed code:rehash/0 since the code path feature no longer is present. It has since OTP 19 been deprecated and has since OTP 24 been scheduled for removal in OTP 26.

OTP-18552
Application(s):
erts
Related Id(s):
PR-6973

ERTS internal thread names have been changed. All threads created by ERTS now have a prefix erts_ followed by a type name potentially followed by an integer index. For example, normal schedulers are now named erts_sched_<IX>, dirty CPU schedulers erts_dcpus_<IX>, and dirty IO schedulers erts_dios_<IX>. NIF and driver thread names are truncated at 15 characters regardless of whether the underlying platform support more characters or not.

OTP-26.0 #

OTP-18364
Application(s):
otp

Starting from Erlang/OTP 24, it has been possible to write expressions such as A = catch Expr without parentheses around the catch expression, but it was not mentioned in the documentation. It now is.

OTP-18538
Application(s):
megaco, otp
Related Id(s):
GH-7031 , PR-7078

Removed configure option --enable-sanitizers. It was untested and broken. Address sanitizer for the emulator has better support by the asan build target.

OTP-18053
Application(s):
erts, otp
Related Id(s):
PR-6101

Updated configure cache for Windows. This makes configure run faster on Windows as many more checks are cached.

OTP-18209
Application(s):
otp
Related Id(s):
PR-5881

Fix the make target release, release_docs, install and install-docs now work when the target path contains whitespace and/or unicode characters.

OTP-18492
Application(s):
otp
Related Id(s):
GH-6706

The documentation for the bit syntax has been updated to correct some factual errors and omissions.

OTP-18511
Application(s):
otp, stdlib
Related Id(s):
PR-7017

The regular expression library powering the re module is likely to be changed in Erlang/OTP 27. See Upcoming Potential Incompatibilities.

asn1-5.1 #

OTP-18534
Application(s):
asn1
Related Id(s):
ERIERL-737 , PR-7039

The ASN.1 compiler used to reject correctly specified RELATIVE-OID values containing other RELATIVE-OID values. This is now corrected.

OTP-18441
Application(s):
asn1

Minor code improvements.

OTP-18447
Application(s):
asn1, crypto, erts, kernel, public_key, runtime_tools

Handling of on_load modules during boot has been improved by adding an extra step in the boot order for embedded mode that runs all on_load handlers, instead of relying on explicit invocation of them, later, when the kernel supervision tree starts.

This is mostly a code improvement and OTP internal simplification to avoid future bugs and to simplify code maintenance.

Full runtime dependencies of asn1-5.1: erts-11.0, kernel-7.0, stdlib-3.13

common_test-1.25 #

OTP-18377
Application(s):
common_test
Related Id(s):
PR-6437

This change improves Common Test docs (CT hook example code) and adds Emacs skeleton with hook code.

OTP-18259
Application(s):
common_test
Related Id(s):
PR-5924

Updated common_test with a more robust way to fetch old releases, while ignoring the current release.

OTP-18340
Application(s):
common_test

- re-write the XML ct module documentation into erlang types to make Dialyzer able to catch more precise errors

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

Full runtime dependencies of common_test-1.25: compiler-6.0, crypto-4.5, debugger-4.1, erts-7.0, ftp-1.0, inets-6.0, kernel-8.4, observer-2.1, runtime_tools-1.8.16, sasl-2.5, snmp-5.1.2, ssh-4.0, stdlib-4.0, syntax_tools-1.7, tools-3.2, xmerl-1.3.8

compiler-8.3 #

OTP-18389
Application(s):
compiler, dialyzer
Related Id(s):
GH-6508 , GH-7116 , PR-6864

The compiler would silently accept singleton (unbound) type variables in a union type. Starting from Erlang/OTP 26, the compiler will generate a warning for this example. The warning can be disabled using the nowarn_singleton_typevar option. In Erlang/OTP 27, the warning will become an error.

OTP-18126
Application(s):
compiler, erts
Related Id(s):
PR-6033

Optimized record updates.

OTP-18137
Application(s):
compiler, erts
Related Id(s):
PR-6259 , PR-6404 , PR-6576 , PR-6804

*** HIGHLIGHT ***

There are several new optimization for binary syntax in the JIT:

-- Creation and matching of binaries with segments of fixed sizes have been optimized.

-- Creation and matching of UTF-8 segments have been optimized.

-- Appending to binaries has been optimized.

OTP-18185
Application(s):
compiler, erts
Related Id(s):
GH-6139

*** HIGHLIGHT ***

The compiler and JIT now generate better code for creation of small maps where all keys are literals known at compile time.

OTP-18297
Application(s):
compiler, stdlib
Related Id(s):
GH-6348

*** HIGHLIGHT ***

A limitation in the binary syntax has been removed. It is now possible to match binary patterns in parallel. Example: <<A:8>> = <<B:4,C:4>> = Bin

OTP-18337
Application(s):
compiler, stdlib
Related Id(s):
GH-6477 , PR-6503

It is documented that $\^X is the ASCII code for Control X, where X is an uppercase or lowercase letter. However, this notation would work for any character X, even then it didn't make sense.

In Erlang/OTP 26, it is now documented that the following characters are also allowed to follow the \^ characters: @, [, \, ], ^, _, and ?. Attempt to use other characters will be rejected with a compiler error.

The value for $\^? is now 127 (instead of 31 as in earlier releases).

OTP-18367
Application(s):
compiler, erts, stdlib
Related Id(s):
GH-6544

*** HIGHLIGHT ***

The BIFs min/2 and max/2 are now allowed to be used in guards and match specs.

OTP-18413
Application(s):
compiler, erts, stdlib, syntax_tools, tools
Related Id(s):
EEP-58 , PR-6727

*** HIGHLIGHT ***

Map comprehensions as suggested in EEP 58 has now been implemented.

OTP-18431
Application(s):
compiler, stdlib
Related Id(s):
PR-6739

*** HIGHLIGHT ***

Improved the selective receive optimization, which can now be enabled for references returned from other functions.

This greatly improves the performance of gen_server:send_request/3, gen_server:wait_response/2, and similar functions.

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

OTP-18502
Application(s):
compiler

The compiler will now inline calls to maps:get/3.

OTP-18574
Application(s):
compiler, erts

In Erlang/OTP 27, 0.0 will no longer be considered to be exactly equal to -0.0. See Upcoming Potential Incompatibilities.

Full runtime dependencies of compiler-8.3: crypto-5.1, erts-13.0, kernel-8.4, stdlib-5.0

crypto-5.2 #

OTP-18571
Application(s):
crypto

Fix cmac_update aes_128_cbc for LibreSSL.

OTP-18204
Application(s):
crypto
Related Id(s):
PR-6203

Add support for SHAKE128 and SHAKE256.

OTP-18206
Application(s):
crypto
Related Id(s):
PR-6167

Make the -DOPENSSL_API_COMPAT flag work without warnings.

OTP-18405
Application(s):
crypto, diameter, kernel, ssl
Related Id(s):
GH-6672 , PR-6700 , PR-6702 , PR-6768 , PR-6769 , PR-6812 , PR-6814

Replace size/1 with either tuple_size/1 or byte_size/1

The size/1 BIF is not optimized by the JIT, and its use can result in worse types for Dialyzer.

When one knows that the value being tested must be a tuple, tuple_size/1 should always be preferred.

When one knows that the value being tested must be a binary, byte_size/1 should be preferred. However, byte_size/1 also accepts a bitstring (rounding up size to a whole number of bytes), so one must make sure that the call to byte_size/ is preceded by a call to is_binary/1 to ensure that bitstrings are rejected. Note that the compiler removes redundant calls to is_binary/1, so if one is not sure whether previous code had made sure that the argument is a binary, it does not harm to add an is_binary/1 test immediately before the call to byte_size/1.

OTP-18447
Application(s):
asn1, crypto, erts, kernel, public_key, runtime_tools

Handling of on_load modules during boot has been improved by adding an extra step in the boot order for embedded mode that runs all on_load handlers, instead of relying on explicit invocation of them, later, when the kernel supervision tree starts.

This is mostly a code improvement and OTP internal simplification to avoid future bugs and to simplify code maintenance.

Full runtime dependencies of crypto-5.2: erts-9.0, kernel-5.3, stdlib-3.9

dialyzer-5.1 #

OTP-18237
Application(s):
dialyzer
Related Id(s):
GH-6221 , PR-6243

When checking behaviors, Dialyzer could generate false warning that a callback function did not have the correct type according to the spec in the behavior definition.

OTP-18276
Application(s):
dialyzer
Related Id(s):
GH-6333

In a spec, list(none()) used to mean none(). It has now been corrected to mean the empty list.

OTP-18389
Application(s):
compiler, dialyzer
Related Id(s):
GH-6508 , GH-7116 , PR-6864

The compiler would silently accept singleton (unbound) type variables in a union type. Starting from Erlang/OTP 26, the compiler will generate a warning for this example. The warning can be disabled using the nowarn_singleton_typevar option. In Erlang/OTP 27, the warning will become an error.

OTP-18485
Application(s):
dialyzer
Related Id(s):
GH-6850 , PR-6854

Fixed a bug that prevented the --plts option from being used together with --add-to-plt.

OTP-18562
Application(s):
dialyzer

Fixed a crash when analyzing code that contained illegal bitstring segment sizes.

OTP-18564
Application(s):
dialyzer
Related Id(s):
GH-7153

Fixed a crash when formatting certain warnings that contained multi-byte unicode characters.

OTP-18188
Application(s):
dialyzer
Related Id(s):
PR-5997

*** HIGHLIGHT ***

Dialyzer has a new incremental mode that be invoked by giving the --incremental option when running Dialyzer. This new incremental mode is likely to become the default in a future release.

Incremental mode primarily differs from the previous, "classic", ways of running Dialyzer, in that its model is optimised around the common use case of regularly analysing a single codebase, tweaking the code, analysing it again, and so on, without explicit reference to the building and checking of a PLT.

In this mode the PLT file acts much more like a true cache, where users provide a codebase and a set of files they care about, and Dialyzer does the legwork in terms of deciding how to most efficiently report all of the relevant warnings given the cached results it may already have in the PLT (and if a PLT doesn't exist, incremental mode will create one).

OTP-18238
Application(s):
dialyzer
Related Id(s):
PR-6271

Dialyzer now produces clearer error messages for contract violations.

OTP-18282
Application(s):
dialyzer
Related Id(s):
GH-6132 , PR-6335

The name of a built-in type can now be reused as the name of type locally. That is useful when an OTP release introduces a new built-in type; having the possibility to redefine built-in types locally can make it easier to maintain code that works in multiple OTP releases.

OTP-18310
Application(s):
dialyzer

There is new option -no_spec to ignore all specs. It is useful for debugging when one suspects that some specs could be incorrect.

OTP-18342
Application(s):
dialyzer
Related Id(s):
GH-6117 , PR-6654

Dialyzer's overloaded domain warning is now disabled by default, and can be enabled with the flag -Woverlapping_contract.

Dialyzer used to issue a warning for overloaded domains stating "such contracts are currently unsupported and are simply ignored".

These contracts are not "ignored" but rather, Dialyzer takes the union of the overloaded domains. This means that we lose the dependency from each corresponding input to output type. Because of this, the warning is really about not being able to establish a dependency between the input and output types of each respective overloaded function specification.

OTP-18439
Application(s):
dialyzer
Related Id(s):
GH-5695 , GH-6942 , PR-6822

*** POTENTIAL INCOMPATIBILITY ***

Dialyzer has enabled (by default) warnings about unknown types and functions.

Prior to this change, Dialyzer had warnings about unknown types and functions disabled (by default).

This default value has been overwritten; Dialyzer now warns about unknown types and functions (as requested by the community in GH-5695). Thus, the following two examples are equivalent, i.e., passing the -Wunknown function is enabled by default:

dialyzer moduler.erl -Wunknown -Wmissing_return

dialyzer moduler.erl -Wmissing_return

Dialyzer has a new flag, -Wno_unknown. Its purpose is to suppress warnings about unknown functions and types.

Users who wish to suppress these warnings can invoke Dialyzer using this flag. Example: dialyzer module.erl -Wno_unknown

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

OTP-18522
Application(s):
dialyzer, erts, stdlib

*** HIGHLIGHT ***

Added the new built-in type dynamic() introduced in EEP-61, improving support for gradual type checkers.

OTP-18558
Application(s):
dialyzer, stdlib
Related Id(s):
PR-6852

Added the argparse module for simplified argument handling in escripts and similar.

Full runtime dependencies of dialyzer-5.1: compiler-8.0, erts-12.0, kernel-8.0, stdlib-5.0, syntax_tools-2.0, wx-2.0

diameter-2.3 #

OTP-18405
Application(s):
crypto, diameter, kernel, ssl
Related Id(s):
GH-6672 , PR-6700 , PR-6702 , PR-6768 , PR-6769 , PR-6812 , PR-6814

Replace size/1 with either tuple_size/1 or byte_size/1

The size/1 BIF is not optimized by the JIT, and its use can result in worse types for Dialyzer.

When one knows that the value being tested must be a tuple, tuple_size/1 should always be preferred.

When one knows that the value being tested must be a binary, byte_size/1 should be preferred. However, byte_size/1 also accepts a bitstring (rounding up size to a whole number of bytes), so one must make sure that the call to byte_size/ is preceded by a call to is_binary/1 to ensure that bitstrings are rejected. Note that the compiler removes redundant calls to is_binary/1, so if one is not sure whether previous code had made sure that the argument is a binary, it does not harm to add an is_binary/1 test immediately before the call to byte_size/1.

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

OTP-18490
Application(s):
diameter, inets, mnesia, reltool, snmp, ssh, tftp, wx
Related Id(s):
GH-6339 , OTP-18471 , PR-6843

*** POTENTIAL INCOMPATIBILITY ***

The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

Full runtime dependencies of diameter-2.3: erts-10.0, kernel-3.2, ssl-9.0, stdlib-5.0

erl_docgen-1.5 #

OTP-18338
Application(s):
erl_docgen
Related Id(s):
PR-6408

New XML tag <change>. Like a <note> box, but with a different (steel blue) color and label. Intended to contain talk about semantic differences between OTP releases.

OTP-18501
Application(s):
erl_docgen
Related Id(s):
PR-6987

Add "since" attribute to XML taglist/tag elements to document OTP version when a particular option/feature was introduced. The version is shown out in the right margin, similar to "since" versions for functions.

Full runtime dependencies of erl_docgen-1.5: edoc-1.0, erts-11.0, kernel-8.0, stdlib-3.15, xmerl-1.3.7

erl_interface-5.4 #

OTP-18140
Application(s):
erl_interface, erts, jinterface, kernel
Related Id(s):
PR-6072

*** POTENTIAL INCOMPATIBILITY ***

As announced since the release of OTP 24, support for:

-- version 4 node container types in the external term format are now mandatory. That is, references supporting up to 5 32-bit integer identifiers, and process and port identifiers with support for 64-bit data storage. The distribution flag DFLAG_V4_NC is therefor now also mandatory. OTP has since OTP 24 supported this. Also note that the external format produced by term_to_binary() and term_to_iovec() will unconditionally produce pids, ports, and references supporting this larger format.

-- the new link protocol introduced in OTP 23.3 is now mandatory. The distribution flag DFLAG_UNLINK_ID is therefor now also mandatory.

Due to the above, OTP 26 nodes will refuse to connect to OTP nodes from releases prior to OTP 24.

OTP-16607
Application(s):
erl_interface
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-14.0 #

OTP-18016
Application(s):
erts

If a local fun was called while reloading the *exact same* module that defined said fun, there was a small window in which the call would land in code that was yet to be fully loaded.

OTP-18248
Application(s):
erts, kernel
Related Id(s):
GH-6085 , PR-6227

Fix the TLS distribution to work when starting Erlang in embedded mode and a connection is done before kernel is fully started.

OTP-18271
Application(s):
erts, kernel
Related Id(s):
PR-6279

erl -remsh has been improved to provide better error reasons and work when using a shell without terminal support (that is an "oldshell").

OTP-18274
Application(s):
erts
Related Id(s):
PR-6048

Fix so that -fno-omit-frame-pointer is applied to all of the Erlang VM when using the JIT so that tools, such as perf, can crawl the process stacks.

OTP-18277
Application(s):
erts
Related Id(s):
PR-6306

Compilation server now support unicode paths in compilation server for filesystems that are encoded with unicode.

OTP-18498
Application(s):
erts

*** HIGHLIGHT ***

Reintroduced the optimization that turned anonymous functions without free variables into literals (OTP-15195). This optimization was lost during refactoring in OTP 24.

Alongside this fix, we plan to remove the "fun creator pid" feature in OTP 27. See Upcoming Potential Incompatibilities for more details.

OTP-18561
Application(s):
erts

Fixed a crash during tracing on certain platforms that cannot use the machine stack for Erlang code (mainly OpenBSD and Linux with musl).

OTP-17771
Application(s):
erts
Related Id(s):
GH-5325 , PR-6370

*** POTENTIAL INCOMPATIBILITY ***

The enif_set_option() function has been introduced into the NIF API. It can be used in order to set the ERL_NIF_OPT_DELAY_HALT and/or ERL_NIF_OPT_ON_HALT options with which one can synchronize halt of the runtime system with flushing enabled and execution of NIFs. Halt of the runtime system without flushing enabled, now terminates the runtime system without execution of atexit/on_exit handlers that may have been installed into the runtime system which might be considered a potential incompatibility.

OTP-17932
Application(s):
erts, kernel, stdlib
Related Id(s):
GH-3150 , GH-3390 , GH-4225 , GH-4343 , PR-6144

*** HIGHLIGHT ***

*** POTENTIAL INCOMPATIBILITY ***

The TTY/terminal subsystem has been rewritten by moving more code to Erlang from the old linked-in driver and implementing all the I/O primitives needed in a NIF instead.

On Unix platforms the user should not notice a lot of difference, besides better handling of unicode characters and fixing of some long standing bugs.

Windows users will notice that erl.exe has the same functionality as a normal Unix shell and that werl.exe has been removed and replaced with a symlink to erl.exe. This makes the Windows Erlang terminal experience identical to that of Unix.

The re-write brings with it a number of bug fixes and feature additions:

-- The TTY is now reset when Erlang exits, fixing zsh to not break when terminating an Erlang session.

-- standard_error now uses the same unicode mode as standard_io.

-- Hitting backspace when searching the shell history with an empty search string no longer breaks the shell.

-- Tab expansion now works on remote nodes started using the JCL interface.

-- It is now possible to configure the shell slogan and the session slogans (that is the texts that appear when you start an Erlang shell). See the kernel documentation for more details.

-- Added shell:start_interactive for starting the interactive shell from a non-interactive Erlang session (for example an escript).

-- On Windows, when starting in detached mode the standard handler are now set to nul devices instead of being unset.

-- Standard I/O now always defaults to unicode mode if supported. Previously the default was latin1 if the runtime system had been started with -oldshell or -noshell (for example in an escript). To send raw bytes over standard out, one now explicitly has to specify io:setopts(standard_io, [{encoding, latin1}]).

OTP-18029
Application(s):
erts, kernel

*** HIGHLIGHT ***

Add support for socket on Windows.

-- Pre release status.

-- Error codes not finalized.

-- No explicit support for Windows specific options (socket options, flags for read and write).

-- New async api for Windows (completion). See the Asynchronous calls chapter in the (Socket Usage) Users Guide.

-- To ensure platform independence, gen_tcp and gen_udp is *intended* to be used (not yet updated).

OTP-18053
Application(s):
erts, otp
Related Id(s):
PR-6101

Updated configure cache for Windows. This makes configure run faster on Windows as many more checks are cached.

OTP-18126
Application(s):
compiler, erts
Related Id(s):
PR-6033

Optimized record updates.

OTP-18131
Application(s):
erts

Optimized internal hash routines.

OTP-18135
Application(s):
erts
Related Id(s):
GH-4965 , PR-6046

*** HIGHLIGHT ***

*** POTENTIAL INCOMPATIBILITY ***

As announced when OTP 25 was released, multi time warp mode is now enabled by default. This assumes that all code executing on the system is time warp safe.

If you have old code in the system that is not time warp safe, you now explicitly need to start the system in no time warp mode (or singe time warp mode if it is partially time warp safe) in order to avoid problems. When starting the system in no time warp mode, the system behaves as it did prior to the introduction of the extended time functionality introduced in OTP 18.

If you have code that is not time warp safe, you are strongly encouraged to change this so that you can use multi time warp mode. Compared to no time warp mode, multi time warp mode improves scalability and performance as well as accuracy and precision of time measurements.

OTP-18137
Application(s):
compiler, erts
Related Id(s):
PR-6259 , PR-6404 , PR-6576 , PR-6804

*** HIGHLIGHT ***

There are several new optimization for binary syntax in the JIT:

-- Creation and matching of binaries with segments of fixed sizes have been optimized.

-- Creation and matching of UTF-8 segments have been optimized.

-- Appending to binaries has been optimized.

OTP-18140
Application(s):
erl_interface, erts, jinterface, kernel
Related Id(s):
PR-6072

*** POTENTIAL INCOMPATIBILITY ***

As announced since the release of OTP 24, support for:

-- version 4 node container types in the external term format are now mandatory. That is, references supporting up to 5 32-bit integer identifiers, and process and port identifiers with support for 64-bit data storage. The distribution flag DFLAG_V4_NC is therefor now also mandatory. OTP has since OTP 24 supported this. Also note that the external format produced by term_to_binary() and term_to_iovec() will unconditionally produce pids, ports, and references supporting this larger format.

-- the new link protocol introduced in OTP 23.3 is now mandatory. The distribution flag DFLAG_UNLINK_ID is therefor now also mandatory.

Due to the above, OTP 26 nodes will refuse to connect to OTP nodes from releases prior to OTP 24.

OTP-18141
Application(s):
erts
Related Id(s):
OTP-18140 , PR-6073

Optimization of process aliases made possible now that support for version 4 node container types in the external term format is mandatory.

OTP-18185
Application(s):
compiler, erts
Related Id(s):
GH-6139

*** HIGHLIGHT ***

The compiler and JIT now generate better code for creation of small maps where all keys are literals known at compile time.

OTP-18227
Application(s):
erts
Related Id(s):
PR-6254

When erl -eval fails to execute a command, an error description is printed to standard_error.

OTP-18334
Application(s):
erts
Related Id(s):
PR-6434

*** HIGHLIGHT ***

Support for UTF-8 atoms and strings in the NIF interface including new functions enif_make_new_atom, enif_make_new_atom_len and enif_get_string_length.

OTP-18344
Application(s):
erts, kernel
Related Id(s):
GH-6461 , OTP-18324 , PR-6481 , PR-6522 , PR-6944

*** POTENTIAL INCOMPATIBILITY ***

The following inet:setopts/2 options have been introduced:

-- reuseport -- Reuse of local port. Load balancing may or may not be provided depending on underlying OS.

-- reuseport_lb -- Reuse of local port. Load balancing provided.

-- exclusiveaddruse -- Exclusive address/port usage on Windows. This socket option is Windows specific and will silently be ignored on other systems.

The behavior of setting reuseaddr on Windows have changed in a *backwards incompatible* way. The underlying SO_REUSEADDR socket option is now only set if both the reusaddr and the reuseport inet options have been set. This since the underlying SO_REUSEADDR socket option on Windows behaves similar to how BSD behaves if both the underlying socket options SO_REUSEADDR and SO_REUSEPORT have been set. See the documentation of the reuseaddr option for more information.

OTP-18360
Application(s):
erts
Related Id(s):
PR-6497

erlang:display/1 will now print large maps in a more readable way (similar to how small maps are printed).

OTP-18367
Application(s):
compiler, erts, stdlib
Related Id(s):
GH-6544

*** HIGHLIGHT ***

The BIFs min/2 and max/2 are now allowed to be used in guards and match specs.

OTP-18369
Application(s):
erts

Fail enif_init_resource_type and friends by returning NULL if not called during load/upgrade. Old behavior was undefined.

OTP-18410
Application(s):
erts
Related Id(s):
GH-5889 , PR-6345

New option include_shared_binaries for the max_heap_size process limit. If set to true, large binaries (> 64 bytes), which may be referred by several processes, are included in the memory sum compared against the max_heap_size limit.

OTP-18413
Application(s):
compiler, erts, stdlib, syntax_tools, tools
Related Id(s):
EEP-58 , PR-6727

*** HIGHLIGHT ***

Map comprehensions as suggested in EEP 58 has now been implemented.

OTP-18414
Application(s):
erts, stdlib
Related Id(s):
PR-6151

*** HIGHLIGHT ***

Some map operations have been optimized by changing the internal sort order of atom keys. This changes the (undocumented) order of how atom keys in small maps are printed and returned by maps:to_list/1 and maps:next/1. The new order is unpredictable and may change between different invocations of the Erlang VM.

For applications where order is important, there is a new function maps:iterator/2 for creating iterators that return the map elements in a deterministic order. There are also new modifiers k and K for the format string for io:format() to support printing map elements ordered.

OTP-18424
Application(s):
erts
Related Id(s):
PR-6716

Reduced memory usage of file:read_file_info/1,2

OTP-18425
Application(s):
erts
Related Id(s):
GH-5333 , PR-6628

Add new function current_stacktrace for trace match specifications used by erlang:trace_pattern/3.

This new option puts the current stacktrace of the caller into the trace message sent to the trace receiver.

OTP-18435
Application(s):
erts
Related Id(s):
PR-6827

*** HIGHLIGHT ***

The amount of significant bits in node local process identifiers and port identifiers has been extended from 28 bits to 60 bits on 64-bit runtime systems. This makes these identifiers large enough to in practice never having to be reused during the life time of a node.

OTP-18440
Application(s):
erts
Related Id(s):
PR-6351

*** HIGHLIGHT ***

New trace feature call_memory. Similar to call_time tracing, but instead of measure accumulated time in traced functions it measures accumulated heap space consumed by traced functions. It can be used to compare how much different functions are contributing to garbage collection being triggered.

OTP-18445
Application(s):
erts, stdlib

*** HIGHLIGHT ***

It is no longer necessary to enable a feature in the runtime system in order to load modules that are using it. It is sufficient to enable the feature in the compiler when compiling it.

That means that to use feature maybe_expr in Erlang/OTP 26, it is sufficient to enable it during compilation.

In Erlang/OTP 27, feature maybe_expr will be enabled by default, but it will be possible to disable it.

OTP-18447
Application(s):
asn1, crypto, erts, kernel, public_key, runtime_tools

Handling of on_load modules during boot has been improved by adding an extra step in the boot order for embedded mode that runs all on_load handlers, instead of relying on explicit invocation of them, later, when the kernel supervision tree starts.

This is mostly a code improvement and OTP internal simplification to avoid future bugs and to simplify code maintenance.

OTP-18477
Application(s):
erts
Related Id(s):
PR-7006

Introduced the local option of term_to_binary/2 and term_to_iovec/2.

OTP-18483
Application(s):
erts
Related Id(s):
PR-6888

Document the commonly used practice to create and store static atoms at NIF load time in callbacks load or upgrade.

OTP-18493
Application(s):
erts
Related Id(s):
PR-6272

Optimize ets:lookup_element for uncompressed tables by using a more efficient method to copy the term from ETS to the heap of the calling process.

OTP-18505
Application(s):
erts
Related Id(s):
PR-6991

*** POTENTIAL INCOMPATIBILITY ***

The default encoding of atoms by term_to_binary and term_to_iovec have changed from Latin1 to UTF-8. The old encoding can still be obtained with options {minor_version, 1}.

Apart from encoding code points between 128 and 255 with two bytes (UTF-8) instead of one, most atoms will occupy one less byte as the length field use only one byte instead of two if possible.

OTP-18517
Application(s):
erts

The version of zlib included in the Erlang/OTP source code is now 1.2.13.

OTP-18520
Application(s):
erts
Related Id(s):
GH-6455

gen_tcp:send/*, gen_udp:send/* and gen_sctp:send/* have been optimized to use the infamous receive reference optimization, so now sending should not have bad performance when the calling process has a large message queue.

OTP-18522
Application(s):
dialyzer, erts, stdlib

*** HIGHLIGHT ***

Added the new built-in type dynamic() introduced in EEP-61, improving support for gradual type checkers.

OTP-18523
Application(s):
erts
Related Id(s):
PR-7004

Optimize maps:merge/2 memory consumption for small maps (<33 keys) by reusing key tuples or entire maps if the result map has the same number of keys as any of the argument maps.

OTP-18524
Application(s):
erts
Related Id(s):
OTP-18523 , PR-7004

Optimize maps:merge/2 memory consumption further for small maps by mutating 2nd map to use literal key tuple of 1st map if both have the same keys.

OTP-18526
Application(s):
erts
Related Id(s):
GH-7045

ceil/1, floor/1, is_bitstring/1, is_boolean/1, is_function/2, and tuple_size/1 can now be used in match specifications.

OTP-18540
Application(s):
erts, kernel
Related Id(s):
PR-6900

Allow IPv6 addresses as host in http packets decoded by erlang:decode_packet/3 and gen_tcp packet option. The IPv6 address should be enclosed within [] according to RFC2732.

OTP-18549
Application(s):
erts, runtime_tools
Related Id(s):
PR-7105

*** POTENTIAL INCOMPATIBILITY ***

Removed the experimental erts_alloc_config module. It no longer produced good configurations and cannot be fixed in a reasonably backwards compatible manner. It has since OTP 25 been deprecated and scheduled for removal in OTP 26.

OTP-18552
Application(s):
erts
Related Id(s):
PR-6973

*** POTENTIAL INCOMPATIBILITY ***

ERTS internal thread names have been changed. All threads created by ERTS now have a prefix erts_ followed by a type name potentially followed by an integer index. For example, normal schedulers are now named erts_sched_<IX>, dirty CPU schedulers erts_dcpus_<IX>, and dirty IO schedulers erts_dios_<IX>. NIF and driver thread names are truncated at 15 characters regardless of whether the underlying platform support more characters or not.

OTP-18569
Application(s):
erts

Further robustify implementation of large maps (> 32 keys). Keys that happen to have same internal 32-bit hash values are now put in collision nodes which are traversed with linear search. This removes the demand for the internal hash function when salted to eventually produce different hashes for all possible pairs of unequal terms.

OTP-18574
Application(s):
compiler, erts

In Erlang/OTP 27, 0.0 will no longer be considered to be exactly equal to -0.0. See Upcoming Potential Incompatibilities.

Full runtime dependencies of erts-14.0: kernel-9.0, sasl-3.3, stdlib-4.1

et-1.7 #

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

Full runtime dependencies of et-1.7: erts-9.0, kernel-5.3, runtime_tools-1.10, stdlib-3.4, wx-1.2

ftp-1.2 #

OTP-18359
Application(s):
ftp
Related Id(s):
PR-6545

Fixes the documentation for the ftp module and updates the typing of ftp functions that return errors.

The documentation has been improved and the types of the functions are now read from source code, instead of being hard-coded in XML.

Functions returning errors of the form {error, Reason :: 'ehost' | ...} are now similar to other modules, i.e., {error, Reason :: term()}. If one wants to understand the error, one must call the function ftp:formaterror({error, Reason}).

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

OTP-18541
Application(s):
ftp

Remove deprecated functions in OTP-26

Full runtime dependencies of ftp-1.2: erts-7.0, kernel-6.0, runtime_tools-1.15.1, ssl-10.2, stdlib-3.5

inets-9.0 #

OTP-18476
Application(s):
inets
Related Id(s):
GH-6380

Correct timing related pipelining/keepalive queue bug, that could result in unexpected "socket_remotly_closed" errors.

OTP-18167
Application(s):
inets

By default ssl connections will use options from ssl_default_options(true)

OTP-18350
Application(s):
inets, observer, os_mon, reltool, wx

Runtime dependencies have been updated.

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

OTP-18490
Application(s):
diameter, inets, mnesia, reltool, snmp, ssh, tftp, wx
Related Id(s):
GH-6339 , OTP-18471 , PR-6843

*** POTENTIAL INCOMPATIBILITY ***

The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

OTP-18530
Application(s):
inets

*** POTENTIAL INCOMPATIBILITY ***

IP display string will now always be in lower case, effects ipv6 addresses.

OTP-18536
Application(s):
inets

*** POTENTIAL INCOMPATIBILITY ***

Removed deprecated functions

OTP-18544
Application(s):
inets
Related Id(s):
GH-5276

Update the code in the inets example directory to reflect the latest implementation

Full runtime dependencies of inets-9.0: 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-5.0

jinterface-1.14 #

OTP-18140
Application(s):
erl_interface, erts, jinterface, kernel
Related Id(s):
PR-6072

*** POTENTIAL INCOMPATIBILITY ***

As announced since the release of OTP 24, support for:

-- version 4 node container types in the external term format are now mandatory. That is, references supporting up to 5 32-bit integer identifiers, and process and port identifiers with support for 64-bit data storage. The distribution flag DFLAG_V4_NC is therefor now also mandatory. OTP has since OTP 24 supported this. Also note that the external format produced by term_to_binary() and term_to_iovec() will unconditionally produce pids, ports, and references supporting this larger format.

-- the new link protocol introduced in OTP 23.3 is now mandatory. The distribution flag DFLAG_UNLINK_ID is therefor now also mandatory.

Due to the above, OTP 26 nodes will refuse to connect to OTP nodes from releases prior to OTP 24.

kernel-9.0 #

OTP-18210
Application(s):
kernel
Related Id(s):
GH-5877 , PR-5878

*** POTENTIAL INCOMPATIBILITY ***

Fixed a bug where duplicate keys were allowed in the .app file of an application. Duplicate keys are now rejected and the application will not start if they exist.

OTP-18225
Application(s):
kernel
Related Id(s):
PR-6036

Fix inconsistent handling in logger_formatter of the branched values in conditional branches. For example using msg in a conditional branch would not be formatted as it should before this fix.

OTP-18226
Application(s):
kernel
Related Id(s):
PR-6253

Fix the logger_std_h handler to log to standard_error if logging to standard_io fails for any reason.

OTP-18248
Application(s):
erts, kernel
Related Id(s):
GH-6085 , PR-6227

Fix the TLS distribution to work when starting Erlang in embedded mode and a connection is done before kernel is fully started.

OTP-18271
Application(s):
erts, kernel
Related Id(s):
PR-6279

erl -remsh has been improved to provide better error reasons and work when using a shell without terminal support (that is an "oldshell").

OTP-18286
Application(s):
kernel
Related Id(s):
PR-5955

Fix logging of log events generated before kernel is started to not fail if the code for formatting those log messaged have not yet been loaded.

OTP-18471
Application(s):
kernel, stdlib
Related Id(s):
GH-6339 , PR-6843

*** POTENTIAL INCOMPATIBILITY ***

proc_lib:start*/* has become synchronous when the started process fails. This requires that a failing process use a new function proc_lib:init_fail/2,3, or exits, to indicate failure. All OTP behaviours have been fixed to do this.

All these start functions now consume the 'EXIT' message from a process link for all error returns. Previously it was only the start_link/* functions that did this, and only when the started function exited, not when it used init_ack/1,2 or init_fail/2,3 to create the return value.

OTP-18486
Application(s):
kernel, stdlib
Related Id(s):
PR-6881

Fixed a bug where file:read(standard_io, ...) unexpectedly returned eof in binary mode.

OTP-18528
Application(s):
kernel
Related Id(s):
PR-7009

Return type for seq_trace:get_token/1 fixed.

OTP-18543
Application(s):
kernel
Related Id(s):
GH-6353

Looking up, connecting to and sending to a host with an empty name is now handled by trying to look up the address of the root domain, which fails. Previously some of these operations caused an internal exception, which contradicted type specifications.

OTP-18547
Application(s):
kernel
Related Id(s):
PR-7092

Replaced a regex with a special case handling of ANSI Select Graphic Rendition escape characters, to speed up io output that make use of these escape sequences.

OTP-14835
Application(s):
kernel, stdlib
Related Id(s):
PR-5924

*** HIGHLIGHT ***

The Erlang shell has been improved to support the following features:

-- Auto-complete variables, record names, record field names, map keys, function parameter types and filenames.

-- Open external editor in the shell (with C-o) to edit the current expression in an editor.

-- Support defining records (with types), functions and function typespecs, and custom types in the shell.

-- Do not save pager commands, and input to io:getline in history.

OTP-17932
Application(s):
erts, kernel, stdlib
Related Id(s):
GH-3150 , GH-3390 , GH-4225 , GH-4343 , PR-6144

*** HIGHLIGHT ***

*** POTENTIAL INCOMPATIBILITY ***

The TTY/terminal subsystem has been rewritten by moving more code to Erlang from the old linked-in driver and implementing all the I/O primitives needed in a NIF instead.

On Unix platforms the user should not notice a lot of difference, besides better handling of unicode characters and fixing of some long standing bugs.

Windows users will notice that erl.exe has the same functionality as a normal Unix shell and that werl.exe has been removed and replaced with a symlink to erl.exe. This makes the Windows Erlang terminal experience identical to that of Unix.

The re-write brings with it a number of bug fixes and feature additions:

-- The TTY is now reset when Erlang exits, fixing zsh to not break when terminating an Erlang session.

-- standard_error now uses the same unicode mode as standard_io.

-- Hitting backspace when searching the shell history with an empty search string no longer breaks the shell.

-- Tab expansion now works on remote nodes started using the JCL interface.

-- It is now possible to configure the shell slogan and the session slogans (that is the texts that appear when you start an Erlang shell). See the kernel documentation for more details.

-- Added shell:start_interactive for starting the interactive shell from a non-interactive Erlang session (for example an escript).

-- On Windows, when starting in detached mode the standard handler are now set to nul devices instead of being unset.

-- Standard I/O now always defaults to unicode mode if supported. Previously the default was latin1 if the runtime system had been started with -oldshell or -noshell (for example in an escript). To send raw bytes over standard out, one now explicitly has to specify io:setopts(standard_io, [{encoding, latin1}]).

OTP-18029
Application(s):
erts, kernel

*** HIGHLIGHT ***

Add support for socket on Windows.

-- Pre release status.

-- Error codes not finalized.

-- No explicit support for Windows specific options (socket options, flags for read and write).

-- New async api for Windows (completion). See the Asynchronous calls chapter in the (Socket Usage) Users Guide.

-- To ensure platform independence, gen_tcp and gen_udp is *intended* to be used (not yet updated).

OTP-18140
Application(s):
erl_interface, erts, jinterface, kernel
Related Id(s):
PR-6072

*** POTENTIAL INCOMPATIBILITY ***

As announced since the release of OTP 24, support for:

-- version 4 node container types in the external term format are now mandatory. That is, references supporting up to 5 32-bit integer identifiers, and process and port identifiers with support for 64-bit data storage. The distribution flag DFLAG_V4_NC is therefor now also mandatory. OTP has since OTP 24 supported this. Also note that the external format produced by term_to_binary() and term_to_iovec() will unconditionally produce pids, ports, and references supporting this larger format.

-- the new link protocol introduced in OTP 23.3 is now mandatory. The distribution flag DFLAG_UNLINK_ID is therefor now also mandatory.

Due to the above, OTP 26 nodes will refuse to connect to OTP nodes from releases prior to OTP 24.

OTP-18235
Application(s):
kernel, ssl
Related Id(s):
PR-5840 , PR-6104

*** HIGHLIGHT ***

Support for Kernel TLS (kTLS), has been added to the SSL application, for TLS distribution (-proto_dist inet_tls), the SSL option {ktls, true}. Using this for general SSL sockets is uncomfortable, undocumented and not recommended since it requires very platform dependent raw options.

This, for now, only works for some not too old Linux distributions. Roughly, a kernel 5.2.0 or later with support for UserLand Protocols and the kernel module tls is required.

OTP-18261
Application(s):
kernel
Related Id(s):
PR-5924

Add code:get_doc/2 which adds support to fetch documentation skeletons of functions using debug_info chunks instead of eep48 doc chunks.

OTP-18278
Application(s):
kernel, stdlib
Related Id(s):
PR-6260

*** HIGHLIGHT ***

The Erlang shell's auto-completion when typing tab has been changed to happen after the editing current line instead of before it.

This behaviour can be configured using a the shell_expand_location STDLIB configuration parameter.

OTP-18285
Application(s):
kernel, ssh, stdlib
Related Id(s):
PR-6262

*** POTENTIAL INCOMPATIBILITY ***

Typing Ctrl+L in a shell now clears the screen and redraws the current line instead of only redrawing the current line. To only redraw the current line, you must now type Alt+L. This brings the behaviour of Ctrl+L closer to how bash and other shells work.

OTP-18305
Application(s):
kernel
Related Id(s):
PR-5831

gen_server optimized by caching callback functions

OTP-18327
Application(s):
kernel
Related Id(s):
PR-6433

Prepare the pg communication protocol for upgrade. The plan is for OTP-28 nodes to be able to use an upgraded pg protocol while still being able to talk with OTP 26 nodes.

OTP-18331
Application(s):
kernel
Related Id(s):
ERIERL-870

New disk_log log type rotate, where the log files are compressed upon rotation.

OTP-18344
Application(s):
erts, kernel
Related Id(s):
GH-6461 , OTP-18324 , PR-6481 , PR-6522 , PR-6944

*** POTENTIAL INCOMPATIBILITY ***

The following inet:setopts/2 options have been introduced:

-- reuseport -- Reuse of local port. Load balancing may or may not be provided depending on underlying OS.

-- reuseport_lb -- Reuse of local port. Load balancing provided.

-- exclusiveaddruse -- Exclusive address/port usage on Windows. This socket option is Windows specific and will silently be ignored on other systems.

The behavior of setting reuseaddr on Windows have changed in a *backwards incompatible* way. The underlying SO_REUSEADDR socket option is now only set if both the reusaddr and the reuseport inet options have been set. This since the underlying SO_REUSEADDR socket option on Windows behaves similar to how BSD behaves if both the underlying socket options SO_REUSEADDR and SO_REUSEPORT have been set. See the documentation of the reuseaddr option for more information.

OTP-18405
Application(s):
crypto, diameter, kernel, ssl
Related Id(s):
GH-6672 , PR-6700 , PR-6702 , PR-6768 , PR-6769 , PR-6812 , PR-6814

Replace size/1 with either tuple_size/1 or byte_size/1

The size/1 BIF is not optimized by the JIT, and its use can result in worse types for Dialyzer.

When one knows that the value being tested must be a tuple, tuple_size/1 should always be preferred.

When one knows that the value being tested must be a binary, byte_size/1 should be preferred. However, byte_size/1 also accepts a bitstring (rounding up size to a whole number of bytes), so one must make sure that the call to byte_size/ is preceded by a call to is_binary/1 to ensure that bitstrings are rejected. Note that the compiler removes redundant calls to is_binary/1, so if one is not sure whether previous code had made sure that the argument is a binary, it does not harm to add an is_binary/1 test immediately before the call to byte_size/1.

OTP-18419
Application(s):
kernel

The function file:pid2name/1 is deprecated and will be removed in Erlang/OTP 27.

OTP-18442
Application(s):
kernel
Related Id(s):
GH-6606 , PR-6786

The modules Erlang DNS resolver inet_res and helper modules have been updated for RFC6891; to handle OPT RR with DNSSEC OK (DO) bit.

OTP-18444
Application(s):
kernel
Related Id(s):
PR-6035

Introduced application:get_supervisor/1.

OTP-18447
Application(s):
asn1, crypto, erts, kernel, public_key, runtime_tools

Handling of on_load modules during boot has been improved by adding an extra step in the boot order for embedded mode that runs all on_load handlers, instead of relying on explicit invocation of them, later, when the kernel supervision tree starts.

This is mostly a code improvement and OTP internal simplification to avoid future bugs and to simplify code maintenance.

OTP-18448
Application(s):
kernel
Related Id(s):
PR-6736

Reduce contention on the code_server by doing the code preparation on the client.

OTP-18451
Application(s):
kernel
Related Id(s):
PR-6737

Added a mode to ensure_all_loaded, to start children application and their dependencies concurrently.

OTP-18452
Application(s):
kernel
Related Id(s):
PR-6729

Cache OTP boot code paths, to limit how many folders that are being accessed during a module lookup. Can be disabled with -cache_boot_path false. OTP boot code paths consists of ERL_LIB environment variables. The various otp/*/ebin folders. And the {path, ...} clauses in the init script.

OTP-18456
Application(s):
kernel, ssl

Erlang distribution code in Kernel and SSL has been refactored a bit to facilitate debugging and re-usability, which shouldn't have any noticeable effects on behaviour or performance.

OTP-18466
Application(s):
kernel
Related Id(s):
PR-6832

Add cache attribute to code path apis.

Added an optional cache/nocache argument to all code:add_path*, code:set_path*, and code:replace_path* functions. These functions will then avoid doing file-accesses if they are cached. Cache can be cleared with code:clear_cache/0. Added code:del_paths/1 to make it easier to clear multiple paths.

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

OTP-18484
Application(s):
kernel
Related Id(s):
PR-6844

Improvements to code:ensure_modules_loaded/1: Previously it would prepare modules and then abandon references to said modules if they had on_load callbacks. This pull request makes it so they keep the references around and then serially load them without having to fetch the object code and prepare them again.

OTP-18510
Application(s):
kernel
Related Id(s):
GH-6098 , PR-6982

The internal DNS resolver has been updated to handle DNS LOC RR:s (RFC 1876). This is an undocumented module, although still used by power users. See the source code.

OTP-18521
Application(s):
kernel
Related Id(s):
PR-7025

Reduced memory consumption in global when informing other nodes about lost connections.

OTP-18533
Application(s):
kernel
Related Id(s):
PR-7061

The net_kernel, global, and global_group servers now have fully asynchronous distributed signaling enabled all the time which prevents them from ever getting blocked on send of distributed signals.

Documentation about blocking distributed signals has also been improved.

OTP-18540
Application(s):
erts, kernel
Related Id(s):
PR-6900

Allow IPv6 addresses as host in http packets decoded by erlang:decode_packet/3 and gen_tcp packet option. The IPv6 address should be enclosed within [] according to RFC2732.

OTP-18542
Application(s):
kernel

Remove deprecated functions in OTP-26

OTP-18551
Application(s):
kernel
Related Id(s):
PR-7106

*** POTENTIAL INCOMPATIBILITY ***

Removed code:is_module_native/1 since HiPE has been removed. It has since OTP 24 been deprecated and scheduled for removal in OTP 26.

Removed code:rehash/0 since the code path feature no longer is present. It has since OTP 19 been deprecated and has since OTP 24 been scheduled for removal in OTP 26.

OTP-18575
Application(s):
kernel, stdlib
Related Id(s):
PR-7169

Added support for multiple line expressions and navigation in the shell. Added new keybindings:

-- navigate up (ctrl+up)/(alt+up)

-- navigate down (ctrl+down)/(alt+down)

-- insert newline in middle of line (alt+enter)

-- navigate top (alt+<)/(alt+shift+up)

-- navigate bottom (alt+>)/(alt+shift+down)

-- clear current expression (alt+c)

-- cancel search (alt+c)

-- opening editor on mac (option+o)/(alt+o)

Modifies the prompt for new lines to make it clearer that the prompt has entered multi-line mode. Supports terminal with small window size, recommend not go lower than 7 rows and 40 columns. Modifies the search prompt to support multi-line statements. Redraw the prompt after continuing from JCL menu.

Full runtime dependencies of kernel-9.0: crypto-5.0, erts-14.0, sasl-3.0, stdlib-5.0

megaco-4.4.4 #

OTP-18538
Application(s):
megaco, otp
Related Id(s):
GH-7031 , PR-7078

Removed configure option --enable-sanitizers. It was untested and broken. Address sanitizer for the emulator has better support by the asan build target.

Full runtime dependencies of megaco-4.4.4: 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.22 #

OTP-18309
Application(s):
mnesia
Related Id(s):
PR-6377

Added debug statistics for active transactions.

OTP-18490
Application(s):
diameter, inets, mnesia, reltool, snmp, ssh, tftp, wx
Related Id(s):
GH-6339 , OTP-18471 , PR-6843

*** POTENTIAL INCOMPATIBILITY ***

The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

Full runtime dependencies of mnesia-4.22: erts-9.0, kernel-5.3, stdlib-5.0

observer-2.15 #

OTP-18350
Application(s):
inets, observer, os_mon, reltool, wx

Runtime dependencies have been updated.

OTP-18430
Application(s):
observer
Related Id(s):
PR-6397

Added start/1, start_and_wait functions/1|2 functions.

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

Full runtime dependencies of observer-2.15: erts-14.0, et-1.5, kernel-9.0, runtime_tools-1.19, stdlib-5.0, wx-2.3

odbc-2.14.1 #

OTP-18539
Application(s):
odbc

Allow larger column sizes than 8001 in case DB supports it.

Full runtime dependencies of odbc-2.14.1: erts-6.0, kernel-3.0, stdlib-2.0

os_mon-2.9 #

OTP-18246
Application(s):
os_mon
Related Id(s):
GH-6156 , PR-6284

Fix internal os_mon_sysinfo:get_disk_info/1 function to not crash when run on Windows with multiple drives.

OTP-18546
Application(s):
os_mon
Related Id(s):
GH-7070 , PR-7071

Fixed a memory leak when calling cpu_sup:util/0,1 on FreeBSD.

OTP-18303
Application(s):
os_mon
Related Id(s):
PR-6384

The disksup:get_disk_info/0 and disksup:get_disk_info/1 functions have been introduced. These can be used in order to immediately fetch information about current disk usage.

OTP-18350
Application(s):
inets, observer, os_mon, reltool, wx

Runtime dependencies have been updated.

OTP-18566
Application(s):
os_mon
Related Id(s):
PR-7080

Support for cpu_sup:util() on OpenBSD.

Full runtime dependencies of os_mon-2.9: erts-14.0, kernel-9.0, sasl-4.2.1, stdlib-5.0

parsetools-2.5 #

OTP-18491
Application(s):
parsetools
Related Id(s):
PR-6882

*** HIGHLIGHT ***

Leex has been extended with optional column number support.

Full runtime dependencies of parsetools-2.5: erts-6.0, kernel-3.0, stdlib-3.4

public_key-1.14 #

OTP-18447
Application(s):
asn1, crypto, erts, kernel, public_key, runtime_tools

Handling of on_load modules during boot has been improved by adding an extra step in the boot order for embedded mode that runs all on_load handlers, instead of relying on explicit invocation of them, later, when the kernel supervision tree starts.

This is mostly a code improvement and OTP internal simplification to avoid future bugs and to simplify code maintenance.

Full runtime dependencies of public_key-1.14: asn1-3.0, crypto-4.6, erts-6.0, kernel-3.0, stdlib-3.5

reltool-1.0 #

OTP-18230
Application(s):
reltool
Related Id(s):
PR-5936

Add possibility to strip specific chunks from beam files included in a release. Before this change it was only possible to strip all chunks from the beam files.

OTP-18350
Application(s):
inets, observer, os_mon, reltool, wx

Runtime dependencies have been updated.

OTP-18488
Application(s):
reltool
Related Id(s):
PR-6836

*** POTENTIAL INCOMPATIBILITY ***

Support for the experimental code archives feature has been removed from reltool.

OTP-18490
Application(s):
diameter, inets, mnesia, reltool, snmp, ssh, tftp, wx
Related Id(s):
GH-6339 , OTP-18471 , PR-6843

*** POTENTIAL INCOMPATIBILITY ***

The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

Full runtime dependencies of reltool-1.0: erts-14.0, kernel-9.0, sasl-4.2.1, stdlib-5.0, stdlib-5.0, tools-2.6.14, wx-2.3

runtime_tools-2.0 #

OTP-18499
Application(s):
runtime_tools
Related Id(s):
PR-6946

Fixed the type specification for instrument:carriers/0,1

OTP-18211
Application(s):
runtime_tools
Related Id(s):
PR-6143

Add dbg:tracer(file, Filename) as a convenient way to trace to a file in clean text.

OTP-18447
Application(s):
asn1, crypto, erts, kernel, public_key, runtime_tools

Handling of on_load modules during boot has been improved by adding an extra step in the boot order for embedded mode that runs all on_load handlers, instead of relying on explicit invocation of them, later, when the kernel supervision tree starts.

This is mostly a code improvement and OTP internal simplification to avoid future bugs and to simplify code maintenance.

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

OTP-18487
Application(s):
runtime_tools, tools
Related Id(s):
PR-6829

The instrument module has been moved from tools to runtime_tools.

OTP-18549
Application(s):
erts, runtime_tools
Related Id(s):
PR-7105

*** POTENTIAL INCOMPATIBILITY ***

Removed the experimental erts_alloc_config module. It no longer produced good configurations and cannot be fixed in a reasonably backwards compatible manner. It has since OTP 25 been deprecated and scheduled for removal in OTP 26.

Full runtime dependencies of runtime_tools-2.0: erts-11.0, kernel-8.1, mnesia-4.12, stdlib-3.13

sasl-4.2.1 #

OTP-18300
Application(s):
sasl
Related Id(s):
PR-6389

Improved error message from systools:make_script, when .app parameters contain duplicates. The parameters that will be checked are modules, applications and registered.

Full runtime dependencies of sasl-4.2.1: erts-10.2, kernel-6.0, stdlib-4.0, tools-2.6.14

snmp-5.14 #

OTP-18490
Application(s):
diameter, inets, mnesia, reltool, snmp, ssh, tftp, wx
Related Id(s):
GH-6339 , OTP-18471 , PR-6843

*** POTENTIAL INCOMPATIBILITY ***

The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

Full runtime dependencies of snmp-5.14: crypto-4.6, erts-12.0, kernel-8.0, mnesia-4.12, runtime_tools-1.8.14, stdlib-5.0

ssh-5.0 #

OTP-18231
Application(s):
ssh
Related Id(s):
OTP-17932 , PR-6144

The ssh_cli has been updated to work with the changes introduced in the new Erlang shell implementation.

OTP-18285
Application(s):
kernel, ssh, stdlib
Related Id(s):
PR-6262

*** POTENTIAL INCOMPATIBILITY ***

Typing Ctrl+L in a shell now clears the screen and redraws the current line instead of only redrawing the current line. To only redraw the current line, you must now type Alt+L. This brings the behaviour of Ctrl+L closer to how bash and other shells work.

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

OTP-18490
Application(s):
diameter, inets, mnesia, reltool, snmp, ssh, tftp, wx
Related Id(s):
GH-6339 , OTP-18471 , PR-6843

*** POTENTIAL INCOMPATIBILITY ***

The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

Full runtime dependencies of ssh-5.0: crypto-5.0, erts-14.0, kernel-9.0, public_key-1.6.1, runtime_tools-1.15.1, stdlib-5.0, stdlib-5.0

ssl-11.0 #

OTP-14771
Application(s):
ssl

*** POTENTIAL INCOMPATIBILITY ***

Remove less that 256 bit ECC from default supported ECC pre TLS-1.3

OTP-15903
Application(s):
ssl

*** HIGHLIGHT ***

Improved error checking and handling of ssl options.

OTP-18168
Application(s):
ssl
Related Id(s):
GH-6014 , PR-6019

*** POTENTIAL INCOMPATIBILITY ***

With this change, stateless tickets generated by server with anti_replay option enabled can be used for creating ClientHello throughout ticket lifetime. Without this change, usability was limited to WindowSize number of seconds configured for anti_replay option.

OTP-18235
Application(s):
kernel, ssl
Related Id(s):
PR-5840 , PR-6104

*** HIGHLIGHT ***

Support for Kernel TLS (kTLS), has been added to the SSL application, for TLS distribution (-proto_dist inet_tls), the SSL option {ktls, true}. Using this for general SSL sockets is uncomfortable, undocumented and not recommended since it requires very platform dependent raw options.

This, for now, only works for some not too old Linux distributions. Roughly, a kernel 5.2.0 or later with support for UserLand Protocols and the kernel module tls is required.

OTP-18253
Application(s):
ssl

With this change, TLS 1.3 server can be configured to include client certificate in session ticket.

OTP-18254
Application(s):
ssl
Related Id(s):
PR-5982

With this change, it is possible to configure encryption seed to be used with TLS1.3 stateless tickets. This enables using tickets on different server instances.

OTP-18312
Application(s):
ssl

Debugging enhancements.

OTP-18335
Application(s):
ssl

With this change, maybe keyword atom is not used as function name in ssl code.

OTP-18405
Application(s):
crypto, diameter, kernel, ssl
Related Id(s):
GH-6672 , PR-6700 , PR-6702 , PR-6768 , PR-6769 , PR-6812 , PR-6814

Replace size/1 with either tuple_size/1 or byte_size/1

The size/1 BIF is not optimized by the JIT, and its use can result in worse types for Dialyzer.

When one knows that the value being tested must be a tuple, tuple_size/1 should always be preferred.

When one knows that the value being tested must be a binary, byte_size/1 should be preferred. However, byte_size/1 also accepts a bitstring (rounding up size to a whole number of bytes), so one must make sure that the call to byte_size/ is preceded by a call to is_binary/1 to ensure that bitstrings are rejected. Note that the compiler removes redundant calls to is_binary/1, so if one is not sure whether previous code had made sure that the argument is a binary, it does not harm to add an is_binary/1 test immediately before the call to byte_size/1.

OTP-18438
Application(s):
ssl
Related Id(s):
GH-6679

*** POTENTIAL INCOMPATIBILITY ***

For security reasons remove support for SHA1 and DSA algorithms from default values.

OTP-18453
Application(s):
ssl

Mitigate memory usage from large certificate chains by lowering the maximum handshake size. This should not effect the common cases, if needed it can be configured to a higher value.

OTP-18455
Application(s):
ssl
Related Id(s):
GH-5899

*** POTENTIAL INCOMPATIBILITY ***

Change the client default verify option to verify_peer. Note that this makes it mandatory to also supply trusted CA certificates or explicitly set verify to verify_none. This also applies when using the so called anonymous test cipher suites defined in TLS versions pre TLS-1.3.

OTP-18456
Application(s):
kernel, ssl

Erlang distribution code in Kernel and SSL has been refactored a bit to facilitate debugging and re-usability, which shouldn't have any noticeable effects on behaviour or performance.

OTP-18459
Application(s):
ssl

*** HIGHLIGHT ***

Add encoding and decoding of use_srtp hello extension to facilitate for DTLS users to implement SRTP functionality.

OTP-18465
Application(s):
ssl
Related Id(s):
GH-7065

Refactors the (ssl application to use macros for TLS and DTLS versions instead of hard-coded tuple numbers. This change improves the maintainability of ssl

OTP-18507
Application(s):
ssl

If the function ssl:renegotiate/1 is called on connection that is running TLS-1.3 return an error instead of hanging or timing out.

OTP-18531
Application(s):
ssl

*** POTENTIAL INCOMPATIBILITY ***

If a user cancel alert with level warning is received during handshake make it be handled the same regardless of TLS version. If it is received in connection in TLS-1.3 regard it as an error as it is inappropriate.

In TLS-1.3 all error alerts are considered FATAL regardless of legacy alert type. But make sure legacy type is printed in logs to not confuse users that are expecting the same legacy type as sent by peer.

OTP-18567
Application(s):
ssl

Make fail_if_no_peer_cert default true if verify_peer is set on the server, otherwise the server will accept the connection if verify_peer is set and the user have forgot to set the fail_if_no_peer_cert and the client did not send a certificate.

OTP-18572
Application(s):
ssl

To make it easier to configure signature algorithms with algorithms that are moved from the default add the API function signature_algs/2 that lists possible values. Also make sha224 a non default value.

Full runtime dependencies of ssl-11.0: crypto-5.0, erts-14.0, inets-5.10.7, kernel-9.0, public_key-1.11.3, runtime_tools-1.15.1, stdlib-4.1

stdlib-5.0 #

OTP-18275
Application(s):
stdlib
Related Id(s):
PR-6045

All process calls in dets have been updated to use the receive queue optimizations.

OTP-18471
Application(s):
kernel, stdlib
Related Id(s):
GH-6339 , PR-6843

*** POTENTIAL INCOMPATIBILITY ***

proc_lib:start*/* has become synchronous when the started process fails. This requires that a failing process use a new function proc_lib:init_fail/2,3, or exits, to indicate failure. All OTP behaviours have been fixed to do this.

All these start functions now consume the 'EXIT' message from a process link for all error returns. Previously it was only the start_link/* functions that did this, and only when the started function exited, not when it used init_ack/1,2 or init_fail/2,3 to create the return value.

OTP-18486
Application(s):
kernel, stdlib
Related Id(s):
PR-6881

Fixed a bug where file:read(standard_io, ...) unexpectedly returned eof in binary mode.

OTP-18548
Application(s):
stdlib
Related Id(s):
PR-6967

In the shell, v(N) would fail to retrieve the command if the command's return value was undefined.

OTP-14835
Application(s):
kernel, stdlib
Related Id(s):
PR-5924

*** HIGHLIGHT ***

The Erlang shell has been improved to support the following features:

-- Auto-complete variables, record names, record field names, map keys, function parameter types and filenames.

-- Open external editor in the shell (with C-o) to edit the current expression in an editor.

-- Support defining records (with types), functions and function typespecs, and custom types in the shell.

-- Do not save pager commands, and input to io:getline in history.

OTP-15597
Application(s):
stdlib
Related Id(s):
PR-5831

Gen_server now caches external functions for use in handle_call, handle_cast and handle_info.

OTP-17932
Application(s):
erts, kernel, stdlib
Related Id(s):
GH-3150 , GH-3390 , GH-4225 , GH-4343 , PR-6144

*** HIGHLIGHT ***

*** POTENTIAL INCOMPATIBILITY ***

The TTY/terminal subsystem has been rewritten by moving more code to Erlang from the old linked-in driver and implementing all the I/O primitives needed in a NIF instead.

On Unix platforms the user should not notice a lot of difference, besides better handling of unicode characters and fixing of some long standing bugs.

Windows users will notice that erl.exe has the same functionality as a normal Unix shell and that werl.exe has been removed and replaced with a symlink to erl.exe. This makes the Windows Erlang terminal experience identical to that of Unix.

The re-write brings with it a number of bug fixes and feature additions:

-- The TTY is now reset when Erlang exits, fixing zsh to not break when terminating an Erlang session.

-- standard_error now uses the same unicode mode as standard_io.

-- Hitting backspace when searching the shell history with an empty search string no longer breaks the shell.

-- Tab expansion now works on remote nodes started using the JCL interface.

-- It is now possible to configure the shell slogan and the session slogans (that is the texts that appear when you start an Erlang shell). See the kernel documentation for more details.

-- Added shell:start_interactive for starting the interactive shell from a non-interactive Erlang session (for example an escript).

-- On Windows, when starting in detached mode the standard handler are now set to nul devices instead of being unset.

-- Standard I/O now always defaults to unicode mode if supported. Previously the default was latin1 if the runtime system had been started with -oldshell or -noshell (for example in an escript). To send raw bytes over standard out, one now explicitly has to specify io:setopts(standard_io, [{encoding, latin1}]).

OTP-18159
Application(s):
stdlib
Related Id(s):
PR-6904

Added the zip:zip_get_crc32/2 function to retrieve the CRC32 checksum from an opened ZIP archive.

OTP-18176
Application(s):
stdlib
Related Id(s):
PR-6118

Added the options post_process_args and detached to the peer:start function.

OTP-18221
Application(s):
stdlib
Related Id(s):
PR-6197

The re:replace/3,4 functions now accept a fun as the replacement argument.

OTP-18228
Application(s):
stdlib
Related Id(s):
GH-5639

*** HIGHLIGHT ***

The performance of the base64 module has been significantly improved. For example, on an x86_64 system with the JIT both encode and decode are more than three times faster than in Erlang/OTP 25.

OTP-18236
Application(s):
stdlib
Related Id(s):
PR-6256

Improved implementation of timer:apply_interval/4 reducing load on the timer server, and introduction of the new function timer:apply_repeatedly/4. timer:apply_repeatedly/4 is similar to timer:apply_interval/4, but timer:apply_repeatedly/4 prevents parallel execution of triggered apply operations which timer:apply_interval/4 does not.

OTP-18247
Application(s):
stdlib
Related Id(s):
PR-6280 , PR-6711

The base64 module now supports encoding and decoding with an alternate URL safe alphabet, and an option for accepting or adding missing = padding characters.

OTP-18272
Application(s):
stdlib
Related Id(s):
PR-6279

Add shell:whereis/0 which can be used to locate the current shell process.

OTP-18278
Application(s):
kernel, stdlib
Related Id(s):
PR-6260

*** HIGHLIGHT ***

The Erlang shell's auto-completion when typing tab has been changed to happen after the editing current line instead of before it.

This behaviour can be configured using a the shell_expand_location STDLIB configuration parameter.

OTP-18279
Application(s):
stdlib
Related Id(s):
PR-6234

New function ets:lookup_element/4 with a Default argument returned if the key did not exist in the table. The old ets:lookup_element/3 raises a badarg exception which can be both inconvenient and slower.

OTP-18285
Application(s):
kernel, ssh, stdlib
Related Id(s):
PR-6262

*** POTENTIAL INCOMPATIBILITY ***

Typing Ctrl+L in a shell now clears the screen and redraws the current line instead of only redrawing the current line. To only redraw the current line, you must now type Alt+L. This brings the behaviour of Ctrl+L closer to how bash and other shells work.

OTP-18287
Application(s):
stdlib
Related Id(s):
PR-5955

peer nodes using standard_io connections now include standard error from the node in the io stream from the started node.

OTP-18297
Application(s):
compiler, stdlib
Related Id(s):
GH-6348

*** HIGHLIGHT ***

A limitation in the binary syntax has been removed. It is now possible to match binary patterns in parallel. Example: <<A:8>> = <<B:4,C:4>> = Bin

OTP-18301
Application(s):
stdlib
Related Id(s):
PR-6350

Improve type specification of unicode:characters_to_list().

OTP-18318
Application(s):
stdlib
Related Id(s):
PR-6347

*** HIGHLIGHT ***

In the lists module, the zip family of functions now takes options to allow handling lists of different lengths.

OTP-18337
Application(s):
compiler, stdlib
Related Id(s):
GH-6477 , PR-6503

It is documented that $\^X is the ASCII code for Control X, where X is an uppercase or lowercase letter. However, this notation would work for any character X, even then it didn't make sense.

In Erlang/OTP 26, it is now documented that the following characters are also allowed to follow the \^ characters: @, [, \, ], ^, _, and ?. Attempt to use other characters will be rejected with a compiler error.

The value for $\^? is now 127 (instead of 31 as in earlier releases).

OTP-18354
Application(s):
stdlib
Related Id(s):
PR-6297

The binary:encode_hex/2 function has been added to allow the encoded hexadecimal digits to be in either lower or upper case.

OTP-18355
Application(s):
stdlib
Related Id(s):
PR-6507

Variants of timer:tc() with user specified time unit have been introduced.

OTP-18361
Application(s):
stdlib
Related Id(s):
PR-6536

New function math:tau/0. Returns 2*math:pi().

OTP-18367
Application(s):
compiler, erts, stdlib
Related Id(s):
GH-6544

*** HIGHLIGHT ***

The BIFs min/2 and max/2 are now allowed to be used in guards and match specs.

OTP-18385
Application(s):
stdlib
Related Id(s):
PR-6698

Optimized gen_server:multi_call().

OTP-18413
Application(s):
compiler, erts, stdlib, syntax_tools, tools
Related Id(s):
EEP-58 , PR-6727

*** HIGHLIGHT ***

Map comprehensions as suggested in EEP 58 has now been implemented.

OTP-18414
Application(s):
erts, stdlib
Related Id(s):
PR-6151

*** HIGHLIGHT ***

Some map operations have been optimized by changing the internal sort order of atom keys. This changes the (undocumented) order of how atom keys in small maps are printed and returned by maps:to_list/1 and maps:next/1. The new order is unpredictable and may change between different invocations of the Erlang VM.

For applications where order is important, there is a new function maps:iterator/2 for creating iterators that return the map elements in a deterministic order. There are also new modifiers k and K for the format string for io:format() to support printing map elements ordered.

OTP-18423
Application(s):
stdlib
Related Id(s):
com/erlang/backlog/issues/142 , https://github

Make gen_server fail "silently" with a new return value for init/1.

OTP-18431
Application(s):
compiler, stdlib
Related Id(s):
PR-6739

*** HIGHLIGHT ***

Improved the selective receive optimization, which can now be enabled for references returned from other functions.

This greatly improves the performance of gen_server:send_request/3, gen_server:wait_response/2, and similar functions.

OTP-18445
Application(s):
erts, stdlib

*** HIGHLIGHT ***

It is no longer necessary to enable a feature in the runtime system in order to load modules that are using it. It is sufficient to enable the feature in the compiler when compiling it.

That means that to use feature maybe_expr in Erlang/OTP 26, it is sufficient to enable it during compilation.

In Erlang/OTP 27, feature maybe_expr will be enabled by default, but it will be possible to disable it.

OTP-18474
Application(s):
stdlib
Related Id(s):
PR-6895

Static supervisors are very idle processes after they have started so they will now be hibernated after start to improve resource management.

OTP-18478
Application(s):
common_test, compiler, dialyzer, diameter, et, ftp, inets, kernel, observer, runtime_tools, ssh, stdlib
Related Id(s):
GH-6903

Deprecates dbg:stop_clear/0 because it is simply a function alias to dbg:stop/0

OTP-18494
Application(s):
stdlib
Related Id(s):
PR-6924

Support has been added in ms_transform for the actions caller_line/0, current_stacktrace/0, and current_stacktrace/1.

OTP-18495
Application(s):
stdlib
Related Id(s):
PR-6943

*** HIGHLIGHT ***

The family of enumeration functions in module lists has been extended with enumerate/3 that allows a step value to be supplied.

OTP-18500
Application(s):
stdlib

*** HIGHLIGHT ***

Update Unicode to version 15.0.0.

OTP-18511
Application(s):
otp, stdlib
Related Id(s):
PR-7017

The regular expression library powering the re module is likely to be changed in Erlang/OTP 27. See Upcoming Potential Incompatibilities.

OTP-18515
Application(s):
stdlib
Related Id(s):
GH-6990

Improved the performance of sets:subtract/2 when subtracting a small number of elements.

OTP-18518
Application(s):
stdlib
Related Id(s):
GH-7015

The linter will no longer raise warnings for underspecified opaque types.

OTP-18522
Application(s):
dialyzer, erts, stdlib

*** HIGHLIGHT ***

Added the new built-in type dynamic() introduced in EEP-61, improving support for gradual type checkers.

OTP-18537
Application(s):
stdlib
Related Id(s):
PR-7081

The by gen_statem previously used call proxy process that was used for preventing late replies from reaching the client at timeout or connection loss has been removed. It is no longer needed since process aliases take care of this, are used, and supported by all Erlang nodes that an OTP 26 Erlang node can communicate with.

OTP-18558
Application(s):
dialyzer, stdlib
Related Id(s):
PR-6852

Added the argparse module for simplified argument handling in escripts and similar.

OTP-18575
Application(s):
kernel, stdlib
Related Id(s):
PR-7169

Added support for multiple line expressions and navigation in the shell. Added new keybindings:

-- navigate up (ctrl+up)/(alt+up)

-- navigate down (ctrl+down)/(alt+down)

-- insert newline in middle of line (alt+enter)

-- navigate top (alt+<)/(alt+shift+up)

-- navigate bottom (alt+>)/(alt+shift+down)

-- clear current expression (alt+c)

-- cancel search (alt+c)

-- opening editor on mac (option+o)/(alt+o)

Modifies the prompt for new lines to make it clearer that the prompt has entered multi-line mode. Supports terminal with small window size, recommend not go lower than 7 rows and 40 columns. Modifies the search prompt to support multi-line statements. Redraw the prompt after continuing from JCL menu.

Full runtime dependencies of stdlib-5.0: compiler-5.0, crypto-4.5, erts-13.1, kernel-9.0, sasl-3.0

syntax_tools-3.1 #

OTP-18413
Application(s):
compiler, erts, stdlib, syntax_tools, tools
Related Id(s):
EEP-58 , PR-6727

*** HIGHLIGHT ***

Map comprehensions as suggested in EEP 58 has now been implemented.

Full runtime dependencies of syntax_tools-3.1: compiler-7.0, erts-9.0, kernel-5.0, stdlib-4.0

tftp-1.1 #

OTP-18490
Application(s):
diameter, inets, mnesia, reltool, snmp, ssh, tftp, wx
Related Id(s):
GH-6339 , OTP-18471 , PR-6843

*** POTENTIAL INCOMPATIBILITY ***

The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

Full runtime dependencies of tftp-1.1: erts-6.0, kernel-6.0, stdlib-5.0

tools-3.6 #

OTP-18413
Application(s):
compiler, erts, stdlib, syntax_tools, tools
Related Id(s):
EEP-58 , PR-6727

*** HIGHLIGHT ***

Map comprehensions as suggested in EEP 58 has now been implemented.

OTP-18487
Application(s):
runtime_tools, tools
Related Id(s):
PR-6829

The instrument module has been moved from tools to runtime_tools.

Full runtime dependencies of tools-3.6: compiler-5.0, erts-11.0, erts-9.1, kernel-5.4, runtime_tools-1.8.14, stdlib-3.4

wx-2.3 #

OTP-18350
Application(s):
inets, observer, os_mon, reltool, wx

Runtime dependencies have been updated.

OTP-18490
Application(s):
diameter, inets, mnesia, reltool, snmp, ssh, tftp, wx
Related Id(s):
GH-6339 , OTP-18471 , PR-6843

*** POTENTIAL INCOMPATIBILITY ***

The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

Full runtime dependencies of wx-2.3: erts-12.0, kernel-8.0, stdlib-5.0