| Initial Release | OTP 29.0 |
| Git Tag | OTP-29.0 |
| Date | 2026-05-13 |
| Issue Id |
ERIERL-1314
ERIERL-1315
ERIERL-1319
|
| System | OTP |
| Release | 29 |
| Application |
|
| Potential Incompatibilities |
Highlights #
- OTP-19747
-
- Application(s):
- erts
- Related Id(s):
The JIT now generates better code for matching or creating binaries with multiple little-endian segments.
- OTP-19784
-
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. - OTP-19785
-
- Application(s):
- compiler, debugger, dialyzer, erts, stdlib
- Related Id(s):
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
- OTP-19809
-
- Application(s):
- compiler, dialyzer, erts
- Related Id(s):
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 - OTP-19826
-
- Application(s):
- stdlib
- Related Id(s):
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. - OTP-19842
-
- POTENTIAL INCOMPATIBILITY
In the default code path for the Erlang system, the current working directory (
.) is now in the last position instead of the first. - OTP-19866
-
- Application(s):
- compiler
- Related Id(s):
Function application is now left associative. That means one can now write:
f(X)(Y)instead of:
(f(X))(Y) - OTP-19887
-
- Application(s):
- otp
- Related Id(s):
The old-style type tests in guards (
integer,atom, and so on) have been scheduled for removal in Erlang/OTP 30. They have been deprecated for a long time. - OTP-19898
-
- Application(s):
- compiler, stdlib
- Related Id(s):
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. - OTP-19918
-
- Application(s):
- compiler
- Related Id(s):
There is a new option
warn_obsolete_bool_opthat instruct the compiler to emit warnings for theandandoroperators. It is recommended to instead use the modernandalsoandorelseoperators, or,and;in guards. - OTP-19922
-
- Application(s):
- stdlib
- Related Id(s):
graphis a new module that is a functional equivalent of thedigraphanddigraph_utilsmodules. - OTP-19927
-
- POTENTIAL INCOMPATIBILITY
Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). * exception error: bad filter 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)]. - OTP-19938
-
- Application(s):
- compiler, stdlib
- Related Id(s):
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…catch…endbut is also possible to disable the warning by using thenowarn_deprecated_catchoption. - OTP-19942
-
- Application(s):
- compiler, debugger, stdlib, syntax_tools
- Related Id(s):
Multi-valued comprehensions according to EEP 78 has been implemented.
Example:
> [I, -I || I <- lists:seq(1, 5)]. [1,-1,2,-2,3,-3,4,-4,5,-5] - OTP-19943
-
- Application(s):
- compiler, stdlib
- Related Id(s):
There will now be a warning for matches that unify constructors, such as the following:
m({a,B} = {Y,Z}) -> . . .Such a match can be rewritten to:
m({a=Y,B=Y}) -> . . .The compiler option
nowarn_match_alias_patscan be used to disable the warning. - OTP-19960
-
- Application(s):
- otp
There is no longer a 32-bit Erlang/OTP build for Windows.
- OTP-19963
-
- Application(s):
- erts, stdlib
- Related Id(s):
While the iteration order for maps is undefined, it is now guaranteed that all ways of iterating over maps provides the elements in the same order. That is, all of the following ways of iterating will produce the elements in the same order:
maps:keys/1maps:values/1maps:to_list/1maps:to_list(maps:iterator(M))- Map comprehension:
[{K,V} || K := V <- M]
- OTP-19965
-
- POTENTIAL INCOMPATIBILITY
The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides protection against both classical and quantum computer attacks while maintaining backward compatibility through automatic fallback to other algorithms when peers don’t support it.
- OTP-19968
-
- Application(s):
- compiler
- Related Id(s):
The compiler now generates more efficient code for map comprehensions with constant values that don’t depend on the generator, such as the following:
#{K => 42} || K <- List}. #{K => X || K <- List}. #{K => {X, Y} || K <- List}. - OTP-19969
-
- POTENTIAL INCOMPATIBILITY
The SSH daemon now defaults to disabled for shell and exec services, implementing the “secure by default” principle. This prevents authenticated users from executing arbitrary Erlang code unless explicitly configured.
Applications requiring shell or exec functionality must now explicitly enable:
%% Enable Erlang shell ssh:daemon(Port, [{shell, {shell, start, []}} | Options]) %% Enable Erlang term evaluation via exec ssh:daemon(Port, [{exec, erlang_eval} | Options]) %% Restore complete old behavior ssh:daemon(Port, [{shell, {shell, start, []}}, {exec, erlang_eval} | Options]) - OTP-19980
-
- Application(s):
- ftp, odbc
- Related Id(s):
The
odbcapplication is now deprecated and is planned to be removed in Erlang/OTP 30.The
ftpandct_ftpmodules are now deprecated and are planned to be removed in Erlang/OTP 30. - OTP-20004
-
- POTENTIAL INCOMPATIBILITY
The
arraymodule have been extended with several new functions. The internal representation have been changed to allow the new functionality and optimizations. Arrays serialized withterm_to_binary/1in previous releases are not compatible. - OTP-20015
-
- Application(s):
- erts, kernel
- Related Id(s):
Added support for socket functions
recvmmsg()andsendmmsg(). - OTP-20023
-
m:erl_tarwill use less memory when extracting large tar entries to disk. Instead of reading each tar entry into memory,erl_tarwill now stream data in chunks of 64KB. The chunk size is settable using the new{chunks,ChunkSize}option.The new
{max_size,Size}option will set a limit on the total size of extracted data to protect against filling up the disk.Checking of symlinks has been improved. Some symlinks that were safe (such as
dir/link -> ../file) used to be rejected. - OTP-20028
-
Added a new module called
io_ansithat allows the user to emit Virtual Terminal Sequences (a.k.a. ANSI sequences) to the terminal in order to add colors/styling to text or create fully-fledged terminal applications.io_ansiuses the local terminfo database in order to be as cross-platform compatible as possible.It also works across nodes so that if functions on a remote node call
io_ansi:fwrite/1it will use the destination terminal’s terminfo database to determine which sequences to emit. In practice, this means that you can call functions in a remote shell session that useio_ansiand it will properly detect the terminal sequences the target terminal can handle and will print using them correctly. - OTP-20032
-
- Application(s):
- tools
- Related Id(s):
The
ignore_xrefattribute has been handled as a post-analysis filter by build tools such as Rebar3. In this release,xrefitself does the filtering, ensuring that all tooling that callsxreffor any purpose can rely on these declarations to just work. - OTP-20034
-
New in this release is
ct_doctest, a module that allows the user to test documentation examples in Erlang module docs and documentation files.ct_doctest allows you to:
- Test code examples using shell syntax and their returns
- Test code examples that should fail
- Write example modules that are compiled and available in shell examples
- Plugin other documentation parsing engines so that examples in, for example,
edoc,asciidoc, and others can also be tested.
See the documentation for more details.
- OTP-20066
-
- Application(s):
- asn1, common_test, compiler, crypto, debugger, dialyzer, diameter, edoc, eunit, inets, kernel, megaco, mnesia, observer, odbc, os_mon, otp, parsetools, public_key, reltool, runtime_tools, sasl, ssh, ssl, stdlib, syntax_tools, tftp, tools, wx, xmerl
- Related Id(s):
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls). - OTP-20070
-
- POTENTIAL INCOMPATIBILITY
The post-quantum hybrid algorithm x25519mlkem768 is now the most preferred key exchange group in the default configuration.
Post-quantum hybrid algorithms secp384r1mlkem1024 and secp256r1mlkem768 are supported but have to be configured. The same goes for the plain post-quantum algorithms mlkem1024, mlkem768, and mlkem512.
The most preferred signature algorithms is now post-quantum algorithms ML-DSA followed by the fastest SLH-DSA (slh_dsa_sha2_256f) algorithm, if such a certificate is available in the configuration. Other SLH-DSA variants are also supported but are added to the end of the preferred list.
All these algorithms were available in OTP-28.4 but none of them were preferred and some of them changed default status.
- OTP-20072
-
The
jsonmodule now encodes and decodes quoted strings faster. Improvements of up to 55 percent has been measured when decoding JSON data with long strings.The
string:length/1,string:slice/2, andstring:slice/3functions have been optimized. For some strings, they can be up to twice as fast. - OTP-20078
-
- POTENTIAL INCOMPATIBILITY
The SFTP subsystem is no longer enabled by default when starting an SSH daemon. To enable it, add the subsystems option explicitly:
ssh:daemon(Port, [{subsystems, [ssh_sftpd:subsystem_spec([])]} | Options]) - OTP-20085
-
- Application(s):
- crypto, erts, public_key, tools
- Related Id(s):
The runtime system now supports generating encrypted crash dumps. See the description of
--enable-encrypted-crash-dumpsin [Building and Installing Erlang/OTP]. - OTP-20087
-
- Application(s):
- ssl
- Related Id(s):
There is a new Hardening guide giving guidelines on how to strengthen the security for the
sslapplication. - OTP-20133
-
- Application(s):
- inets
- Related Id(s):
There is a new Hardening guide with advice for configuring Inets to be more secure.
Potential Incompatibilities #
- OTP-19695
-
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. - OTP-19801
-
- Application(s):
- ssh
- Related Id(s):
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). - OTP-19807
-
- Application(s):
- mnesia
- Related Id(s):
The
mnesia_registrymodule has been removed. - OTP-19842
-
- HIGHLIGHT
In the default code path for the Erlang system, the current working directory (
.) is now in the last position instead of the first. - OTP-19927
-
- HIGHLIGHT
Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). * exception error: bad filter 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)]. - OTP-19965
-
- HIGHLIGHT
The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides protection against both classical and quantum computer attacks while maintaining backward compatibility through automatic fallback to other algorithms when peers don’t support it.
- OTP-19969
-
- HIGHLIGHT
The SSH daemon now defaults to disabled for shell and exec services, implementing the “secure by default” principle. This prevents authenticated users from executing arbitrary Erlang code unless explicitly configured.
Applications requiring shell or exec functionality must now explicitly enable:
%% Enable Erlang shell ssh:daemon(Port, [{shell, {shell, start, []}} | Options]) %% Enable Erlang term evaluation via exec ssh:daemon(Port, [{exec, erlang_eval} | Options]) %% Restore complete old behavior ssh:daemon(Port, [{shell, {shell, start, []}}, {exec, erlang_eval} | Options]) - OTP-19975
-
- Application(s):
- erts
- Related Id(s):
Changed
ets:update_counter/4andets:update_element/4to always reject default tuples smaller than thekeyposof the table. Such keyless tuples are now rejected even if the key exists in the table and the default tuple would not be used. This is a subtle semantic change but is a nicer behavior for development and testing as it will detect faulty default tuple arguments earlier. - OTP-19995
-
- Application(s):
- ssh
- Related Id(s):
Added explicit size validation guards for pre-authentication SSH messages to improve defense-in-depth against DoS attacks. Messages now have per-field size limits based on RFC specifications:
- Transport layer messages (DISCONNECT, IGNORE, DEBUG)
- Key exchange messages (DH, ECDH, DH-GEX)
- Service request messages (SERVICE_REQUEST, SERVICE_ACCEPT, EXT_INFO)
This change enhances the existing 256KB global packet size limit with granular per-message validation. Compliant implementations are not affected.
- OTP-20004
-
- HIGHLIGHT
The
arraymodule have been extended with several new functions. The internal representation have been changed to allow the new functionality and optimizations. Arrays serialized withterm_to_binary/1in previous releases are not compatible. - OTP-20019
-
- Application(s):
- ssh
- Related Id(s):
The SFTP subsystem
rootoption now properly rejects relative paths at daemon startup. Previously, relative paths would cause unpredictable behavior as file operations resolved relative to the Erlang VM’s current working directory. The option now requires an absolute path or empty string. - OTP-20061
-
- Application(s):
- stdlib
- Related Id(s):
The
gb_sets:from_ordset/1andgb_trees:from_orddict/1functions would trust their inputs. If the input contained duplicates or was not properly sorted, the resulting gb_set or gb_tree would be invalid, and any number of interesting problems could occur.In this release, these functions will raise an exception if their input is not valid. That could mean that incorrect programs that seemed to work could now stop working altogether.
There is also a new
gb_trees:from_list/1function for directly creating a gb_tree from a list. - OTP-20070
-
- HIGHLIGHT
The post-quantum hybrid algorithm x25519mlkem768 is now the most preferred key exchange group in the default configuration.
Post-quantum hybrid algorithms secp384r1mlkem1024 and secp256r1mlkem768 are supported but have to be configured. The same goes for the plain post-quantum algorithms mlkem1024, mlkem768, and mlkem512.
The most preferred signature algorithms is now post-quantum algorithms ML-DSA followed by the fastest SLH-DSA (slh_dsa_sha2_256f) algorithm, if such a certificate is available in the configuration. Other SLH-DSA variants are also supported but are added to the end of the preferred list.
All these algorithms were available in OTP-28.4 but none of them were preferred and some of them changed default status.
- OTP-20076
-
The old Tcl-based implementation of
erl_errno_id()has been replaced by our own implementation now supporting moreerrnovalues on modern operating systems. It also returns the string"errno_<ERRNO_INTEGER>"corresponding to the integer given as argument if theerrnointeger is unknown instead of as previously just return the string"unknown".The result of
erl_errno_id()is often converted into an atom and passed as an error from a driver or a NIF. - OTP-20078
-
- HIGHLIGHT
The SFTP subsystem is no longer enabled by default when starting an SSH daemon. To enable it, add the subsystems option explicitly:
ssh:daemon(Port, [{subsystems, [ssh_sftpd:subsystem_spec([])]} | Options]) - OTP-20080
-
- Application(s):
- ssl
- Related Id(s):
Secure renegotiation for TLS-1.2 specified in RFC 5746 from 2010 is now always used. The interoperability fallback option
{secure_renegotiate,SecureRenegotiate}is no longer needed. - OTP-20095
-
The
erlang:suspend_process/1anderlang:suspend_process/2BIFs now also suspend BIF timers that will send messages to the process if the timer was created using the PID of the process as destination. Timers created using registered names are not affected. - OTP-20102
-
The TOS handling on socket has been significantlyupdated and improved. Socket did not properly handle set, get and recv (cmsg) of TOS.
Note that the returned TOS value has been changed. It was previously an atom or an integer. Now it is a map with different interpretations of the TOS octet. See the documentation.
OTP-29.0 #
- OTP-20111
-
The
start_erlscript will now work on embedded systems. - OTP-19763
-
- Related Id(s):
-
PR-10145, PR-10166, PR-10168, PR-10189, PR-10193, PR-10195, PR-10197, PR-10202, OTP-19652, OTP-19775, OTP-19779
Vendor dependencies and OpenVEX statements in the
otprepository is now scanned for vulnerabilities. It is verified that OTP security issues reported at Github exist in the published OpenVEX statements, and issues are automatically opened in theotprepository if vendor vulnerabilities are detected. - OTP-19766
-
Documentation about how to validate the SBOM using sigstore has been added.
- OTP-19887
-
- HIGHLIGHT
The old-style type tests in guards (
integer,atom, and so on) have been scheduled for removal in Erlang/OTP 30. They have been deprecated for a long time. - OTP-19933
-
- Related Id(s):
Removed the undocumented
dyn_erlutility. - OTP-19960
-
There is no longer a 32-bit Erlang/OTP build for Windows.
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls). - OTP-20092
-
- Related Id(s):
The Upcoming Potential Incompatibilities page has been updated to note that in Erlang/OTP 30,
erlang:fun_info(Fun, pid)will no longer retrieve a pid, but will raise abadargexception. - OTP-20103
-
- Related Id(s):
Add security improvements to GitHub Actions workflows based on findings from
zizmor, a GitHub Actions security linter. - OTP-20132
-
- Related Id(s):
Improve mermaid diagram rending in documentation.
asn1-5.5 #
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of asn1-5.5
erts-14.0, kernel-9.0, stdlib-5.0
common_test-1.31 #
- OTP-20010
-
- Related Id(s):
Improved support for QuickCheck when writing property tests.
- OTP-19744
-
- Related Id(s):
-
PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730
The legacy
andandoroperators have been replaced with other language constructs. - OTP-19910
-
- Related Id(s):
'EXIT'messages are now formatted in the same way asbadmatcherrors. - OTP-19925
-
Error notifications now contain the name of the source file in which the error occurred.
- OTP-20034
-
- HIGHLIGHT
New in this release is
ct_doctest, a module that allows the user to test documentation examples in Erlang module docs and documentation files.ct_doctest allows you to:
- Test code examples using shell syntax and their returns
- Test code examples that should fail
- Write example modules that are compiled and available in shell examples
- Plugin other documentation parsing engines so that examples in, for example,
edoc,asciidoc, and others can also be tested.
See the documentation for more details.
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of common_test-1.31
compiler-10.0, crypto-4.5, debugger-4.1, erts-7.0, ftp-1.0, inets-6.0, kernel-11.0, observer-2.1, runtime_tools-1.8.16, sasl-2.5, snmp-5.1.2, ssh-4.0, stdlib-8.0, syntax_tools-1.7, tools-3.2, xmerl-1.3.8
compiler-10.0 #
- OTP-19751
-
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. - OTP-19991
-
beam_lib:strip/1will now retain the Beam debug information chunk produced by thebeam_debug_infooption. The chunk will also be retained when combing thebeam_debug_infooption with the undocumentedslimoption.The runtime system will no longer crash when attempting to load modules that have been compiled with
beam_debug_infobut lack the actual Beam debug info chunk. - OTP-19672
-
- Related Id(s):
In comprehensions, a generator that builds a list with a single element will now be optimized to avoid building and matching the list. Example:
[H || E <- List, H <- [erlang:phash2(E)], H rem 10 =:= 0] - OTP-19784
-
- HIGHLIGHT
In the documentation for the
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. - OTP-19785
-
- HIGHLIGHT
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
- OTP-19809
-
- HIGHLIGHT
The guard BIF
is_integer/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 - OTP-19866
-
- HIGHLIGHT
Function application is now left associative. That means one can now write:
f(X)(Y)instead of:
(f(X))(Y) - OTP-19898
-
- HIGHLIGHT
There will now be a warning when exporting variables out of a subexpression. For example:
case file:open(File, AllOpts = [write,{encoding,utf8}]) of {ok,Fd} -> {Fd,AllOpts} 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. - OTP-19918
-
- HIGHLIGHT
There is a new option
warn_obsolete_bool_opthat instruct the compiler to emit warnings for theandandoroperators. It is recommended to instead use the modernandalsoandorelseoperators, or,and;in guards. - OTP-19927
-
- HIGHLIGHT, POTENTIAL INCOMPATIBILITY
Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). * exception error: bad filter 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)]. - OTP-19938
-
- HIGHLIGHT
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…catch…endbut is also possible to disable the warning by using thenowarn_deprecated_catchoption. - OTP-19942
-
- HIGHLIGHT
Multi-valued comprehensions according to EEP 78 has been implemented.
Example:
> [I, -I || I <- lists:seq(1, 5)]. [1,-1,2,-2,3,-3,4,-4,5,-5] - OTP-19943
-
- HIGHLIGHT
There will now be a warning for matches that unify constructors, such as the following:
m({a,B} = {Y,Z}) -> . . .Such a match can be rewritten to:
m({a=Y,B=Y}) -> . . .The compiler option
nowarn_match_alias_patscan be used to disable the warning. - OTP-19968
-
- HIGHLIGHT
The compiler now generates more efficient code for map comprehensions with constant values that don’t depend on the generator, such as the following:
#{K => 42} || K <- List}. #{K => X || K <- List}. #{K => {X, Y} || K <- List}. - OTP-20020
-
Compilation times of modules with a huge number of calls to
element/2has been improved. - OTP-20048
-
- Related Id(s):
The format of the debug information stored by the
beam_debug_infooption (used by the edb debugger) has been updated to more easily extendible and to contain more information about call targets. (See the linked PR for more details.) - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of compiler-10.0
crypto-5.1, erts-13.0, kernel-8.4, stdlib-8.0
crypto-5.9 #
- OTP-20025
-
- Related Id(s):
Fixed
crypto:hash_equals/2and FIPS when crypto is statically linked to the beam (with--enable-static-nifsand--disable-dynamic-ssl-lib). - OTP-19882
-
- Related Id(s):
-
PR-10453, OTP-19827
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. - OTP-20035
-
- Related Id(s):
In interactive mode, application
cryptois automatically loaded when thecryptomodule is loaded. This will ensure that the correct value of configuration parameterfips_modeis used to initialize OpenSSL if modulecryptois called/loaded before the applicationcryptohas been loaded. In embedded mode, modulecryptowill fail to load if the application has not been loaded. - OTP-20036
-
- Related Id(s):
OpenSSL engine support has been removed on Windows.
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls). - OTP-20085
-
- HIGHLIGHT
The runtime system now supports generating encrypted crash dumps. See the description of
--enable-encrypted-crash-dumpsin [Building and Installing Erlang/OTP].
Full runtime dependencies of crypto-5.9
erts-9.0, kernel-6.0, stdlib-3.9
debugger-7.0 #
- OTP-19785
-
- HIGHLIGHT
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
- OTP-19906
-
- Related Id(s):
Tools such as the debugger,
beam_lib, andxrefno longer support BEAM files created before OTP 13B. - OTP-19942
-
- HIGHLIGHT
Multi-valued comprehensions according to EEP 78 has been implemented.
Example:
> [I, -I || I <- lists:seq(1, 5)]. [1,-1,2,-2,3,-3,4,-4,5,-5] - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of debugger-7.0
compiler-8.0, erts-15.0, kernel-10.0, stdlib-7.0, wx-2.0
dialyzer-6.0 #
- OTP-19785
-
- HIGHLIGHT
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
- OTP-19809
-
- HIGHLIGHT
The guard BIF
is_integer/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 - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of dialyzer-6.0
compiler-10.0, erts-12.0, kernel-8.0, stdlib-5.0, syntax_tools-2.0
diameter-2.7 #
- OTP-19744
-
- Related Id(s):
-
PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730
The legacy
andandoroperators have been replaced with other language constructs. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of diameter-2.7
erts-10.0, kernel-3.2, ssl-9.0, stdlib-5.0
edoc-1.5 #
- OTP-20030
-
- Related Id(s):
Changed behavior of EDoc so that when a module defines a private type and a private function spec uses it, that type no longer gets included in the EDoc chunk.
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of edoc-1.5
erts-11.0, inets-5.10, kernel-7.0, stdlib-4.0, syntax_tools-2.0, xmerl-1.3.7
eldap-1.3 #
- OTP-19964
-
Only minor internal changes.
Full runtime dependencies of eldap-1.3
asn1-3.0, erts-6.0, kernel-3.0, ssl-5.3.4, stdlib-3.4
erl_interface-5.8 #
- OTP-19734
-
Improved name consistency of EPMD protocol messages in documentation and code. Renamed
PORT_PLEASE2_REQtoPORT2_REQand added prefixEPMD_. - OTP-20045
-
- Related Id(s):
Replaced embedded OpenSSL MD5 implementation.
- OTP-16607
-
- Related Id(s):
-
OTP-16608
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.
erts-17.0 #
- OTP-19751
-
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. - OTP-19874
-
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. - OTP-19935
-
- Related Id(s):
The
-nocookieoption forerlis now documented. - OTP-19991
-
beam_lib:strip/1will now retain the Beam debug information chunk produced by thebeam_debug_infooption. The chunk will also be retained when combing thebeam_debug_infooption with the undocumentedslimoption.The runtime system will no longer crash when attempting to load modules that have been compiled with
beam_debug_infobut lack the actual Beam debug info chunk. - OTP-20026
-
- Related Id(s):
Fixed potential symbol clashing on MacOS by passing
RTLD_LOCALtodlopen. This will make symbols to not be resolvable between subsequently loaded NIF/drivers, which is the default behavior on Linux and BSD. - OTP-20088
-
- Related Id(s):
The
configurescript used to callisfinite()with argument0. That could fail on some platforms. This has been changed to callisfinite()with1.0instead. - OTP-20102
-
- POTENTIAL INCOMPATIBILITY
The TOS handling on socket has been significantlyupdated and improved. Socket did not properly handle set, get and recv (cmsg) of TOS.
Note that the returned TOS value has been changed. It was previously an atom or an integer. Now it is a map with different interpretations of the TOS octet. See the documentation.
- OTP-20123
-
Fixed
erlang:md5_initto always return the same deterministic context binary. Only an issue in OTP 28.5 when OTP was built with--disable-builtin-opensslor--enable-use-embedded-3pp-alternatives. - OTP-20126
-
- Related Id(s):
Added explicit configure test for C++ function
std::to_charsif options--disable-builtin-ryuor--enable-use-embedded-3pp-alternativesis used. - OTP-19643
-
- Related Id(s):
The exported name space of the
beamexecutable has been cleaned to only expose symbols of documented interfaces like NIF and driver APIs. This will avoid accidental name clashes with, for example, our statically linked variants of PCRE2 and ZSTD. NIFs and drivers that abuse undocumented internal interfaces will fail to load due to this change. - OTP-19734
-
Improved name consistency of EPMD protocol messages in documentation and code. Renamed
PORT_PLEASE2_REQtoPORT2_REQand added prefixEPMD_. - OTP-19747
-
- HIGHLIGHT
The JIT now generates better code for matching or creating binaries with multiple little-endian segments.
- OTP-19784
-
- HIGHLIGHT
In the documentation for the
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. - OTP-19785
-
- HIGHLIGHT
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
- OTP-19793
-
- Related Id(s):
Task stealing between schedulers has been further optimized.
- OTP-19809
-
- 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 - OTP-19811
-
- Related Id(s):
Calls to
trace:info(_, {M,F,A}, Item), withItemascall_time,call_memory, orall, will no longer block all scheduler threads from running. - OTP-19834
-
Full support for SCTP in
socket. Not (yet) supported for FreeBSD. - OTP-19842
-
- POTENTIAL INCOMPATIBILITY
In the default code path for the Erlang system, the current working directory (
.) is now in the last position instead of the first. - OTP-19906
-
- Related Id(s):
Tools such as the debugger,
beam_lib, andxrefno longer support BEAM files created before OTP 13B. - OTP-19919
-
- Related Id(s):
Optimized ETS named table lookup scalability by replacing read locks with lockless atomic operations.
- OTP-19933
-
- Related Id(s):
Removed the undocumented
dyn_erlutility. - OTP-19936
-
Added
zstd:flush/2for flushing compressed data without closing the compression context. - OTP-19963
-
- HIGHLIGHT
While the iteration order for maps is undefined, it is now guaranteed that all ways of iterating over maps provides the elements in the same order. That is, all of the following ways of iterating will produce the elements in the same order:
maps:keys/1maps:values/1maps:to_list/1maps:to_list(maps:iterator(M))- Map comprehension:
[{K,V} || K := V <- M]
- OTP-19966
-
- Related Id(s):
Improved the performance of code loading.
- OTP-19975
-
- POTENTIAL INCOMPATIBILITY
Changed
ets:update_counter/4andets:update_element/4to always reject default tuples smaller than thekeyposof the table. Such keyless tuples are now rejected even if the key exists in the table and the default tuple would not be used. This is a subtle semantic change but is a nicer behavior for development and testing as it will detect faulty default tuple arguments earlier. - OTP-20002
-
- Related Id(s):
Improved compatibility with systems that lack certain shell utilities.
- OTP-20003
-
It was previously not possible to check on the socket nif load result. A successful load was self-evident, but a failure was only visible from the fact that most
socketfunctions failed withnotsup. This has now been improved such that the (socket nif) load result is visible in the info map (fromsocket:info/0). - OTP-20013
-
The default for the
configureoption--{enable,disable}-use-embedded-3pp-alternativeshas changed and the subset of embedded third-party products (3pps) affected by it has also changed. Currently this option affectszstd,zlib,ryu(withSTL). By defaultzstdandzlibavailable on the OS will be used if they fulfill the requirements. The builtinryu(withSTL) will be used by default. The 3ppsopensslandtclthat previously were present have been replaced by our own implementations.Requirements for the affected 3pps alternatives are still the same as before:
zstd- Static library and include files of at least version 1.5.6 needs to be available.zlib- Library and include files of at least version 1.2.5 needs to be available.ryu(withSTL) - A usable C++ compiler with C++17 library support.
- OTP-20015
-
- HIGHLIGHT
Added support for socket functions
recvmmsg()andsendmmsg(). - OTP-20016
-
- Related Id(s):
There is a new NIF function
enif_term_size(). - OTP-20017
-
- Related Id(s):
Call trace match specs can use
[Arg1, Arg2 | '_']syntax to match functions with at least N number of arguments. - OTP-20045
-
- Related Id(s):
Replaced embedded OpenSSL MD5 implementation.
- OTP-20048
-
- Related Id(s):
The format of the debug information stored by the
beam_debug_infooption (used by the edb debugger) has been updated to more easily extendible and to contain more information about call targets. (See the linked PR for more details.) - OTP-20069
-
- Related Id(s):
There are new functions
erlang:exit_signal/2,3replacing the olderlang:exit/2,3. The primary purpose is better naming to distinguish between exit exceptions and exit signals. The newexit_signalfunctions will also avoid a historical quirk when a process sends an exit signal to itself with reasonnormal.The old
erlang:exit/2,3will work as before, but it is recommended to use the newexit:signal/2,3functions for new or modified code. Deprecation oferlang:exit/2,3with a compiler warning is planned for OTP 30. - OTP-20076
-
- POTENTIAL INCOMPATIBILITY
The old Tcl-based implementation of
erl_errno_id()has been replaced by our own implementation now supporting moreerrnovalues on modern operating systems. It also returns the string"errno_<ERRNO_INTEGER>"corresponding to the integer given as argument if theerrnointeger is unknown instead of as previously just return the string"unknown".The result of
erl_errno_id()is often converted into an atom and passed as an error from a driver or a NIF. - OTP-20085
-
- HIGHLIGHT
The runtime system now supports generating encrypted crash dumps. See the description of
--enable-encrypted-crash-dumpsin [Building and Installing Erlang/OTP]. - OTP-20090
-
- Related Id(s):
When implementing an alternate distribution implementors can now use an alternate handshake complete fun of arity 4 if needed.
- OTP-20095
-
- POTENTIAL INCOMPATIBILITY
The
erlang:suspend_process/1anderlang:suspend_process/2BIFs now also suspend BIF timers that will send messages to the process if the timer was created using the PID of the process as destination. Timers created using registered names are not affected. - OTP-20115
-
- Related Id(s):
Added support for socket option SO_TIMESTAMPNS (not available on all platforms).
Full runtime dependencies of erts-17.0
kernel-9.0, sasl-3.3, stdlib-4.1
et-1.8 #
- OTP-19964
-
Only minor internal changes.
Full runtime dependencies of et-1.8
erts-9.0, kernel-5.3, runtime_tools-1.10, stdlib-3.4, wx-1.2
eunit-2.11 #
- OTP-19997
-
- Related Id(s):
Added
randomDelaymacro. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of eunit-2.11
erts-9.0, kernel-11.0, stdlib-6.0
ftp-1.2.5 #
- OTP-19980
-
- HIGHLIGHT
The
odbcapplication is now deprecated and is planned to be removed in Erlang/OTP 30.The
ftpandct_ftpmodules are now deprecated and are planned to be removed in Erlang/OTP 30.
Full runtime dependencies of ftp-1.2.5
erts-7.0, kernel-6.0, runtime_tools-1.15.1, ssl-10.2, stdlib-3.5
inets-9.7 #
- OTP-20128
-
- Related Id(s):
-
ERIERL-1314, PR-11079
A call to httpd:reload_config/2 now validates the new configuration before removing the old one, leaving the server running in case of faulty config, instead of putting it in an unrecoverable state.
- OTP-19587
-
A new option
max_connections_openhas been added to thehttpcHTTP client profile configuration. It limits the maximum number of concurrent HTTP handler processes that can be open simultaneously.When the limit is reached, new requests are queued internally and started automatically as existing handlers complete. This prevents bandwidth exhaustion in high-load scenarios where too many parallel connections cause remote servers to close sockets before transfers finish (the socket_closed_remotely error).
The option can be set via
httpc:set_options([{max_connections_open, 10}], Profile).The default value is
infinity(unlimited), preserving backward compatibility. The value must be a positive integer orinfinityand must be greater than or equal tomax_sessions. - OTP-19744
-
- Related Id(s):
-
PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730
The legacy
andandoroperators have been replaced with other language constructs. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls). - OTP-20071
-
- Related Id(s):
The
mod_cgiandmod_actionsmodules are now deprecated and are scheduled to be removed in OTP 30. - OTP-20133
-
- HIGHLIGHT
There is a new Hardening guide with advice for configuring Inets to be more secure.
Full runtime dependencies of inets-9.7
erts-14.0, kernel-9.0, mnesia-4.12, public_key-1.13, runtime_tools-1.8.14, ssl-9.0, stdlib-5.0, stdlib-6.0
kernel-11.0 #
- OTP-19695
-
- POTENTIAL INCOMPATIBILITY
Fixed (
inet) module selection when calling (gen_tcp) listen and connect and (gen_udp) open. Depending on the order of the options, the module option (tcp_moduleorudp_module) was sometimes ignored. - OTP-19917
-
- Related Id(s):
The TCP/UDP compatibility layer has been fixed so that
inet_backend = socketnow supports socket optionsreuseportandreuseport_lbforgen_tcpandgen_udp. - OTP-20054
-
Some errors in config files for the application controller would result in very cryptic crashes. Error handling has been improved to ensure that the file name and line number of the offending token are now printed.
- OTP-20102
-
- POTENTIAL INCOMPATIBILITY
The TOS handling on socket has been significantlyupdated and improved. Socket did not properly handle set, get and recv (cmsg) of TOS.
Note that the returned TOS value has been changed. It was previously an atom or an integer. Now it is a map with different interpretations of the TOS octet. See the documentation.
- OTP-20124
-
- Related Id(s):
Replaced a sleep clause in user_drv shutdown with a flush of the output buffer.
- OTP-19708
-
- Related Id(s):
Added an option to set the
erl_boot_serverlisten port. - OTP-19713
-
- Related Id(s):
The memory footprint of some supervisors has been reduced by purging obsoleted data when the supervisor is transitioning to and from hibernation.
- OTP-19734
-
Improved name consistency of EPMD protocol messages in documentation and code. Renamed
PORT_PLEASE2_REQtoPORT2_REQand added prefixEPMD_. - OTP-19744
-
- Related Id(s):
-
PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730
The legacy
andandoroperators have been replaced with other language constructs. - OTP-19786
-
- Related Id(s):
Refactored a
kernel_load_completedclause in theinitmodule for conciseness. - OTP-19834
-
Full support for SCTP in
socket. Not (yet) supported for FreeBSD. - OTP-19842
-
- POTENTIAL INCOMPATIBILITY
In the default code path for the Erlang system, the current working directory (
.) is now in the last position instead of the first. - OTP-20003
-
It was previously not possible to check on the socket nif load result. A successful load was self-evident, but a failure was only visible from the fact that most
socketfunctions failed withnotsup. This has now been improved such that the (socket nif) load result is visible in the info map (fromsocket:info/0). - OTP-20015
-
- HIGHLIGHT
Added support for socket functions
recvmmsg()andsendmmsg(). - OTP-20028
-
- HIGHLIGHT
Added a new module called
io_ansithat allows the user to emit Virtual Terminal Sequences (a.k.a. ANSI sequences) to the terminal in order to add colors/styling to text or create fully-fledged terminal applications.io_ansiuses the local terminfo database in order to be as cross-platform compatible as possible.It also works across nodes so that if functions on a remote node call
io_ansi:fwrite/1it will use the destination terminal’s terminfo database to determine which sequences to emit. In practice, this means that you can call functions in a remote shell session that useio_ansiand it will properly detect the terminal sequences the target terminal can handle and will print using them correctly. - OTP-20029
-
- Related Id(s):
Polished the documentation groups, essentially removed groups that did nothing but obscure the documentation.
- OTP-20055
-
- Related Id(s):
Added a new behavior,
data_publisher, for building eventually consistent, replicated data stores across distributed nodes. This is a generalization of thepgmodule. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls). - OTP-20090
-
- Related Id(s):
When implementing an alternate distribution implementors can now use an alternate handshake complete fun of arity 4 if needed.
- OTP-20115
-
- Related Id(s):
Added support for socket option SO_TIMESTAMPNS (not available on all platforms).
- OTP-20117
-
- Related Id(s):
Added a flag
log_missed_net_ticks = true | falsethat controls whether a warning is logged for each missed sub-tick on a distribution connection. A sub-tick is missed when no data has been received from a connected node during one tick interval. A warning is emitted on every subsequent missed sub-tick until the node is declared down afternet_tickintensityconsecutive missed sub-ticks, at which point a final timeout warning is always logged regardless of this setting. Defaults tofalse.
Full runtime dependencies of kernel-11.0
crypto-5.8, erts-17.0, sasl-3.0, stdlib-8.0
megaco-4.9 #
- OTP-20114
-
- Related Id(s):
Running Dialyzer on Windows in an Erlang repo, causes Dialyzer warnings for the megaco_flex_scanner module. This is because the flex scanner is not built on Windows. These warnings are now suppressed.
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of megaco-4.9
asn1-3.0, debugger-4.0, erts-12.0, et-1.5, kernel-8.0, runtime_tools-1.8.14, stdlib-2.5
mnesia-4.26 #
- OTP-19611
-
mnesianow has new functionsselect_reverse/1-6supporting iteration over tables in reverse order. - OTP-19807
-
- POTENTIAL INCOMPATIBILITY
The
mnesia_registrymodule has been removed. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of mnesia-4.26
erts-9.0, kernel-5.3, stdlib-5.0
observer-2.19 #
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of observer-2.19
erts-15.0, et-1.5, kernel-10.0, runtime_tools-2.1, stdlib-5.0, wx-2.3
odbc-2.17 #
- OTP-19980
-
- HIGHLIGHT
The
odbcapplication is now deprecated and is planned to be removed in Erlang/OTP 30.The
ftpandct_ftpmodules are now deprecated and are planned to be removed in Erlang/OTP 30. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of odbc-2.17
erts-6.0, kernel-3.0, stdlib-2.0
os_mon-2.12 #
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of os_mon-2.12
erts-14.0, kernel-9.0, sasl-4.2.1, stdlib-5.0
parsetools-2.8 #
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of parsetools-2.8
erts-6.0, kernel-3.0, stdlib-3.4
public_key-1.21 #
- OTP-19744
-
- Related Id(s):
-
PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730
The legacy
andandoroperators have been replaced with other language constructs. - OTP-19822
-
- Related Id(s):
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. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls). - OTP-20085
-
- HIGHLIGHT
The runtime system now supports generating encrypted crash dumps. See the description of
--enable-encrypted-crash-dumpsin [Building and Installing Erlang/OTP].
Full runtime dependencies of public_key-1.21
asn1-5.0, crypto-5.8, erts-13.0, kernel-8.0, stdlib-4.0
reltool-1.1 #
- OTP-19933
-
- Related Id(s):
Removed the undocumented
dyn_erlutility. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of reltool-1.1
erts-15.0, kernel-9.0, sasl-4.2.1, stdlib-5.0, tools-2.6.14, wx-2.3
runtime_tools-2.4 #
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of runtime_tools-2.4
erts-16.0, kernel-10.0, mnesia-4.12, stdlib-6.0
sasl-4.4 #
- OTP-19949
-
- Related Id(s):
UNC paths are now handled on Windows.
- OTP-19933
-
- Related Id(s):
Removed the undocumented
dyn_erlutility. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of sasl-4.4
erts-15.0, kernel-6.0, stdlib-4.0, tools-2.6.14
snmp-5.20.3 #
- OTP-19744
-
- Related Id(s):
-
PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730
The legacy
andandoroperators have been replaced with other language constructs.
Full runtime dependencies of snmp-5.20.3
asn1-5.4, crypto-4.6, erts-12.0, kernel-8.0, mnesia-4.12, runtime_tools-1.8.14, stdlib-5.0
ssh-6.0 #
- OTP-19982
-
- Related Id(s):
Password-based authentication has been updated to follow current security best practices. Key-based authentication remains recommended for production systems.
- OTP-19995
-
- POTENTIAL INCOMPATIBILITY
Added explicit size validation guards for pre-authentication SSH messages to improve defense-in-depth against DoS attacks. Messages now have per-field size limits based on RFC specifications:
- Transport layer messages (DISCONNECT, IGNORE, DEBUG)
- Key exchange messages (DH, ECDH, DH-GEX)
- Service request messages (SERVICE_REQUEST, SERVICE_ACCEPT, EXT_INFO)
This change enhances the existing 256KB global packet size limit with granular per-message validation. Compliant implementations are not affected.
- OTP-20019
-
- POTENTIAL INCOMPATIBILITY
The SFTP subsystem
rootoption now properly rejects relative paths at daemon startup. Previously, relative paths would cause unpredictable behavior as file operations resolved relative to the Erlang VM’s current working directory. The option now requires an absolute path or empty string. - OTP-20127
-
- Related Id(s):
Dynamic atom creation has been replaced with static lookups in
ssh_transportandssh_connection, using a dedicated OID-to-algorithm mapping function inssh_message. - OTP-19709
-
- Related Id(s):
Using KEX strict extension names as specified in draft-ietf-sshm-strict-kex-00. Pre standard names are still supported.
- OTP-19750
-
Added an
aliveoption to detect and terminate dead SSH connections. Functionally equivalent to OpenSSH’s ClientAlive/ServerAlive settings. - OTP-19801
-
- POTENTIAL INCOMPATIBILITY
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). - OTP-19965
-
- HIGHLIGHT, POTENTIAL INCOMPATIBILITY
The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides protection against both classical and quantum computer attacks while maintaining backward compatibility through automatic fallback to other algorithms when peers don’t support it.
- OTP-19969
-
- HIGHLIGHT, POTENTIAL INCOMPATIBILITY
The SSH daemon now defaults to disabled for shell and exec services, implementing the “secure by default” principle. This prevents authenticated users from executing arbitrary Erlang code unless explicitly configured.
Applications requiring shell or exec functionality must now explicitly enable:
%% Enable Erlang shell ssh:daemon(Port, [{shell, {shell, start, []}} | Options]) %% Enable Erlang term evaluation via exec ssh:daemon(Port, [{exec, erlang_eval} | Options]) %% Restore complete old behavior ssh:daemon(Port, [{shell, {shell, start, []}}, {exec, erlang_eval} | Options]) - OTP-20031
-
- Related Id(s):
Added SFTP resource limits section to hardening guide covering
max_handles,max_path, andmax_fileswith deployment recommendations. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls). - OTP-20078
-
- HIGHLIGHT, POTENTIAL INCOMPATIBILITY
The SFTP subsystem is no longer enabled by default when starting an SSH daemon. To enable it, add the subsystems option explicitly:
ssh:daemon(Port, [{subsystems, [ssh_sftpd:subsystem_spec([])]} | Options]) - OTP-20079
-
- Related Id(s):
The SSH hardening guide has been improved with a timeout overview table replacing the previous image, corrected terminology (“authenticated” instead of “authorized”), and new examples for loopback binding, public key user checking, and password lockout using ETS.
- OTP-20099
-
- Related Id(s):
With this change usage of
zlibcompression algorithm in SSH is deprecated and scheduled for removal in OTP 30.0 - OTP-20100
-
- Related Id(s):
Updated SSH documentation with current OTP 29 algorithm defaults, including the new mlkem768x25519-sha256 post-quantum key exchange. Fixed stale examples, typos, and improved document structure.
Full runtime dependencies of ssh-6.0
crypto-5.7, erts-14.0, kernel-10.3, public_key-1.6.1, runtime_tools-1.15.1, stdlib-8.0
ssl-11.7 #
- OTP-20116
-
Add missing clauses to ssl_handshake:extension_value/1. If an hello extension, missing a handling clause was present in a paused handshake, the handshake would fail.
- OTP-19744
-
- Related Id(s):
-
PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730
The legacy
andandoroperators have been replaced with other language constructs. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls). - OTP-20070
-
- HIGHLIGHT, POTENTIAL INCOMPATIBILITY
The post-quantum hybrid algorithm x25519mlkem768 is now the most preferred key exchange group in the default configuration.
Post-quantum hybrid algorithms secp384r1mlkem1024 and secp256r1mlkem768 are supported but have to be configured. The same goes for the plain post-quantum algorithms mlkem1024, mlkem768, and mlkem512.
The most preferred signature algorithms is now post-quantum algorithms ML-DSA followed by the fastest SLH-DSA (slh_dsa_sha2_256f) algorithm, if such a certificate is available in the configuration. Other SLH-DSA variants are also supported but are added to the end of the preferred list.
All these algorithms were available in OTP-28.4 but none of them were preferred and some of them changed default status.
- OTP-20080
-
- POTENTIAL INCOMPATIBILITY
Secure renegotiation for TLS-1.2 specified in RFC 5746 from 2010 is now always used. The interoperability fallback option
{secure_renegotiate,SecureRenegotiate}is no longer needed. - OTP-20087
-
- HIGHLIGHT
There is a new Hardening guide giving guidelines on how to strengthen the security for the
sslapplication.
Full runtime dependencies of ssl-11.7
crypto-5.8, erts-16.0, inets-5.10.7, kernel-10.3, public_key-1.20.3, runtime_tools-1.15.1, stdlib-7.0
stdlib-8.0 #
- OTP-19932
-
- Related Id(s):
Fixed an issue in
digraph_utils:roots/1where roots could be missed in some cases. - OTP-19991
-
beam_lib:strip/1will now retain the Beam debug information chunk produced by thebeam_debug_infooption. The chunk will also be retained when combing thebeam_debug_infooption with the undocumentedslimoption.The runtime system will no longer crash when attempting to load modules that have been compiled with
beam_debug_infobut lack the actual Beam debug info chunk. - OTP-20001
-
Fixed a crash when
zstd:compress/2was asked to compress empty data. - OTP-20124
-
- Related Id(s):
Replaced a sleep clause in user_drv shutdown with a flush of the output buffer.
- OTP-20125
-
- Related Id(s):
The
calendar:seconds_to_time/1function now checks the range for each of the components of a time tuple ({Hours,Minutes,Seconds}) and fail with an exception if a component is out of range. - OTP-19663
-
- Related Id(s):
Error return values from functions in
zipnow also specify which file in the archive the error belongs to. - OTP-19744
-
- Related Id(s):
-
PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730
The legacy
andandoroperators have been replaced with other language constructs. - OTP-19783
-
- Related Id(s):
The undocumented and unsupported function
lists:zf/2is now deprecated. - OTP-19785
-
- HIGHLIGHT
Native records as described in EEP-79 has been implemented.
A native record is a data structure similar to the traditional tuple-based records, except that is a true data type.
Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30, meaning that their behavior may change, potentially requiring updates to applications that use them.
- OTP-19800
-
- Related Id(s):
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. - OTP-19815
-
- Related Id(s):
Added a new constructor
array:from/2. - OTP-19826
-
- HIGHLIGHT
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. - OTP-19838
-
- Related Id(s):
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.) - OTP-19853
-
- Related Id(s):
The
unicodemodule now supports the Unicode 17 standard. - OTP-19858
-
- Related Id(s):
Added functions to
unicodefor recognizing whitespaces and identifiers. - OTP-19882
-
- Related Id(s):
-
PR-10453, OTP-19827
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. - OTP-19898
-
- HIGHLIGHT
There will now be a warning when exporting variables out of a subexpression. For example:
case file:open(File, AllOpts = [write,{encoding,utf8}]) of {ok,Fd} -> {Fd,AllOpts} 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. - OTP-19903
-
- Related Id(s):
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}, ... - OTP-19906
-
- Related Id(s):
Tools such as the debugger,
beam_lib, andxrefno longer support BEAM files created before OTP 13B. - OTP-19912
-
- Related Id(s):
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. - OTP-19922
-
- HIGHLIGHT
graphis a new module that is a functional equivalent of thedigraphanddigraph_utilsmodules. - OTP-19927
-
- HIGHLIGHT, POTENTIAL INCOMPATIBILITY
Before Erlang/OTP 29, attempting to bind variables in a comprehension would compile successfully but fail at runtime. Example:
1> fh(List) -> [H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]. ok 2> fh(lists:seq(1, 10)). * exception error: bad filter 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)]. - OTP-19933
-
- Related Id(s):
Removed the undocumented
dyn_erlutility. - OTP-19934
-
- Related Id(s):
The functions
erl_tar:add/3anderl_tar:add/4now accepts the{mode,Mode}option for setting the permission of the file. - OTP-19936
-
Added
zstd:flush/2for flushing compressed data without closing the compression context. - OTP-19938
-
- HIGHLIGHT
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…catch…endbut is also possible to disable the warning by using thenowarn_deprecated_catchoption. - OTP-19942
-
- HIGHLIGHT
Multi-valued comprehensions according to EEP 78 has been implemented.
Example:
> [I, -I || I <- lists:seq(1, 5)]. [1,-1,2,-2,3,-3,4,-4,5,-5] - OTP-19943
-
- HIGHLIGHT
There will now be a warning for matches that unify constructors, such as the following:
m({a,B} = {Y,Z}) -> . . .Such a match can be rewritten to:
m({a=Y,B=Y}) -> . . .The compiler option
nowarn_match_alias_patscan be used to disable the warning. - OTP-19963
-
- HIGHLIGHT
While the iteration order for maps is undefined, it is now guaranteed that all ways of iterating over maps provides the elements in the same order. That is, all of the following ways of iterating will produce the elements in the same order:
maps:keys/1maps:values/1maps:to_list/1maps:to_list(maps:iterator(M))- Map comprehension:
[{K,V} || K := V <- M]
- OTP-20004
-
- HIGHLIGHT, POTENTIAL INCOMPATIBILITY
The
arraymodule have been extended with several new functions. The internal representation have been changed to allow the new functionality and optimizations. Arrays serialized withterm_to_binary/1in previous releases are not compatible. - OTP-20023
-
- HIGHLIGHT
m:erl_tarwill use less memory when extracting large tar entries to disk. Instead of reading each tar entry into memory,erl_tarwill now stream data in chunks of 64KB. The chunk size is settable using the new{chunks,ChunkSize}option.The new
{max_size,Size}option will set a limit on the total size of extracted data to protect against filling up the disk.Checking of symlinks has been improved. Some symlinks that were safe (such as
dir/link -> ../file) used to be rejected. - OTP-20028
-
- HIGHLIGHT
Added a new module called
io_ansithat allows the user to emit Virtual Terminal Sequences (a.k.a. ANSI sequences) to the terminal in order to add colors/styling to text or create fully-fledged terminal applications.io_ansiuses the local terminfo database in order to be as cross-platform compatible as possible.It also works across nodes so that if functions on a remote node call
io_ansi:fwrite/1it will use the destination terminal’s terminfo database to determine which sequences to emit. In practice, this means that you can call functions in a remote shell session that useio_ansiand it will properly detect the terminal sequences the target terminal can handle and will print using them correctly. - OTP-20029
-
- Related Id(s):
Polished the documentation groups, essentially removed groups that did nothing but obscure the documentation.
- OTP-20061
-
- POTENTIAL INCOMPATIBILITY
The
gb_sets:from_ordset/1andgb_trees:from_orddict/1functions would trust their inputs. If the input contained duplicates or was not properly sorted, the resulting gb_set or gb_tree would be invalid, and any number of interesting problems could occur.In this release, these functions will raise an exception if their input is not valid. That could mean that incorrect programs that seemed to work could now stop working altogether.
There is also a new
gb_trees:from_list/1function for directly creating a gb_tree from a list. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls). - OTP-20072
-
- HIGHLIGHT
The
jsonmodule now encodes and decodes quoted strings faster. Improvements of up to 55 percent has been measured when decoding JSON data with long strings.The
string:length/1,string:slice/2, andstring:slice/3functions have been optimized. For some strings, they can be up to twice as fast.
Full runtime dependencies of stdlib-8.0
compiler-5.0, crypto-4.5, erts-16.0.3, kernel-11.0, sasl-3.0, syntax_tools-3.2.1
syntax_tools-4.1 #
- OTP-20077
-
merl:compile_and_load/1could crash when compiling code containing comments.merl:quote/2would fail to handle literal UTF-8 encoded binaries. - OTP-19744
-
- Related Id(s):
-
PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730
The legacy
andandoroperators have been replaced with other language constructs. - OTP-19942
-
- HIGHLIGHT
Multi-valued comprehensions according to EEP 78 has been implemented.
Example:
> [I, -I || I <- lists:seq(1, 5)]. [1,-1,2,-2,3,-3,4,-4,5,-5] - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of syntax_tools-4.1
compiler-9.0, erts-16.0, kernel-10.3, stdlib-8.0
tftp-1.3 #
- OTP-19744
-
- Related Id(s):
-
PR-10114, PR-10554, PR-10568, PR-10579, PR-10580, PR-10585, PR-10598, PR-10710, PR-10718, PR-10730
The legacy
andandoroperators have been replaced with other language constructs. - OTP-19996
-
- Related Id(s):
All use of legacy
catchin the TFTP application has been rewritten.In the process, deep return using
exit/1orthrow/1from callbacks has been changed to only work withthrow/1, as customary. This was considered a misfeature.Explicit loading of callback module or logger module has been removed, since that was against what one would expect for embedded mode.
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of tftp-1.3
erts-6.0, kernel-6.0, stdlib-5.0
tools-4.2 #
- OTP-19921
-
Fixed “unbalanced parenthesis” issue when pressing TAB in emacs erlang shell.
- OTP-20059
-
- Related Id(s):
The minimum supported Emacs version for
erlang-modehas been raised from 24.3 to 27.1. Compatibility shims for older Emacs versions have been removed.The
erlang-modepackage version now tracks the Erlang/OTP release version (29.0) for consistent version numbers across package managers. - OTP-19906
-
- Related Id(s):
Tools such as the debugger,
beam_lib, andxrefno longer support BEAM files created before OTP 13B. - OTP-20032
-
- HIGHLIGHT
The
ignore_xrefattribute has been handled as a post-analysis filter by build tools such as Rebar3. In this release,xrefitself does the filtering, ensuring that all tooling that callsxreffor any purpose can rely on these declarations to just work. - OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls). - OTP-20085
-
- HIGHLIGHT
The runtime system now supports generating encrypted crash dumps. See the description of
--enable-encrypted-crash-dumpsin [Building and Installing Erlang/OTP].
Full runtime dependencies of tools-4.2
compiler-8.5, crypto-5.9, erts-15.0, kernel-10.0, public_key-1.21, runtime_tools-2.1, stdlib-6.0
wx-2.6 #
- OTP-20119
-
- Related Id(s):
-
ERIERL-1315, PR-11032
The examples for
wxare now only installed in one place (indoc/examples). - OTP-19766
-
Documentation about how to validate the SBOM using sigstore has been added.
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of wx-2.6
erts-12.0, kernel-8.0, stdlib-5.0
xmerl-2.2 #
- OTP-20066
-
- HIGHLIGHT
Added support for
-unsafeattributes, which is used to mark functions as unsafe to use.This is similar to but separate from deprecation, and the compiler will by default now generate warnings for calls to functions in Erlang/OTP that are known to be always unsafe.
Furthermore,
xrefcan now be used to find calls to functions in another application that lack a-docattribute (undocumented_function_calls), calls to functions in another application marked-doc false.(private_function_calls), as well as calls to unsafe functions (unsafe_function_calls).
Full runtime dependencies of xmerl-2.2
erts-6.0, kernel-8.4, stdlib-2.5
Thanks To #
Alexandre Rodrigues, Alex Mickelson, Andreas Hasselberg, Andrew Bennett, Ayanda Dube, Bentheburrito, Bernhard M. Wiedemann, Bozhidar Batsov, Claes Nästén, Daniel Gorin, Daniel Kukula, dependabot[bot], Eksperimental, Eric Meadows-Jönsson, erlang-bot-app[bot], felipe stival, Fernando Areias, Holger Weiß, Ievgen Pyrogov, Ilya Averyanov, ilya-klyuchnikov, Ilya Klyuchnikov, Jan Uhlig, Jérôme de Bretagne, João Henrique Ferreira de Freitas, Johannes Christ, Jonatan Männchen, José Valim, krishnadas, Loïc Hoguin, loscher, lud, Maria Scott, Marko Mindek, matt, Mend Renovate, Michael Daniels, Michał Muskała, Nelson Vides, Nick Vatamaniuc, Olexandr88, Paul Guyot, Paulo F. Oliveira, Paulo Tomé, Petr Sumbera, Preet, Radek Szymczyszyn, Rasmus Précenth, Richard Carlsson, Robert Ismo, Robin Morisset, Sam Weaver, Sébastien Saint-Sevin, Sergey Fedorov, siiky, Simon Cornish, spoo, Stefan Grundmann, Takeru Ohta, Vadim Yanitskiy, Vance Shipley, Wade Mealing, Wei Huang, williamthome, yagogarea, Zabrane, Zeyu Zhang, наб