Inital Release: OTP 29.0
Git Tag: OTP-29.0
Date: 2026-02-11
Trouble Report Id: OTP-16607, OTP-19611, OTP-19643, OTP-19652,
OTP-19663, OTP-19672, OTP-19695, OTP-19708,
OTP-19709, OTP-19713, OTP-19734, OTP-19744,
OTP-19747, OTP-19750, OTP-19751, OTP-19763,
OTP-19764, OTP-19766, OTP-19775, OTP-19778,
OTP-19779, OTP-19783, OTP-19784, OTP-19785,
OTP-19786, OTP-19793, OTP-19800, OTP-19801,
OTP-19807, OTP-19809, OTP-19811, OTP-19815,
OTP-19822, OTP-19826, OTP-19834, OTP-19838,
OTP-19842, OTP-19853, OTP-19858, OTP-19866,
OTP-19874, OTP-19882, OTP-19887, OTP-19898,
OTP-19903, OTP-19906, OTP-19910, OTP-19912,
OTP-19917, OTP-19918, OTP-19919, OTP-19921,
OTP-19922, OTP-19925, OTP-19927, OTP-19930,
OTP-19932, OTP-19933, OTP-19934, OTP-19935,
OTP-19936, OTP-19938, OTP-19942, OTP-19943,
OTP-19949, OTP-19954, OTP-19956, OTP-19960,
OTP-19963, OTP-19964, OTP-19965, OTP-19966,
OTP-19968
Seq num: GH-10071, GH-10125, GH-10151, GH-10260,
GH-10341, GH-10345, GH-10558, GH-10559,
GH-10560, GH-10561, GH-10609, GH-8569,
GH-8993, GH-9822, OTP-16608, OTP-19827,
PR-10013, PR-10033, PR-10078, PR-10114,
PR-10115, PR-10126, PR-10134, PR-10144,
PR-10145, PR-10161, PR-10165, PR-10166,
PR-10168, PR-10187, PR-10189, PR-10193,
PR-10195, PR-10197, PR-10202, PR-10206,
PR-10207, PR-10209, PR-10213, PR-10218,
PR-10220, PR-10223, PR-10230, PR-10234,
PR-10253, PR-10269, PR-10276, PR-10277,
PR-10281, PR-10304, PR-10338, PR-10348,
PR-10372, PR-10382, PR-10387, PR-10417,
PR-10421, PR-10422, PR-10433, PR-10449,
PR-10453, PR-10510, PR-10511, PR-10514,
PR-10519, PR-10524, PR-10532, PR-10549,
PR-10554, PR-10556, PR-10566, PR-10568,
PR-10573, PR-10579, PR-10585, PR-10598,
PR-10601, PR-10613, PR-10615, PR-10617,
PR-10626, PR-10642, PR-10646, PR-10656,
PR-7118, PR-7315, PR-9115, PR-9125, PR-9134,
PR-9153, PR-9209, PR-9223, PR-9374, PR-9475,
PR-9790, PR-9864, PR-9866, PR-9894, PR-9899,
PR-9934, PR-9984
System: OTP
Release: 29
Application: asn1-5.5, common_test-1.30, compiler-10.0,
crypto-5.9, debugger-6.1, dialyzer-6.0,
diameter-2.7, edoc-1.5, eldap-1.3,
erl_interface-5.7, erts-17.0, et-1.8,
eunit-2.11, ftp-1.3, inets-9.6,
jinterface-1.16, kernel-11.0, megaco-4.9,
mnesia-4.26, observer-2.19, odbc-2.17,
os_mon-2.12, parsetools-2.8, public_key-1.21,
reltool-1.1, runtime_tools-2.4, sasl-4.4,
snmp-5.21, ssh-5.5, ssl-11.5.2, stdlib-8.0,
syntax_tools-4.1, tftp-1.3, tools-4.2,
wx-2.6, xmerl-2.2
Predecessor: OTP
Check out the git tag OTP-29.0, and build a full OTP system including documentation.
HIGHLIGHTS
-
The JIT now generates better code for matching or creating binaries with multiple little-endian segments.
Own Id: OTP-19747
Application(s): erts
Related Id(s): PR-10126 -
In the documentation for the
compilemodule, a section has been added with recommendations for implementors of languages running on the BEAM. Documentation has also been added for theto_abstr,to_exp, andfrom_abstroptions.The documentation for erlc now lists
.abstras one of the supported options.When compiling with the
to_abstroption, the resulting.abstrfile now retains any-docattributes present in the source code.Own Id: OTP-19784
Application(s): compiler, erts
Related Id(s): PR-10230, PR-10234 -
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
Own Id: OTP-19785
Application(s): compiler, dialyzer, erts, stdlib
Related Id(s): PR-10617 -
The guard BIF
is_integer/3has been added. It follows the design of the original EEP-16, only changing the name fromis_betweentois_integer. This BIF takes in 3 parameters,Term,LowerBound, andUpperBound.It returns
trueifTerm,LowerBound, andUpperBoundare all integers, andLowerBound =< Term =< UpperBound; otherwise, it returns false.Example:
1> I = 42. 2> is_integer(I, 0, 100). true
Own Id: OTP-19809
Application(s): compiler, dialyzer, erts
Related Id(s): PR-10276 -
There are new functions for random permutation of a list:
rand:shuffle/1andrand:shuffle_s/2. They are inspired by a suggestion and discussion on ErlangForums.Own Id: OTP-19826
Application(s): stdlib
Related Id(s): PR-10281 -
In the default code path for the Erlang system, the current working directory (
.) is now in the last position instead of the first.Own Id: OTP-19842
Application(s): erts, kernel*** POTENTIAL INCOMPATIBILITY ***
-
Function application is now left associative. That means one can now write:
f(X)(Y)instead of:
(f(X))(Y)Own Id: OTP-19866
Application(s): compiler
Related Id(s): PR-9223 -
There will now be a warning when exporting variables out of a subexpression. For example:
case file:open(File, AllOpts = [write,{encoding,utf8}]) of {ok,Fd} -> {Fd,AllOpts} endTo avoid the warning, this can be rewritten to:
AllOpts = [write,{encoding,utf8}], case file:open(File, AllOpts) of {ok,Fd} -> {Fd,AllOpts} endThe warning can be suppressed by giving option
nowarn_export_var_subexprto the compiler.Own Id: OTP-19898
Application(s): compiler, stdlib
Related Id(s): PR-9134 -
By default, the compiler will now warn for uses of the
andandoroperators.This warning can be suppressed using the
nowarn_obsolete_bool_opcompiler option.Own Id: OTP-19918
Application(s): compiler
Related Id(s): PR-9115 -
Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). * exception error: bad filter 2614250In Erlang/OTP 29, attempting to bind a variable in a comprehension will fail by default:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. * 5:14: matches using '=' are not allowed in comprehension qualifiers unless the experimental 'compr_assign' language feature is enabled. With 'compr_assign' enabled, a match 'P = E' will behave as a strict generator 'P <-:- [E]'."However, this example will work as expected if the
compr_assignfeature is enabled when starting the runtime system:$ erl -enable-feature compr_assign . . . 1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). [2614250]Here is another example how
compr_assigncan be used:-module(example). -feature(compr_assign, enable). -export([cat/1]). cat(Files) -> [Char || F <- Files, {ok, Bin} = file:read_file(F), Char <- unicode:characters_to_list(Bin)].Own Id: OTP-19927
Application(s): compiler, stdlib
Related Id(s): PR-9153*** POTENTIAL INCOMPATIBILITY ***
-
There will now be a warning when using the
catchoperator, which has been deprecated for a long time.It is recommended to instead use
try...catchbut is also possible to disable the warning by using thenowarn_deprecated_catchoption.Own Id: OTP-19938
Application(s): compiler, stdlib
Related Id(s): PR-10421 -
Multi-valued comprehensions according to EEP 78 has been implemented.
Example:
> [I, -I || I <- lists:seq(1, 5)]. [1,-1,2,-2,3,-3,4,-4,5,-5]
Own Id: OTP-19942
Application(s): compiler, debugger, stdlib, syntax_tools
Related Id(s): PR-9374 -
There will now be a warning for matches that unify constructors, such as the following:
m({a,B} = {Y,Z}) -> . . .Such a match can be rewritten to:
m({a=Y,B=B}) -> . . .The compiler option
nowarn_match_alias_patscan be used to disable the warning.Own Id: OTP-19943
Application(s): compiler, stdlib
Related Id(s): PR-10433 -
There is no longer a 32-bit Erlang/OTP build for Windows.
Own Id: OTP-19960
Application(s): otp -
The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides protection against both classical and quantum computer attacks while maintaining backward compatibility through automatic fallback to other algorithms when peers don't support it.
Own Id: OTP-19965
Application(s): ssh
Related Id(s): PR-10656*** POTENTIAL INCOMPATIBILITY ***
-
The compiler now generates more efficient code for map comprehensions with constant values that don't depend on the generator, such as the following:
#{K => 42} || K <- List}. #{K => X || K <- List}. #{K => {X, Y} || K <- List}.Own Id: OTP-19968
Application(s): compiler
Related Id(s): PR-10646
POTENTIAL INCOMPATIBILITIES
-
Fixed (
inet) module selection when calling (gen_tcp) listen and connect and (gen_udp) open. Depending on the order of the options, the module option (tcp_moduleorudp_module) was sometimes ignored.Own Id: OTP-19695
Application(s): kernel
Related Id(s): GH-9822, PR-10013 -
ssh:stop_deamonnow usessupervisor:stopfor shutting down daemons. With this change, the scenario whenssh:stop_daemonis called for a non-existing process results in calling process exiting. Previously an error tuple was returned (which was not documented).Own Id: OTP-19801
Application(s): ssh
Related Id(s): PR-10253 -
In the default code path for the Erlang system, the current working directory (
.) is now in the last position instead of the first.Own Id: OTP-19842
Application(s): erts, kernel*** HIGHLIGHT ***
-
Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). * exception error: bad filter 2614250In Erlang/OTP 29, attempting to bind a variable in a comprehension will fail by default:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. * 5:14: matches using '=' are not allowed in comprehension qualifiers unless the experimental 'compr_assign' language feature is enabled. With 'compr_assign' enabled, a match 'P = E' will behave as a strict generator 'P <-:- [E]'."However, this example will work as expected if the
compr_assignfeature is enabled when starting the runtime system:$ erl -enable-feature compr_assign . . . 1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). [2614250]Here is another example how
compr_assigncan be used:-module(example). -feature(compr_assign, enable). -export([cat/1]). cat(Files) -> [Char || F <- Files, {ok, Bin} = file:read_file(F), Char <- unicode:characters_to_list(Bin)].Own Id: OTP-19927
Application(s): compiler, stdlib
Related Id(s): PR-9153*** HIGHLIGHT ***
-
The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides protection against both classical and quantum computer attacks while maintaining backward compatibility through automatic fallback to other algorithms when peers don't support it.
Own Id: OTP-19965
Application(s): ssh
Related Id(s): PR-10656*** HIGHLIGHT ***
OTP-29.0
Improvements and New Features
-
Vendor dependencies and OpenVEX statements in the otp repository is now scanned for vulnerabilities.
Own Id: OTP-19652
Related Id(s): PR-9790 -
Automated vendor vulnerability handling has been added.
- Verifies that OTP reported Github Securities exists in the published OpenVEX statements.
- Open issues automatically in Erlang/OTP if vendor vulnerabilities are detected.
Own Id: OTP-19763
Related Id(s): PR-10145, PR-10166, PR-10168, PR-10189, PR-10193, PR-10195, PR-10197, PR-10202 -
Added OpenVEX statement for PCRE2 under investigation.
Own Id: OTP-19764
Related Id(s): PR-10165 -
Documentation about how to validate the SBOM using sigstore has been added.
-
The vendor vulnerability scanner was reporting scanning the
maintbranch when it was doing themasterbranch. This issue only happened for pull requests that modified vendor files. Scheduled vendor vulnerability scans were correct.The behavior has not been corrected and pull requests on
maintandmaint-XX will work as expected, analyzing their vendor dependencies.To create issues when vendor vulnerabilities are detected, use permissions from the Erlang Vendor Scanner Bot.
Own Id: OTP-19775
Related Id(s): PR-10206, PR-10213, PR-10218, PR-10220, PR-10223 -
Create OpenVEX statement in Erlang/OTP to state that the wxWindows vendor vulnerability CVE-2024-58249 does not affect OTP-28.
Own Id: OTP-19778
Related Id(s): PR-10209 -
.github/scripts/otp-compliance.es vex runwas ignoring certain OpenVEX statements if the CVE name existed. That meant an OpenVEX statement could say "under_investigation" and the CVE reported a vulnerability, and simply based on the CVE Id, the script would ignore it as the CVE Id exists in OpenVEX.The script has been updated to filter CVE results that already exist in OpenVEX statements.
Own Id: OTP-19779
Related Id(s): PR-10209 -
The old-style type tests in guards (
integer,atomand so on) have been scheduled for removal in Erlang/OTP 30. They have been deprecated for a long time.Own Id: OTP-19887
Related Id(s): PR-10417 -
Update OpenVEX files with
not_affectedstatus forCVE-2026-22184Own Id: OTP-19930
Related Id(s): GH-10558, GH-10559, GH-10560, GH-10561, PR-10566 -
Removed the undocumented
dyn_erlutility.Own Id: OTP-19933
Related Id(s): PR-10573 -
Added
opensslOpenVEX statements to clarify that none of them affect neitherertsnorerl_interface. -
There is no longer a 32-bit Erlang/OTP build for Windows.
Own Id: OTP-19960
*** HIGHLIGHT ***
asn1-5.5
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of asn1-5.5
erts-14.0, kernel-9.0, stdlib-5.0
common_test-1.30
Improvements and New Features
-
Vendor dependencies and OpenVEX statements in the otp repository is now scanned for vulnerabilities.
Own Id: OTP-19652
Related Id(s): PR-9790 -
The legacy
andandoroperators have been replaced withandalsoandorelse.Own Id: OTP-19744
Related Id(s): PR-10114, PR-10554, PR-10568, PR-10579, PR-10585, PR-10598 -
'EXIT'messages are now formatted in the same way asbadmatcherrors.Own Id: OTP-19910
Related Id(s): PR-10277 -
Error notifications now contain the name of the source file in which the error occurred.
Full runtime dependencies of common_test-1.30
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-10.0
Fixed Bugs and Malfunctions
-
For a function such as the following:
bar(S0) -> S1 = setelement(8, S0, a), S2 = setelement(7, S1, b), setelement(5, S2, c).the compiler would keep all of the calls to
setelement/3and emit extra unnecessaryset_tuple_elementinstructions.This has been corrected so that the compiler will never emit code that uses the
set_tuple_elementinstruction. In a future release, support for theset_tuple_elementwill be removed from the runtime system.
Improvements and New Features
-
In comprehensions, a generator that builds a list with a single element will now be optimized to avoid building and matching the list. Example:
[H || E <- List, H <- [erlang:phash2(E)], H rem 10 =:= 0]Own Id: OTP-19672
Related Id(s): PR-9934 -
In the documentation for the
compilemodule, a section has been added with recommendations for implementors of languages running on the BEAM. Documentation has also been added for theto_abstr,to_exp, andfrom_abstroptions.The documentation for erlc now lists
.abstras one of the supported options.When compiling with the
to_abstroption, the resulting.abstrfile now retains any-docattributes present in the source code.Own Id: OTP-19784
Related Id(s): PR-10230, PR-10234*** HIGHLIGHT ***
-
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
Own Id: OTP-19785
Related Id(s): PR-10617*** HIGHLIGHT ***
-
The guard BIF
is_integer/3has been added. It follows the design of the original EEP-16, only changing the name fromis_betweentois_integer. This BIF takes in 3 parameters,Term,LowerBound, andUpperBound.It returns
trueifTerm,LowerBound, andUpperBoundare all integers, andLowerBound =< Term =< UpperBound; otherwise, it returns false.Example:
1> I = 42. 2> is_integer(I, 0, 100). true
Own Id: OTP-19809
Related Id(s): PR-10276*** HIGHLIGHT ***
-
Function application is now left associative. That means one can now write:
f(X)(Y)instead of:
(f(X))(Y)Own Id: OTP-19866
Related Id(s): PR-9223*** HIGHLIGHT ***
-
There will now be a warning when exporting variables out of a subexpression. For example:
case file:open(File, AllOpts = [write,{encoding,utf8}]) of {ok,Fd} -> {Fd,AllOpts} endTo avoid the warning, this can be rewritten to:
AllOpts = [write,{encoding,utf8}], case file:open(File, AllOpts) of {ok,Fd} -> {Fd,AllOpts} endThe warning can be suppressed by giving option
nowarn_export_var_subexprto the compiler.Own Id: OTP-19898
Related Id(s): PR-9134*** HIGHLIGHT ***
-
By default, the compiler will now warn for uses of the
andandoroperators.This warning can be suppressed using the
nowarn_obsolete_bool_opcompiler option.Own Id: OTP-19918
Related Id(s): PR-9115*** HIGHLIGHT ***
-
Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). * exception error: bad filter 2614250In Erlang/OTP 29, attempting to bind a variable in a comprehension will fail by default:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. * 5:14: matches using '=' are not allowed in comprehension qualifiers unless the experimental 'compr_assign' language feature is enabled. With 'compr_assign' enabled, a match 'P = E' will behave as a strict generator 'P <-:- [E]'."However, this example will work as expected if the
compr_assignfeature is enabled when starting the runtime system:$ erl -enable-feature compr_assign . . . 1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). [2614250]Here is another example how
compr_assigncan be used:-module(example). -feature(compr_assign, enable). -export([cat/1]). cat(Files) -> [Char || F <- Files, {ok, Bin} = file:read_file(F), Char <- unicode:characters_to_list(Bin)].Own Id: OTP-19927
Related Id(s): PR-9153*** HIGHLIGHT ***
*** POTENTIAL INCOMPATIBILITY ***
-
There will now be a warning when using the
catchoperator, which has been deprecated for a long time.It is recommended to instead use
try...catchbut is also possible to disable the warning by using thenowarn_deprecated_catchoption.Own Id: OTP-19938
Related Id(s): PR-10421*** HIGHLIGHT ***
-
Multi-valued comprehensions according to EEP 78 has been implemented.
Example:
> [I, -I || I <- lists:seq(1, 5)]. [1,-1,2,-2,3,-3,4,-4,5,-5]
Own Id: OTP-19942
Related Id(s): PR-9374*** HIGHLIGHT ***
-
There will now be a warning for matches that unify constructors, such as the following:
m({a,B} = {Y,Z}) -> . . .Such a match can be rewritten to:
m({a=Y,B=B}) -> . . .The compiler option
nowarn_match_alias_patscan be used to disable the warning.Own Id: OTP-19943
Related Id(s): PR-10433*** HIGHLIGHT ***
-
The compiler now generates more efficient code for map comprehensions with constant values that don't depend on the generator, such as the following:
#{K => 42} || K <- List}. #{K => X || K <- List}. #{K => {X, Y} || K <- List}.Own Id: OTP-19968
Related Id(s): PR-10646*** HIGHLIGHT ***
Full runtime dependencies of compiler-10.0
crypto-5.1, erts-13.0, kernel-8.4, stdlib-8.0
crypto-5.9
Improvements and New Features
-
The
rand:bytes/1andrand:bytes_s/2functions have been optimized by implementing a new internal callback function thatcrypto:rand_seed_alg/1andcrypto:alg_seed_alg_s/1have been updated to use.A new algorithm
crypto_prng1, which also takes advantage of this new internal callback, has been added tocrypto:rand_seed_alg/2andcrypto:rand_seed_alg_s/2. It is much faster then the existingcrypto_aes, in particular for generating bytes.Own Id: OTP-19882
Related Id(s): PR-10453, OTP-19827
Full runtime dependencies of crypto-5.9
erts-9.0, kernel-6.0, stdlib-3.9
debugger-6.1
Improvements and New Features
-
Tools such as the debugger,
beam_lib, andxrefno longer support BEAM files created before OTP 13B.Own Id: OTP-19906
Related Id(s): PR-10519 -
Multi-valued comprehensions according to EEP 78 has been implemented.
Example:
> [I, -I || I <- lists:seq(1, 5)]. [1,-1,2,-2,3,-3,4,-4,5,-5]
Own Id: OTP-19942
Related Id(s): PR-9374*** HIGHLIGHT ***
Full runtime dependencies of debugger-6.1
compiler-8.0, erts-15.0, kernel-10.0, stdlib-7.0, wx-2.0
dialyzer-6.0
Improvements and New Features
-
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
Own Id: OTP-19785
Related Id(s): PR-10617*** HIGHLIGHT ***
-
The guard BIF
is_integer/3has been added. It follows the design of the original EEP-16, only changing the name fromis_betweentois_integer. This BIF takes in 3 parameters,Term,LowerBound, andUpperBound.It returns
trueifTerm,LowerBound, andUpperBoundare all integers, andLowerBound =< Term =< UpperBound; otherwise, it returns false.Example:
1> I = 42. 2> is_integer(I, 0, 100). true
Own Id: OTP-19809
Related Id(s): PR-10276*** HIGHLIGHT ***
Full runtime dependencies of dialyzer-6.0
compiler-10.0, erts-12.0, kernel-8.0, stdlib-5.0, syntax_tools-2.0
diameter-2.7
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of diameter-2.7
erts-10.0, kernel-3.2, ssl-9.0, stdlib-5.0
edoc-1.5
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of edoc-1.5
erts-11.0, inets-5.10, kernel-7.0, stdlib-4.0, syntax_tools-2.0, xmerl-1.3.7
eldap-1.3
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of eldap-1.3
asn1-3.0, erts-6.0, kernel-3.0, ssl-5.3.4, stdlib-3.4
erl_interface-5.7
Improvements and New Features
-
Vendor dependencies and OpenVEX statements in the otp repository is now scanned for vulnerabilities.
Own Id: OTP-19652
Related Id(s): PR-9790 -
Improved name consistency of EPMD protocol messages in documentation and code. Renamed
PORT_PLEASE2_REQtoPORT2_REQand added prefixEPMD_.
Known Bugs and Problems
-
The
eiAPI 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.Own Id: OTP-16607
Related Id(s): OTP-16608
erts-17.0
Fixed Bugs and Malfunctions
-
For a function such as the following:
bar(S0) -> S1 = setelement(8, S0, a), S2 = setelement(7, S1, b), setelement(5, S2, c).the compiler would keep all of the calls to
setelement/3and emit extra unnecessaryset_tuple_elementinstructions.This has been corrected so that the compiler will never emit code that uses the
set_tuple_elementinstruction. In a future release, support for theset_tuple_elementwill be removed from the runtime system. -
Improved the handling of the logging directory for the start script on Unix-like systems, so that it no longer crashes when
$ROOTDIR/logis not writable. -
The
-nocookieoption forerlis now documented.Own Id: OTP-19935
Related Id(s): PR-10549
Improvements and New Features
-
The exported name space of the beam executable has been cleaned to only expose symbols of documented interfaces like NIF and driver APIs. This will avoid accidental name clashes with for example our statically linked variants of PCRE2 and ZSTD. NIFs and drivers that abuse undocumented internal interfaces will fail to load due to this change.
Own Id: OTP-19643
Related Id(s): PR-9864 -
Vendor dependencies and OpenVEX statements in the otp repository is now scanned for vulnerabilities.
Own Id: OTP-19652
Related Id(s): PR-9790 -
Improved name consistency of EPMD protocol messages in documentation and code. Renamed
PORT_PLEASE2_REQtoPORT2_REQand added prefixEPMD_. -
The JIT now generates better code for matching or creating binaries with multiple little-endian segments.
Own Id: OTP-19747
Related Id(s): PR-10126*** HIGHLIGHT ***
-
In the documentation for the
compilemodule, a section has been added with recommendations for implementors of languages running on the BEAM. Documentation has also been added for theto_abstr,to_exp, andfrom_abstroptions.The documentation for erlc now lists
.abstras one of the supported options.When compiling with the
to_abstroption, the resulting.abstrfile now retains any-docattributes present in the source code.Own Id: OTP-19784
Related Id(s): PR-10230, PR-10234*** HIGHLIGHT ***
-
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
Own Id: OTP-19785
Related Id(s): PR-10617*** HIGHLIGHT ***
-
Task stealing between schedulers has been further optimized.
Own Id: OTP-19793
Related Id(s): PR-9984 -
The guard BIF
is_integer/3has been added. It follows the design of the original EEP-16, only changing the name fromis_betweentois_integer. This BIF takes in 3 parameters,Term,LowerBound, andUpperBound.It returns
trueifTerm,LowerBound, andUpperBoundare all integers, andLowerBound =< Term =< UpperBound; otherwise, it returns false.Example:
1> I = 42. 2> is_integer(I, 0, 100). true
Own Id: OTP-19809
Related Id(s): PR-10276*** HIGHLIGHT ***
-
Calls to
trace:info(_, {M,F,A}, Item), withItemascall_time,call_memory, orall, will no longer block all scheduler threads from running.Own Id: OTP-19811
Related Id(s): PR-10207 -
Full support for SCTP in socket. Not (yet) supported for FreeBSD.
Own Id: OTP-19834
-
In the default code path for the Erlang system, the current working directory (
.) is now in the last position instead of the first.Own Id: OTP-19842
*** HIGHLIGHT ****** POTENTIAL INCOMPATIBILITY ***
-
Tools such as the debugger,
beam_lib, andxrefno longer support BEAM files created before OTP 13B.Own Id: OTP-19906
Related Id(s): PR-10519 -
Optimized ETS named table lookup scalability by replacing read locks with lockless atomic operations.
Own Id: OTP-19919
Related Id(s): PR-7118 -
Removed the undocumented
dyn_erlutility.Own Id: OTP-19933
Related Id(s): PR-10573 -
Added
zstd:flush/2for flushing compressed data without closing the compression context. -
While the iteration for maps is undefined, it is now guaranteed that all ways of iterating over maps provides the elements in the same order. That is, all of the following ways of iterating will produce the elements in the same order:
maps:keys/1maps:values/1maps:to_list/1maps:to_list(maps:iterator(M))- Map comprehension:
[{K,V} || K := V <- M]
Own Id: OTP-19963
Related Id(s): PR-10626 -
Improved the performance of code loading.
Own Id: OTP-19966
Related Id(s): PR-10615
Full runtime dependencies of erts-17.0
kernel-9.0, sasl-3.3, stdlib-4.1
et-1.8
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of et-1.8
erts-9.0, kernel-5.3, runtime_tools-1.10, stdlib-3.4, wx-1.2
eunit-2.11
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of eunit-2.11
erts-9.0, kernel-5.3, stdlib-6.0
ftp-1.3
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of ftp-1.3
erts-7.0, kernel-6.0, runtime_tools-1.15.1, ssl-10.2, stdlib-3.5
inets-9.6
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of inets-9.6
erts-14.0, kernel-9.0, mnesia-4.12, public_key-1.13, runtime_tools-1.8.14, ssl-9.0, stdlib-5.0, stdlib-6.0
jinterface-1.16
Improvements and New Features
-
The
jinterfacebuild now honorsSOURCE_DATE_EPOCHfor deterministic build ofOtpErlang.jar.Own Id: OTP-19956
Related Id(s): PR-10556
kernel-11.0
Fixed Bugs and Malfunctions
-
Fixed (
inet) module selection when calling (gen_tcp) listen and connect and (gen_udp) open. Depending on the order of the options, the module option (tcp_moduleorudp_module) was sometimes ignored.Own Id: OTP-19695
Related Id(s): GH-9822, PR-10013*** POTENTIAL INCOMPATIBILITY ***
-
The TCP/UDP compatibility layer has been fixed so that
inet_backend = socketnow supports socket optionsreuseportandreuseport_lbforgen_tcpandgen_udp.Own Id: OTP-19917
Related Id(s): PR-10514
Improvements and New Features
-
Added an option to set the
erl_boot_serverlisten port.Own Id: OTP-19708
Related Id(s): PR-9894 -
The memory footprint of some supervisors has been reduced by purging obsoleted data when the supervisor is transitioning to and from hibernation.
Own Id: OTP-19713
Related Id(s): PR-9866 -
Improved name consistency of EPMD protocol messages in documentation and code. Renamed
PORT_PLEASE2_REQtoPORT2_REQand added prefixEPMD_. -
The legacy
andandoroperators have been replaced withandalsoandorelse.Own Id: OTP-19744
Related Id(s): PR-10114, PR-10554, PR-10568, PR-10579, PR-10585, PR-10598 -
Refactored a
kernel_load_completedclause for conciseness.Own Id: OTP-19786
Related Id(s): PR-10134 -
Full support for SCTP in socket. Not (yet) supported for FreeBSD.
Own Id: OTP-19834
-
In the default code path for the Erlang system, the current working directory (
.) is now in the last position instead of the first.Own Id: OTP-19842
*** HIGHLIGHT ****** POTENTIAL INCOMPATIBILITY ***
Full runtime dependencies of kernel-11.0
crypto-5.0, erts-17.0, sasl-3.0, stdlib-7.0
megaco-4.9
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of megaco-4.9
asn1-3.0, debugger-4.0, erts-12.0, et-1.5, kernel-8.0, runtime_tools-1.8.14, stdlib-2.5
mnesia-4.26
Improvements and New Features
-
mnesianow has new functionsselect_reverse/1-6supporting iteration over tables in reverse order. -
The
mnesia_registrymodule has been removed.Own Id: OTP-19807
Related Id(s): PR-7315
Full runtime dependencies of mnesia-4.26
erts-9.0, kernel-5.3, stdlib-5.0
observer-2.19
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of observer-2.19
erts-15.0, et-1.5, kernel-10.0, runtime_tools-2.1, stdlib-5.0, wx-2.3
odbc-2.17
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of odbc-2.17
erts-6.0, kernel-3.0, stdlib-2.0
os_mon-2.12
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of os_mon-2.12
erts-14.0, kernel-9.0, sasl-4.2.1, stdlib-5.0
parsetools-2.8
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of parsetools-2.8
erts-6.0, kernel-3.0, stdlib-3.4
public_key-1.21
Improvements and New Features
-
The legacy
andandoroperators have been replaced withandalsoandorelse.Own Id: OTP-19744
Related Id(s): PR-10114, PR-10554, PR-10568, PR-10579, PR-10585, PR-10598 -
Added an option for relaxed encoding of certificates, to allow some values to be empty. This may be used by other applications for interoperability reasons. This option is not used by the
sslapplication.Own Id: OTP-19822
Related Id(s): PR-10033
Full runtime dependencies of public_key-1.21
asn1-5.0, crypto-5.8, erts-13.0, kernel-8.0, stdlib-4.0
reltool-1.1
Improvements and New Features
-
Removed the undocumented
dyn_erlutility.Own Id: OTP-19933
Related Id(s): PR-10573 -
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of reltool-1.1
erts-15.0, kernel-9.0, sasl-4.2.1, stdlib-5.0, tools-2.6.14, wx-2.3
runtime_tools-2.4
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of runtime_tools-2.4
erts-16.0, kernel-10.0, mnesia-4.12, stdlib-6.0
sasl-4.4
Fixed Bugs and Malfunctions
-
UNC paths are now handled on Windows.
Own Id: OTP-19949
Related Id(s): PR-10601
Improvements and New Features
-
Removed the undocumented
dyn_erlutility.Own Id: OTP-19933
Related Id(s): PR-10573
Full runtime dependencies of sasl-4.4
erts-15.0, kernel-6.0, stdlib-4.0, tools-2.6.14
snmp-5.21
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of snmp-5.21
asn1-5.4, crypto-4.6, erts-12.0, kernel-8.0, mnesia-4.12, runtime_tools-1.8.14, stdlib-5.0
ssh-5.5
Improvements and New Features
-
Use KEX strict extension names as specified in draft-ietf-sshm-strict-kex-00. Pre standard names are still supported.
Own Id: OTP-19709
Related Id(s): PR-10115 -
Added an 'alive' option to detect and terminate dead SSH connections. Functionally equivalent to OpenSSH's ClientAlive*/ServerAlive* settings.
-
ssh:stop_deamonnow usessupervisor:stopfor shutting down daemons. With this change, the scenario whenssh:stop_daemonis called for a non-existing process results in calling process exiting. Previously an error tuple was returned (which was not documented).Own Id: OTP-19801
Related Id(s): PR-10253*** POTENTIAL INCOMPATIBILITY ***
-
The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides protection against both classical and quantum computer attacks while maintaining backward compatibility through automatic fallback to other algorithms when peers don't support it.
Own Id: OTP-19965
Related Id(s): PR-10656*** HIGHLIGHT ***
*** POTENTIAL INCOMPATIBILITY ***
Full runtime dependencies of ssh-5.5
crypto-5.7, erts-14.0, kernel-10.3, public_key-1.6.1, runtime_tools-1.15.1, stdlib-8.0
ssl-11.5.2
Improvements and New Features
-
The legacy
andandoroperators have been replaced withandalsoandorelse.Own Id: OTP-19744
Related Id(s): PR-10114, PR-10554, PR-10568, PR-10579, PR-10585, PR-10598
Full runtime dependencies of ssl-11.5.2
crypto-5.8, erts-16.0, inets-5.10.7, kernel-10.3, public_key-1.18.3, runtime_tools-1.15.1, stdlib-7.0
stdlib-8.0
Fixed Bugs and Malfunctions
-
Fixed an issue in
digraph_utils:roots/1where roots could be missed in some cases.Own Id: OTP-19932
Related Id(s): PR-10510
Improvements and New Features
-
Error return values from functions in
zipnow also specify which file in the archive the error belongs to.Own Id: OTP-19663
Related Id(s): PR-9899 -
The legacy
andandoroperators have been replaced withandalsoandorelse.Own Id: OTP-19744
Related Id(s): PR-10114, PR-10554, PR-10568, PR-10579, PR-10585, PR-10598 -
The undocumented and unsupported function
lists:zf/2is now deprecated.Own Id: OTP-19783
Related Id(s): PR-10161 -
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
Own Id: OTP-19785
Related Id(s): PR-10617*** HIGHLIGHT ***
-
The new
supervior:stop/1,2functions can be used to manage the dynamic parts of a supervisor tree in an application from outside the tree but in the same application.Own Id: OTP-19800
Related Id(s): PR-9209 -
Added a new constructor
array:from/2.Own Id: OTP-19815
Related Id(s): PR-10304 -
There are new functions for random permutation of a list:
rand:shuffle/1andrand:shuffle_s/2. They are inspired by a suggestion and discussion on ErlangForums.Own Id: OTP-19826
Related Id(s): PR-10281*** HIGHLIGHT ***
-
The undocumented functions
erl_eval:extended_parse_exprs/1anderl_eval:extended_parse_term/1will now be faster when called with a long list of tokens. (These functions are used byqlcand the shell.)Own Id: OTP-19838
Related Id(s): PR-10338 -
The
unicodemodule now supports the Unicode 17 standard.Own Id: OTP-19853
Related Id(s): PR-10382 -
Added functions to
unicodefor recognizing whitespace and identifier.Own Id: OTP-19858
Related Id(s): PR-10387 -
The
rand:bytes/1andrand:bytes_s/2functions have been optimized by implementing a new internal callback function thatcrypto:rand_seed_alg/1andcrypto:alg_seed_alg_s/1have been updated to use.A new algorithm
crypto_prng1, which also takes advantage of this new internal callback, has been added tocrypto:rand_seed_alg/2andcrypto:rand_seed_alg_s/2. It is much faster then the existingcrypto_aes, in particular for generating bytes.Own Id: OTP-19882
Related Id(s): PR-10453, OTP-19827 -
There will now be a warning when exporting variables out of a subexpression. For example:
case file:open(File, AllOpts = [write,{encoding,utf8}]) of {ok,Fd} -> {Fd,AllOpts} endTo avoid the warning, this can be rewritten to:
AllOpts = [write,{encoding,utf8}], case file:open(File, AllOpts) of {ok,Fd} -> {Fd,AllOpts} endThe warning can be suppressed by giving option
nowarn_export_var_subexprto the compiler.Own Id: OTP-19898
Related Id(s): PR-9134*** HIGHLIGHT ***
-
There are new functions in the shell for returning process information.
The
pi/1function is shortcut forerlang:process_info/1. Thepi/3function takes the three numbers from a pid, constructs a pid, and callsprocess_info/1.Examples:
1> pi(<0.90.0>). [{current_function,{c,pinfo,1}}, {initial_call,{erlang,apply,2}}, {status,running}, ... 2> pi(0, 90, 0). [{current_function,{c,pinfo,1}}, {initial_call,{erlang,apply,2}}, {status,running}, ...Own Id: OTP-19903
Related Id(s): PR-10422 -
Tools such as the debugger,
beam_lib, andxrefno longer support BEAM files created before OTP 13B.Own Id: OTP-19906
Related Id(s): PR-10519 -
The
calendarmodule has been updated to use the much faster than before Neri-Schneider algorithm for Gregorian calendar calculations, and been extended to handle negative years.Own Id: OTP-19912
Related Id(s): PR-10449 -
m:graphis a new module that is a functional equivalent of thedigraphanddigraph_utilsmodules.Own Id: OTP-19922
Related Id(s): PR-10532 -
Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). * exception error: bad filter 2614250In Erlang/OTP 29, attempting to bind a variable in a comprehension will fail by default:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. * 5:14: matches using '=' are not allowed in comprehension qualifiers unless the experimental 'compr_assign' language feature is enabled. With 'compr_assign' enabled, a match 'P = E' will behave as a strict generator 'P <-:- [E]'."However, this example will work as expected if the
compr_assignfeature is enabled when starting the runtime system:$ erl -enable-feature compr_assign . . . 1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). [2614250]Here is another example how
compr_assigncan be used:-module(example). -feature(compr_assign, enable). -export([cat/1]). cat(Files) -> [Char || F <- Files, {ok, Bin} = file:read_file(F), Char <- unicode:characters_to_list(Bin)].Own Id: OTP-19927
Related Id(s): PR-9153*** HIGHLIGHT ***
*** POTENTIAL INCOMPATIBILITY ***
-
Removed the undocumented
dyn_erlutility.Own Id: OTP-19933
Related Id(s): PR-10573 -
The functions
erl_tar:add/3anderl_tar:add/4now accepts the{mode,Mode}option for setting the permission of the file.Own Id: OTP-19934
Related Id(s): PR-10524 -
Added
zstd:flush/2for flushing compressed data without closing the compression context. -
There will now be a warning when using the
catchoperator, which has been deprecated for a long time.It is recommended to instead use
try...catchbut is also possible to disable the warning by using thenowarn_deprecated_catchoption.Own Id: OTP-19938
Related Id(s): PR-10421*** HIGHLIGHT ***
-
Multi-valued comprehensions according to EEP 78 has been implemented.
Example:
> [I, -I || I <- lists:seq(1, 5)]. [1,-1,2,-2,3,-3,4,-4,5,-5]
Own Id: OTP-19942
Related Id(s): PR-9374*** HIGHLIGHT ***
-
There will now be a warning for matches that unify constructors, such as the following:
m({a,B} = {Y,Z}) -> . . .Such a match can be rewritten to:
m({a=Y,B=B}) -> . . .The compiler option
nowarn_match_alias_patscan be used to disable the warning.Own Id: OTP-19943
Related Id(s): PR-10433*** HIGHLIGHT ***
Full runtime dependencies of stdlib-8.0
compiler-5.0, crypto-4.5, erts-16.0.3, kernel-10.0, sasl-3.0, syntax_tools-3.2.1
syntax_tools-4.1
Improvements and New Features
-
The legacy
andandoroperators have been replaced withandalsoandorelse.Own Id: OTP-19744
Related Id(s): PR-10114, PR-10554, PR-10568, PR-10579, PR-10585, PR-10598 -
Multi-valued comprehensions according to EEP 78 has been implemented.
Example:
> [I, -I || I <- lists:seq(1, 5)]. [1,-1,2,-2,3,-3,4,-4,5,-5]
Own Id: OTP-19942
Related Id(s): PR-9374*** HIGHLIGHT ***
Full runtime dependencies of syntax_tools-4.1
compiler-9.0, erts-16.0, kernel-10.3, stdlib-8.0
tftp-1.3
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of tftp-1.3
erts-6.0, kernel-6.0, stdlib-5.0
tools-4.2
Fixed Bugs and Malfunctions
-
Fixed "unbalanced parenthesis" issue when pressing TAB in emacs erlang shell.
Improvements and New Features
-
Tools such as the debugger,
beam_lib, andxrefno longer support BEAM files created before OTP 13B.Own Id: OTP-19906
Related Id(s): PR-10519
Full runtime dependencies of tools-4.2
compiler-8.5, erts-15.0, erts-15.0, kernel-10.0, runtime_tools-2.1, stdlib-6.0
wx-2.6
Improvements and New Features
-
Vendor dependencies and OpenVEX statements in the otp repository is now scanned for vulnerabilities.
Own Id: OTP-19652
Related Id(s): PR-9790 -
Documentation about how to validate the SBOM using sigstore has been added.
Full runtime dependencies of wx-2.6
erts-12.0, kernel-8.0, stdlib-5.0
xmerl-2.2
Improvements and New Features
-
Only minor internal changes.
Own Id: OTP-19964
Full runtime dependencies of xmerl-2.2
erts-6.0, kernel-8.4, stdlib-2.5
Thanks to
Alexandre Rodrigues, Andreas Hasselberg, Bentheburrito, Bernhard M. Wiedemann, Daniel Gorin, Daniel Kukula, dependabot[bot], Eksperimental, erlang-bot-app[bot], felipe stival, Fernando Areias, Ievgen Pyrogov, Ilya Averyanov, Ilya Klyuchnikov, Jan Uhlig, Johannes Christ, Jonatan Männchen, José Valim, Loïc Hoguin, loscher, Maria Scott, Marko Mindek, matt, Mend Renovate, Michael Daniels, Michał Muskała, Olexandr88, Paul Guyot, Paulo F. Oliveira, Paulo Tomé, Preet, Richard Carlsson, Robert Ismo, Robin Morisset, Sam Weaver, Sébastien Saint-Sevin, Simon Cornish, Stefan Grundmann, Takeru Ohta, Vadim Yanitskiy, Vance Shipley, Wade Mealing, Wei Huang, yagogarea, Zabrane, наб