Clause
← Toda a documentação

O original em inglês mudou desde esta tradução, pelo que partes dela podem estar desatualizadas. Ler em inglês

Traduzido do original em inglês · 1e3a39c8-dirty · 2026-10-26

Diferenças em relação ao Erlang/OTP

Comportamento observável em que o Clause difere conscientemente do OTP 29 fixado (maint-29, ver otp-reference.md). Cada entrada remete para o contrato que a rege. Uma entrada é removida quando a diferença é corrigida. As funcionalidades ainda não implementadas (assinaladas como notimpl) não constam aqui; ver features.md e o plano.

Maps

DiferençaOTPClauseResponsável
Ordem do gerador de map (K := V <- M)Os maps planos (até 32 chaves) são percorridos pela ordem das chaves, mas as chaves átomo pela ordem da tabela de átomos, que varia entre execuções da VM; os maps maiores pela ordem de hashSempre a ordem canónica das chaves (ordem dos termos)padrões
Conteúdo de bad_generators de um gerador de map num grupo zipO seu iterador: cadeia {K, V, Next} terminada em none, pela ordem do OTPA mesma cadeia, construída pela ordem canónica das chavespadrões
maps:iterator/1,2, maps:next/1, erts_internal:map_next/3, a ordem de execução das funs de maps (intersect_with/3, merge_with/3, ...), proplists:get_keys/1, sets da versão 2 (to_list/1, fold/3)Ordem interna (ordem da tabela de átomos para chaves átomo, ordem de hash acima de 32 chaves); um iterador é uma posição ou uma cadeia {K, V, Next}Ordem canónica das chaves; um iterador continua sobre uma lista de chavesbuiltins
Impressão de maps (erlang:display/1, ~w, ~p)Ordem da disposição interna (ordem da tabela de átomos para chaves átomo, ordem de hash acima de 32 chaves)Ordem das chaves do map, como ~kw do OTPtermos
Ordem de digraph:vertices/1, edges/1, source_vertices/1, sink_vertices/1 e das ordenações e componentes de digraph_utils quando partem dessas listasA ordem de hash das tabelas de vértices e arestasA ordem de hash do Clause (ETS); os caminhos e as listas de vizinhos seguem a inserção das arestas em ambosbuiltins
Ordem de maps:keys/1, values/1, to_list/1, fold/3, dos membros escritos por json:encode/1, dos campos que erl_parse:abstract/1,2 atribui a um map e das listas de vértices e percursos de graphA ordem interna do map (ordem da tabela de átomos para chaves átomo, ordem de hash acima de 32 chaves)Ordem das chavesbiblioteca
Impressão de native records (erlang:display/1)Campos pela ordem do índice na tabela de átomosOrdem da definição, como ~wnative records
== entre native records cujos campos diferem apenas como inteiro/floatO compilador pode reduzi-lo a =:= (falso)Comparação numérica (verdadeiro)native records
Construção externa de um native record de um módulo que não está carregadoFalha até o módulo que o define ser carregadoTodos os módulos do lote são carregados no arranque; um módulo fora do lote falha semprenative records
Impressão de funs locais (#Fun<M.Index.Uniq>)Índice da numeração de lambdas do compilador, Uniq um hash do código do móduloÍndice das funs locais do módulo pela ordem do código-fonte, Uniq sempre 0funs
Ordem de duas funs locais de um móduloPelo índice do OTPPelo índice na ordem do código-fonte, pelo que funs de funções diferentes podem ordenar-se de outra formafuns
Nomes de funs anónimas nos stack traces (-f/1-fun-N-)N da numeração do compiladorN conta as funs de f/1 pela ordem do código-fontefuns
Uma fun anónima no valor por omissão de um campo de recordCada local de construção expande a sua própria cópia: funs de dois locais são diferentesUma única fun para o valor por omissão: funs de qualquer local de construção são iguaisfuns
Ordem dos valores capturados de funs criadas dentro de comprehensionsVariáveis livres da função gerada para a comprehensionOrdem de definição na função envolvente; visível apenas ao comparar duas dessas funsfuns

Pids, referências e processos

DiferençaOTPClauseResponsável
Temporizadores de disparo único e de intervalo de timer, exceto envios para pids locaisExecutados pelo processo timer_server, iniciado sob kernel_sup na primeira utilização; os sinais de exit_after/2,3 vêm deleSem servidor de temporizadores: cada temporizador é um processo próprio, que envia o sinal de exit_after; cancel/1 devolve antes de esse processo ter visto o cancelamentobuiltins
Números de pidO primeiro processo do utilizador é aproximadamente <0.80.0>; os números são reutilizados quando a tabela de pids dá a voltaO primeiro processo é <0.1.0>; os números vêm de uma única sequência e nunca são reutilizadostermos
Código após spawn(Fun) de uma fun de outra aridadeA análise de tipos do compilador pode considerar inalcançável o código após a chamada e eliminá-lo, pelo que o chamador devolve o pid de imediatoO chamador prossegue; apenas o novo processo falha com {badarity, {Fun, []}}processos
Pilha de um function_clause lançado por um builtin de lists (lists:sublist/2, lists:max/1, ...)O frame superior é a função Erlang, frequentemente um auxiliar interno (lists:sublist_2/2), com os seus argumentosO chamador fica no topo: os builtins não empilham nenhum framebuiltins
Último bit dos resultados de math (math:erfc(1), ...)A biblioteca C com que o OTP foi compiladoA biblioteca C que os programas Clause ligam (Windows: 0.15729920705028513 para erfc(1), OTP 0.1572992070502851)builtins
Resultado de binary:compile_pattern/1{bm, Ref} ou {ac, Ref} com uma referência opaca{bm, [Pattern]} ou {ac, Patterns}builtins
binary:referenced_byte_size/1 de um sub-binaryO tamanho do binary para o qual apontaO seu próprio tamanhobuiltins
Memória dos termos persistentes substituídos ou apagadosRecuperada em segundo plano por um processo coletor de áreas de literais que faz cada processo copiar o valor para foraCada processo copia-o para fora na sua próxima fatia (os suspensos de imediato, pelo put/erase), depois a área é libertada; sem processo coletorruntime
Termos persistentes enviados em mensagensPermanecem partilhados, como os literais: o heap do destinatário não cresceCopiados para o heap do destinatário como qualquer outro termoruntime
persistent_term:info/0 e get/0Incluem os termos que kernel e stdlib do OTP guardam no arranque (26 no OTP 29)Apenas os termos do próprio programabuiltins
code:is_loaded/1, code:which/1, code:all_loaded/0 de um módulo compiladoO ficheiro .beam a partir do qual foi carregadopreloaded: todos os módulos estão ligados no executávelbuiltins
Opção priority de send/3, link/2, exit/3, exit_signal/3As mensagens e os sinais prioritários ultrapassam os comunsAceite; entregues como mensagens e sinais comunsprocessos
spawn/2,4, spawn_link/2,4, spawn_monitor/2,4 que nomeiam outro nóÉ registado um aviso ** Can not start ... on Node **Nada é impresso; o pid inútil termina na mesma com noconnectionprocessos
Flags de system_flag/2 diferentes de backtrace_depth e min_heap_size (fullsweep_after, schedulers_online, multi_scheduling, max_heap_size, ...)Alteram o emuladorVerificadas e consultáveis sem efeito; system_logger começa como undefined (sem processo logger); cpu_topology, erts_alloc, scheduler_bind_type dão badargbuiltins
Temporizadores de um processo suspenso (receive ... after, send_after/3 e start_timer/3 para o seu pid)Suspensos com o processo até este ser retomado (OTP 28, 29)Continuam a correr: um tempo limite que expire durante a suspensão é tratado quando o processo é retomado; uma mensagem de temporizador espera na sua caixa de correioprocessos
Saída de process_display/2Dump da pilha do OTP com endereços e posições da pilhaUm Module:Function/Arity por frameprocessos
process_flag(save_calls, N)Guarda as últimas N chamadas para process_info(Pid, last_calls)Mantido e consultável; não são guardadas chamadasprocessos
adler32_combine/3, crc32_combine/3 com um segundo tamanho acima de 2^31 - 1 no WindowsCombinadosbadarg (o z_off_t da zlib tem 32 bits nessa plataforma)builtins
init:get_arguments/0, init:get_argument/1As flags do emulador: root, bindir, progname, home e cada -Flag da linha de comandosApenas home; um executável não tem flags de emuladorbuiltins
init:script_name/0, init:script_id/0O caminho do script de arranque e {"Erlang/OTP", "29"}O caminho absoluto do executável e {"Clause", "29"}builtins
init:get_status/0, init:ensure_loaded/1 na entrada{starting, started} e carregamento de código enquanto código de escript, -s ou -eval corre durante o arranque; {started, started} e not_allowed depois de iniciadoSempre as respostas de sistema iniciadobuiltins
init:stop/0,1, init:reboot/0Devolvem ok; init desliga então as aplicações e termina, enquanto o chamador continua a correrTerminam de imediato; a chamada nunca regressabuiltins
init:get_argument(home) em Windows sem HOMEDRIVE/HOMEPATHA pasta de perfil da shellUSERPROFILE, normalmente a mesma pastabuiltins
erlang:halt(Slogan), init:stop(Slogan)Imprime o slogan, escreve erl_crash.dump no diretório atual e indica-o em stderr; código de saída 1Imprime o slogan em stderr, não escreve crash dump; código de saída 1executáveis
init:restart/0,1, init:boot/1, init:make_permanent/2Reiniciam o sistema no mesmo nó, arrancam-no ou definem o script de arranque do próximo reinícioRecusados: erro notsup, {error, notsup} de make_permanent/2builtins
Aridade de atomics:new/2Qualquer inteiro positivo que o alocador consiga servir; um enorme termina o nó com um crash dump1 a 2^27, caso contrário badargbuiltins
counters com write_concurrencyContadores por escalonador somados na leitura; a memória de info/1 cresce com o número de escalonadoresUm único array de atomics; a memória de info/1 é a do arraybuiltins
erts_internal:term_type/1A representação interna: flatmap ou hashmap, heap_binary, refc_binary ou sub_binary, ...Todos os maps flatmap, todos os bitstrings sub_binarybuiltins
erl_prim_loader:get_path/0O caminho de código de arranque["."] até set_path/1ports
file:read_link_info/1,2 de uma ligação simbólica em WindowsOs dados do próprio reparse point da ligaçãoO tamanho e as datas do destino com tipo symlinkports
inet:gethostbyname/1,2O nome canónico e os aliases do resolvedor (inet_res, ficheiro hosts, nativo)O nome pedido e sem aliases; endereços do resolvedor do sistemaports
Módulo socketA API NIF de socketsEm falta: uma referência é um erro de compilação; usar gen_tcp, gen_udp, inetbiblioteca
net:getifaddrs/1,2 com um espaço de nomes, inet:getifaddrs([{netns, _}])net chama-se a si próprio sem fim (OTP 29); inet lê o espaço de nomes no Linux{error, enotsup}builtins
Listas de saída de zlibUm binary por bloco interno, aninhado onde um fluxo terminou e recomeçouUm binary por chamada, [] quando não há nenhum; os bytes são os do OTPbuiltins
zlib:safeInflate/2 e chamadas zlib longasRegressam após uma quantidade limitada de saída ({continue, Output}) e cedemDescomprimem toda a entrada em fila numa única chamada ({finished, Output}); uma chamada longa retém a thread do seu escalonadorbuiltins
Correspondências re longasre:run/3 e o ciclo global cedem após uma quantidade limitada de trabalhoUma correspondência corre até ao fim e retém a thread do seu escalonador; uma execução global cede apenas entre correspondênciasbuiltins
re:compile/2 com export, re:import/1Um padrão exportado {re_exported_pattern, ...} que outro nó importaexport é badarg; import/1 lança {not_implemented, import, 1}builtins
Erros de argumento de rebadarg lançado de re:run/3 (ou replace, split) com os argumentos do chamador e error_infobadarg lançado do auxiliar de re que rejeitou o argumento, com os argumentos desse auxiliarbuiltins
code:is_sticky/1true para módulos de kernel, stdlib e compiler, e para os módulos dos diretórios nomeados por code:stick_dir/1Sempre false; stick_dir/1 apenas verifica se o diretório pode ser listadobuiltins
code:root_dir/0 e o caminho de código inicialO diretório de instalação do OTP; o caminho contém os seus diretórios lib/*/ebinO diretório do executável; o caminho contém os diretórios ebin de lib/ ao lado dele e de ERL_LIBS, depois "."builtins
code:load_file/1, load_abs/1, load_binary/3, atomic_load/1, prepare_loading/1 com código objeto válidoCarregam o módulo{error, badfile}: todos os módulos são ligados ao executável (D01)builtins
code:coverage_support/0 e as funções de coberturatrue com o JIT; modos e contadores de coberturafalse; as restantes lançam badarg, como o OTP sem suporte de coberturabuiltins
code:get_doc/1 de um módulo que o programa temO seu bloco de documentação EEP 48{error, missing}: os executáveis não incorporam documentaçãobuiltins
Formatação de um termo grande (io:format/1,2)Corre em código Erlang (io_lib) e no group leader, pelo que o processo pode ser preemptado durante a formataçãoCorre até ao fim numa única chamada de builtin; os outros processos esperambuiltins
Flags de process_flag/2trap_exit, priority, message_queue_data, min_heap_size e outrasApenas trap_exit e min_heap_size; qualquer outra flag lança badargprocessos
Ordem dos relatórios de erro de processos que falham ao mesmo tempoOrdem do loggerA ordem pela qual os respetivos workers os terminamprocessos
Sinais de saída (exit/2, exit_signal/2) para um processo em execução noutro escalonadorColocados na sua fila de sinais e tratados mais tarde, enquanto o emissor prossegueO emissor espera até ao fim da fatia de tempo do destino e atua então de imediato; observável apenas na temporização (as mensagens ficam em buffer e o emissor prossegue)processos
term_to_binary/1 de uma fun local ou de um native recordCodificado (NEW_FUN_EXT, ...)error:notsup; fun M:F/A é codificadabuiltins
term_to_binary/1 de um map com mais de 32 chavesOrdem de hash salvo com deterministicSempre a ordem das chaves (os bytes de deterministic)builtins
binary_to_term/1 do pid, port ou referência de outro nó; opção local de term_to_binary/2Identidades externas; codificação LOCAL_EXTbadargbuiltins
Limite de tempo dos temporizadoresDepende da unidade de tempo nativa (cerca de 2^49.7 ms em Windows)Tempo relativo 0..2^49-1 ms em todas as plataformasprocessos
unique_integer/0,1 sem positivePode ser negativoSempre positivo e crescentebuiltins
Itens current_function, initial_call, current_stacktrace, ... de process_info/2Indicadoserror:{notsup, Item}; process_info/1 omite-osprocessos
reductions de process_info/2; reductions, garbage_collection, io de statistics/1Contados0 (não mantidos)builtins
garbage_collect/0,1,2Recolhe antes de regressarRecolhe no próximo safepoint do destinoprocessos
erlang:system_info(machine), e por isso ?MACHINE de epp e a macro que nomeia"BEAM", 'BEAM'"Clause", 'Clause'builtins
erlang:system_info(schedulers) de um programa iniciado com uma máscara de afinidade (start /affinity, taskset)Um escalonador por processador lógico da máquina (32 com uma máscara de 7 CPUs), schedulers_online um por CPU da máscaraAmbos um por CPU da máscara: o Clause inicia apenas as threads de trabalho ativasprocessos
Opções de afinação de spawn_opt/2..5 (priority, min_heap_size, ...)AplicadasVerificadas e aceites, não aplicadasprocessos
hibernate/3Descarta a pilha; o processo termina quando M:F regressaMantém a pilha; o resultado de M:F regressa ao chamador de hibernate/3processos
monitor(port, Item, Options) com opçõesAceitebadargprocessos
spawn_request_abandon/1true enquanto a resposta está pendenteSempre false: a resposta é enviada antes de spawn_request regressarprocessos
Último bit de math:log2/1 (Windows)A compilação do OTP para Windows divide log(X) por log(2) (math:log2(1.0e308) é 1023.1538532253077)O log2 da biblioteca C (1023.1538532253076)builtins
phash/2, phash2/1,2 de pids, ports, referências, funs e native recordsHashes dos números de processo, port e referência do OTP, do índice e número único de uma fun, do hash da definição de um recordHashes dos números do Clause, do módulo, aridade ou índice e capturas de uma fun, dos valores dos campos de um record; todos os outros termos produzem o hash do OTPbuiltins
dict:fold/3, map/2, filter/2 com um valor que não é uma funfunction_clause, ou {badfun, F} quando o primeiro bucket visitado pelo OTP contém uma entradafunction_clausebuiltins
erlang:is_builtin/3 de lists:reverse/2 e outras funções de biblioteca implementadas em Ctruefalse: apenas os builtins do runtime e apply/2,3funs
pid, uniq, new_uniq de fun_info/1,2 de uma fun localPid do criador, checksums do compiladorundefined, MD5 do nome do módulofuns
Contexto de md5_init/0Estado de 92 bytes do OTPEstado de 96 bytes do Clause; os digests são iguaisbuiltins
erlang:delete_module/1 de um módulo carregadoTorna o seu código antigo (true)error:notsup: o código ligado mantém-sebuiltins
erlang:prepare_loading/2Prepara um binary BEAM válidoSempre {error, badfile}builtins
erlang:pre_loaded/0Os módulos de arranque pré-carregadosTodos os módulos do programabuiltins
list_to_pid/1 de um número nunca emitidoDevolve um termo pidbadarg: só são admitidos os pids que este programa crioutermos
list_to_port/1 de um número nunca emitidoDevolve um termo portbadarg: só são admitidos os ports que este programa abriuports
Valores de port_info/1,2id é um índice de tabela; memory, queue_size, locking descrevem o driverid é o número do port; memory e queue_size são 0; locking é port_levelports
Escrita num ficheiro aberto só para leitura{error, eacces} em Windows, {error, ebadf} nos restantes{error, ebadf} em todo o ladoports
Porta de win32regA porta registry__drv__ ligada estaticamente ({spawn, "registry__drv__ rw"}), que responde aos comandos com mensagens de portaO driver clause_registry ({spawn_driver, ...}), que dá as mesmas respostas através de port_control/3; port_info/2 nomeia-o clause_registryports
Nome do programa de argparse sem a opção prognameO progname do emulador (erl)O nome do executável sem a extensão (init não tem progname)biblioteca
Frame superior da pilha de um erro de validação de comando de argparseA função de validação (argparse:validate_command/2, validate_option/2, uma fun dentro delas) com [Entity]argparse:validate/2 com [Entity]builtins
escript:script_name/0O caminho do escript, o primeiro argumento simplesO caminho do executável: um programa Clause é o seu próprio scriptbiblioteca
escript:extract/2 com compile_sourceO código-fonte compilado para um beam{error, {compile, ...}}: os programas Clause não têm compiladorbiblioteca
erl_abstract_code:debug_info(core_v1, ...) (Core Erlang de beam_lib)Core Erlang do compilador{error, failed_conversion}: os programas Clause não têm compiladorbiblioteca
zstd:get_frame_header/1 de um cabeçalho de frame truncadoOs campos de memória não inicializadaOs campos a zero ('ZSTD_frame', tamanhos 0)builtins
file:open/2 com raw ou ramUm record #file_descriptor{} servido no chamador (is_pid/1 falso); os pedidos io sobre ele falham; um ficheiro ram não tem read_line/1 (undef) e, fechado, responde {error, einval}Um pid de servidor de ficheiros como os restantes ficheiros; E/S posicionada e sendfile/5 respondem como para os ficheiros raw do OTP; um ficheiro ram responde a read_line/1 e a pedidos de E/S com {error, enotsup}, e com {error, terminated} depois de fechadoports
file:truncate/1 num ficheiro aberto apenas para leituraO erro da plataforma (eacces no Windows, einval nas restantes)O erro do runtime C para o descritor (ebadf ou einval); o servidor para como o do OTPports
Ficheiros abertos ou configurados para {utf16, _} ou {utf32, _}Linhas e caracteres descodificados nessa codificaçãoAs linhas terminam num byte 10 antes de serem descodificadasports
Sequências de io_ansi no Linux e no macOSDa base de dados terminfo de TERM quando tem a capacidade (setaf, sgr0, ...); tput/1,2, tigetnum/1, tigetflag/1, tinfo/0 leem-naAs sequências ANSI incorporadas que o OTP usa sem terminfo (como o OTP no Windows); tigetnum/1, tigetflag/1, tinfo/0 respondem {error, enotsup}, tput/1,2 lançam {enotsup, Capability}; enabled/0,1 exige um TERM diferente de dumbbiblioteca
io_ansi:scan/1 e tput/1,2 no WindowsFalham com try_clause sobre o {error, enotsup} de terminfoscan/1 reconhece as sequências incorporadas; tput/1,2 lançam {enotsup, Capability}biblioteca
socket no Windows: recvmsg, sendmsg, sendfile, sendmmsg, recvmmsgLançam notsupFuncionam como no Linux e no macOSbiblioteca
socket no Windows: um datagrama maior do que o comprimento de recv{error, {completion_status, ...more_data...}}O datagrama truncado, como nas restantes plataformasbiblioteca
socket no Linux e no macOS: ioctl/2,3,4, getopt_native/3, setopt_native/3, open/1,2 de um descritor, domínio local, SCTPSuportadosRecusados como o OTP no Windows os recusa ({error, {invalid, ...}}, notsup); local dá {error, eafnosupport}biblioteca
socket:info/1, i/0,1,2Os contadores e estados do NIF, fd é o descritorContadores das chamadas efetuadas, estados tal como o módulo os acompanha; Fd é o número da portabiblioteca
Respostas de inet_resAs respostas de gethostbyname, getbyname e gethostbyaddr são guardadas em cache por TTL em inet_db; uma consulta em cache pode listar os endereços noutra ordemNada é guardado em cache: cada consulta pergunta aos servidores de nomesbiblioteca
Configuração do resolvedor no Linux e no macOSinet_db também lê ficheiros host.conf/nsswitch.conf e inetrc, acompanha alterações a resolv.conf e, no Linux, deriva o domínio do nome da máquinaAs linhas nameserver, domain e search de resolv.conf e o ficheiro hosts, lidos uma vezbiblioteca
os:set_signal(Signal, handle) (Linux, macOS)O sinal é enviado para erl_signal_server, cujo tratador predefinido para o sistema com sigterm e termina com sigusr1 e sigquitSem erl_signal_server: sigterm e sigquit terminam com estado 0, sigusr1 com estado 1, os restantes são descartados; sem set_signal, SIGTERM mantém a ação predefinida do sistemaports
Argumentos vazios de {spawn_executable, F} em WindowsOmitidos da linha de comandosPassados como ""ports
{exit_status, S} e eof de um programa lançadoOrdem não especificada, exit_status pode chegar antes dos últimos dadosDepois de todos os dados, antes de eofports
Ports ocupadosUm port com demasiada saída em fila suspende os emissores, incluindo ports de socket; force de port_command/3 funciona nos drivers que o permitemSó os ports de programas lançados ficam ocupados; os ports fd e de socket nunca ficam; force lança notsup em todos os driversports
{active, N} de socketsUm inteiro N conta as mensagens antes de {tcp_passive, S}exit(badarg); apenas true, false e onceports
Opções de socket do próprio inet_drv (header, deliver, exit_on_close, send_timeout, send_timeout_close, delay_send, marcas de nível, packet_size, show_econnreset, buffer, read_packets, recvtos, recvttl, line_delimiter)AplicadasMantidas e comunicadas por getopts/2 com os valores predefinidos do OTP, sem serem aplicadas; as opções do sistema (nodelay, keepalive, linger, buffers, tos, multicast, ...) são aplicadasports
Outras opções de socket ({packet, line | http | ...}, {raw, ...}, bind_to_device, netns)Funcionamexit(badarg) na abertura, {error, einval} de setopts/2 e getopts/2ports
inet:getopts(S, [multicast_if]) no WindowsLê memória não inicializada para um socket TCP, e o endereço genérico depois de um socket UDP definir umO valor do sistema; o endereço genérico quando o socket não tem nenhumports
port_info(Socket, input | output), input e output de inet:info/1Os bytes dos comandos e respostas do driver0: o tráfego de sockets é contado apenas por inet:getstat/1,2ports
Razões de erro de socketsTodas as razões POSIX que o sistema indicaAs comuns (econnrefused, eaddrinuse, econnreset, etimedout, ...); as restantes são eioports
Entrada de um port enquanto o processo ligado retém 1 024 mensagens e pode correrContinua a ler e a entregarDeixa de entregar até ao fim da fatia de tempo do processo; acima de 64 KiB retidos, deixa de ler, pelo que o programa que escreve fica bloqueadoports
gen_tcp:close/1 com saída em filaEspera, até ao valor de linger/send_timeout, que a saída seja enviadaRegressa de imediato; a thread de E/S envia a saída em fila e depois fechaports
Tipos de monitor/2process, port, time_offsetprocess e port; time_offset lança badarg (não há alterações do desvio de tempo)processos
exit/2, exit_signal/2 para uma referênciaEnvia para o alias do processo, se a referência for um alias ativoNada: os sinais de saída nunca vão para aliasesprocessos
Números de referênciaCombinam um identificador de escalonador e contadores por escalonador (#Ref<0.178111994.4235460610.214105>)Um único contador para todo o programa (#Ref<0.0.0.1>), pelo que as referências se ordenam por criaçãotermos

Erros, stack traces e relatórios

DiferençaOTPClauseResponsável
Localizações nos stack traces[{file, F}, {line, L}], error_info para error/3Sempre []; sem error_info, pelo que erl_error:format_exception/3,4 não mostra localizações nem linhas *** argument para elasABI
erlang:raise/3 com entradas de pilha {Fun, Args}AceitesRejeitadasABI
Frame superior de function_clauseLista de argumentosAridadeABI
Frame superior de undef numa chamada M:F(A1, ..., An){M, F, [A1, ..., An], []}{M, F, N, []}: a aridade em vez dos argumentos (apply/3 e chamadas de funs mostram os argumentos)funs
Chamada dinâmica de um export que um executável não consegue alcançar (o seu módulo é nomeado apenas através de um stack trace, de uma exceção ou de uma mensagem vinda de fora do programa)Chama-oundef, salvo se compilado com --keep-exports; function_exported/3 e module_info(exports) continuam a listá-loexecutáveis
Frames de BIFs/operadores que falhamPresentes ({erlang, '+', Args, ...})Ausentes; nada abaixo da função de entradaABI
Tabela de átomos cheia (list_to_atom/1)O emulador aborta (no more index entries in atom_tab) e escreve um crash dumpclau: runtime failure: entry call failed: resource_limit, código de saída 70builtins
list_to_integer/1,2 com caracteres acima de 255Os primeiros dígitos usam apenas o byte inferior de cada carácter ([16#131] é 1)badargbuiltins
erlang:function_exported/3 de um BIFVerdadeiro para todos os BIFs do emuladorVerdadeiro apenas para os builtins que este runtime fornecebuiltins
Relatórios de erro de processos que falharamEnviados ao logger, escritos mais tarde pelo seu handler por omissão (na saída padrão sob erl, frequentemente perdidos quando um escript termina primeiro)Escritos em stderr quando o processo termina, antes de qualquer saída posterior; não são eventos de logger, pelo que os tratadores e filtros não os veemprocessos
Chamadas a funções que nunca regressamCompiladas como chamadas de cauda (o chamador não aparece no trace)Chamadas normais (o chamador aparece)ABI
Exceções dentro de uma fun anónima conhecida em -O2 (F = fun ... end, F(X), lists:map(fun ... end, L) e os restantes ciclos de listas, maps:fold(fun ... end, A, M))Frames da fun (-f/1-fun-0-) e dos auxiliares de lists e maps (lists:map_1/2)O corpo da fun corre inline no chamador: esses frames estão ausentes, e uma cauda imprópria de lista de map/2, foldl/3, all/2, any/2, flatmap/2 lança function_clause com o chamador no topofuns
Memória do anfitrião esgotadaO emulador indica que não consegue alocar memória, escreve um crash dump e paraclau: runtime failure: entry call failed: out_of_memory, código de saída 70, sem dumpheap do runtime
Armazenamento de maps com mais de 32 chavesUma HAMT no heap de nós com hash de 16 ramosUma árvore B+ no heap com até 16 entradas por nó pela ordem das chaves; os tamanhos de heap dos maps grandes diferem dos do OTPheap do runtime
Limite de memória por processomax_heap_size (em palavras, heap e pilha) mata o processo com a razão killed e regista um relatório de erro--max-heap / --max-stack (bytes) e o --max-memory global do runtime fazem falhar o processo que pede memória com resource_limit: clau: runtime failure: entry call failed: resource_limit, código de saída 70heap do runtime
Argumentos do programaescript passa todos os argumentos a main/1; as flags do emulador (+t) vêm de %%! ou de ERL_FLAGSAs opções do runtime iniciais (--max-atoms, --max-heap, --max-stack, --max-memory, --min-heap-size, --args-file, --) são retiradas primeiro; CLAUSE_FLAGS contém as mesmas opçõesexecutáveis
Exceção não apanhada num módulo de entrada normalescript termina com 127Termina com 1 e uma linha uncaught exception <class>: <reason> (os códigos-fonte escript mantêm 127)executáveis
Diagnósticos do compiladorFormulação do erl_lint (variable 'X' is unbound) e avisosFormulação própria (unbound variable X); os avisos de lint do OTP na maioria não são emitidos (também os avisos de native records: campos desconhecidos em acesso, atualização e padrões, construção qualificada do próprio módulo sem valores, records não usados ou definidos em cabeçalhos; um padrão posterior que corresponde a um nome exportado de um ramo)análise semântica
Módulo de behaviour com um behaviour_info/1 escrito à mãoChama-o ao compilar os utilizadores e avisa sobre callbacks em falta, mal definidos ou obsoletosNão avaliado: os callbacks dos seus utilizadores não são verificadosanálise semântica
Módulos de behaviour que não estão no lote nem na biblioteca do Clause (application, ...)Carregados a partir do caminho de código; os seus callbacks são verificadosAviso behaviour M undefinedanálise semântica
Tratador predefinido de loggerlogger_std_h escreve de forma assíncrona com proteção contra sobrecarga (modos síncrono, descarte e esvaziamento, limites de rajada, terminação por sobrecarga)Também em standard_io (standard_error com CLAUSE_LOGGER_TYPE=standard_error), mas cada evento é escrito antes de a chamada de registo devolver; as opções de sobrecarga são verificadas e mantidas sem efeitobiblioteca
Processos dos tratadores de logger_std_hSupervisionados por logger_sup, reiniciados após overload_kill_restart_afterLigados ao servidor logger; um tratador cujo processo morra é removidobiblioteca
net_adm:names/0,1Consulta epmd: {ok, Names} quando há um epmd a correr na máquina{error, address}: o Clause não tem cliente epmdbiblioteca
net_kernel:start/1,2Inicia a distribuição, ou dá o erro do OTP quando não consegueIndisponível (not_implemented)biblioteca
Rastreio: erlang:trace/3, trace_pattern/2,3, trace_info/2, trace_delivered/1, system_monitor/0,1,2, system_profile/0,2, seq_trace/2, seq_trace_info/1, seq_trace_print/1,2, dt_*, o módulo trace, erl_tracer:enabled/3, trace/5Rastreiamerror:notsupbuiltins
Tokens de seq_traceTransmitidos com as mensagens; os números de série contam-nos; um rastreador do sistema recebe mensagens de rastreioMantidos apenas por processo: não são transmitidos, os números de série ficam como foram definidos, sem mensagens de rastreiobiblioteca
Âmbitos de pg e globalReplicam entre nós ligados; pg monitoriza nós através de net_kernelUm nó, sem pares nem monitorização de nósbiblioteca
Recursos de aplicaçõesFicheiros .app encontrados no caminho de código ao carregar; sys.config, -config e argumentos -App Key Value definem os ambientesCompilados para o executável a partir dos ficheiros de recursos da compilação; alterá-los exige recompilar; sem ficheiros nem argumentos de configuraçãobiblioteca
Aplicações kernel e stdlibIniciadas no arranque; kernel tem um mestre e um supervisor de topoCarregadas e em execução sem mestres: get_supervisor(kernel) é undefined, info/0 lista-as em execução como undefinedbiblioteca
application:ensure_all_started/3 com concurrentInicia aplicações independentes ao mesmo tempo; a lista segue a ordem de conclusãoInicia-as uma após outra, primeiro as dependênciasbiblioteca
application:takeover/2Espera pelo controlador de aplicações distribuídasTermina com noproc (sem dist_ac), como load/2 com nós faz em ambosbiblioteca
Pedidos de E/S a um mestre de aplicaçãoEncaminhados para o líder de grupo sob o qual a aplicação arrancouRespondidos na E/S padrãobiblioteca
erlang:process_flag(error_handler, Module)O runtime chama Module:undefined_function/3 e undefined_lambda/3 para chamadas indefinidasbadarg; process_info/2 comunica sempre error_handler, e as chamadas indefinidas lançam undef diretamente (error_handler só pode ser chamado)biblioteca
Detalhes dos relatórios de falha (proc_lib)Texto da exceção de erl_error com informação de erro alargada; vizinhos com current_function, initial_call e current_stacktrace; reductions reaisA linha da classe da exceção e os frames da pilha sem informação de erro alargada; vizinhos sem esses itens; reductions 0biblioteca
client_info dos relatórios de erro de gen_server, gen_statem e gen_fsmO current_stacktrace do processo chamador[]: o Clause não mantém a pilha atual de outro processobiblioteca
-behaviour com um valor que não é um átomoO aviso imprime o termo com ~w (behaviour [115,116,114] undefined)Imprime o texto-fonte do atributo (behaviour "str" undefined); o erro é o mesmoanálise semântica
module_info(md5) e o vsn que o OTP dele derivaMD5 do código BEAM compiladoMD5 do código-fonte impresso do módulo; o inteiro vsn derivado difere em conformidadeanálise semântica
module_info(compile)version da aplicação compiler do OTP, options que lhe foram dadasA versão do Clause; options sempre []análise semântica
module_info(functions)Lista também as funções que o OTP gera para as funs ('-f/0-fun-0-'/0)Apenas as funções do código-fonte e as predefinidasanálise semântica
-nominal em module_info(attributes)Mantido como {nominal,[{Name,AbstractType,Params}]} em formato abstratoOmitidoanálise semântica
Uma função de um módulo de biblioteca do Clause que o Clause não implementou (um BIF de erlang, lists:rmerge/2, ...)CorreCompila; lança error({not_implemented, F, A}) quando chamada, com M:F/A no topo da pilha (estados)biblioteca, builtins
Import de um módulo fora do loteCompila; a chamada lança undef em tempo de execução se o módulo faltarErro de compilação unknown module M quando o import é chamado (os imports não usados não precisam do módulo)análise semântica
Aviso import directive overrides auto-imported BIFPara cada BIF auto-importado de erl_internal:bif/2Apenas para os BIFs auto-importados que o Clause implementaanálise semântica

Casos-limite da linguagem

DiferençaOTPClauseResponsável
Segmento inteiro mais largo do que o limite de inteiros, valor acima dele (<<V:4194241>> só com uns)O JIT x86 faz a correspondência com um termo inválido; usá-lo faz a VM falharSem correspondênciatermos
Grupo zip cujos geradores relaxados e estritos partilham uma variávelO teste de salto mantém as variáveis dos padrões estritos nos padrões relaxadosUm passo rejeitado é saltado sempre que os padrões estritos correspondem por si sópadrões
Chamar uma fun externa, M:F(Args) ou apply/3 de um módulo fora do programaCarrega o módulo a partir do caminho de código, undef se não existirundef; os módulos de biblioteca só entram no programa quando este os nomeia com um átomo literalfuns, biblioteca
Ficheiros sem #! passados como escriptsescript file.erl salta a primeira linhaCompilados como módulos normaisexecutáveis
Escripts com beam pré-compilado e em arquivoCorremNão suportadosexecutáveis
Nome do módulo de um escript sem -module<name>__escript mais um sufixo de data/hora ou único<name>__escript, determinísticoexecutáveis
include_lib de uma aplicação encontrada em vários diretórios <app>-<version>O caminho de código contém uma única versão (o arranque escolhe a mais alta); sem diagnósticoA versão mais alta abaixo de cada diretório pesquisado, com um aviso por execução que as listapré-processador
Um -spec cujos tipos não partilham nenhum valor com o resultado inferido, o domínio de entrada ou os argumentos de uma chamadaCompila; o Dialyzer pode avisarUm domínio de entrada de argumentos contradito é um erro de compilação que indica os tipos declarados e inferidos; um resultado ou uma chamada contraditos são um aviso, e são usados os tipos inferidosanálise semântica

ETS

DiferençaOTPClauseResponsável
Ordem de first/1, next/2, tab2list/1, foldl/3 e i/1 sobre tabelas set, bag e duplicate_bag, e o que slot/2 numeraPosições de hash linear visitadas bloqueio a bloqueio; a ordem muda à medida que a tabela crescePartes, depois buckets por ordem, depois chaves pela ordem de inserção dentro de um bucket; uma posição é um bucketruntime
ets:all/0Inclui as tabelas de kernel e stdlib do OTP; ordem das respostas dos escalonadoresApenas as tabelas do programa, sem ordem particularbuiltins
memory de info/2Palavras alocadas para a tabela e os seus objetosPalavras dos objetos armazenados mais os custos adicionais próprios do Clausebuiltins
{write_concurrency, auto}O número de bloqueios adapta-se à contenção (64 a 8192)64 partes fixas, como para true; stats comunica 64 bloqueiosruntime
compressedArmazena elementos diferentes da chave em formato externoAceite e comunicado; os objetos são armazenados tal como estãobuiltins
stats de info/2 de um ordered_set com write_concurrency; data; binaryÁrvore CA {RouteNodes, BaseNodes, MaxDepth}; imprime a tabela; os binaries da tabela fora do heapfalse; true sem imprimir; []builtins
badarg de um builtin de etsContém error_info com uma causa (id, access, type, ...)badarg simplesbuiltins
Ordem dos resultados de select, match e match_object de tabelas de hash, e resultados que cada bloco de select/3 contémResultados de cada passo do percurso acrescentados à cabeça, os mais recentes primeiro; posições de hash linearOrdem de percurso das partes e buckets do Clause; cada bloco contém os primeiros Limit resultados recolhidosbuiltins
select_delete/2, select_replace/2 sobre uma tabela inteiraCedem a cada 1000 objetos (com a tabela fixada entretanto)Correm de uma vez, cada parte sob o seu bloqueioruntime
Especificações de correspondência que nomeiam uma variável com número 25 ou superiorRenumeram cada átomo '$N' da especificação, mesmo dentro de {const, ...} (por isso {const, '$30'} dá '$0')As variáveis mantêm os seus números; {const, '$30'} dá '$30'runtime
Guards e corpos de especificações de correspondência aninhados a mais de 1000 níveisCompilam até a pilha C ficar com pouco espaço (system_limit)system_limitruntime
Ações de rastreio em erlang:match_spec_test/3: enable_trace, disable_trace, trace com flags válidasAlteram as flags de rastreio do chamador (29.1.1 falha sem um rastreador)true após verificar as flags (e que um argumento pid está vivo); nada mudabuiltins
ets:tab2file/2,3 e file2tab/1,2Através de um processo disk_log nomeado por uma referência novaEscritos e lidos diretamente com filebuiltins
{process_dump} e {current_stacktrace} em erlang:match_spec_test/3O texto do dump do processo; o seu stack trace<<>>; []builtins

dets

DiferençaOTPClauseResponsável
Pedidos à espera em conjunto numa tabelaConsultas, inserções e eliminações enfileiradas ao mesmo tempo partilham uma atualização da cache; as consultas são respondidas antes das escritas; uma tabela fixada faz alguns escritores dormir 1 msCada pedido à vez, pela ordem de chegadabuiltins
Operações dets longas (reparações, init_table/2,3, compactações, esvaziamento de uma cache grande)Código Erlang, interrompido por reduçõesUma chamada builtin cada; a thread de trabalho da tabela não executa mais nada entretantobuiltins
Processos de detsO servidor dets e dets_sup sob kernel_safe_sup, tabelas sob dets_supUm servidor dets iniciado na primeira utilização, sem supervisão; processos das tabelas ligados a elebuiltins
Ordem de dets:all/0A ordem ETS do registoA ordem ETS do Clause (ETS)builtins
RelatóriosUma reparação é registada ao nível info; verbose/0,1 e DETS_DEBUG registam mais; uma falha interna é {dets_bug, ...}Nada é registadobuiltins

io

DiferençaOTPClauseResponsável
~p, ~w e escritores de io_lib de contentores aninhados a mais de 256 níveisImpressossystem_limitio
io_lib:print/4 com uma coluna ou comprimento de linha que não é inteiroDepende do termo: impresso (as guards falham silenciosamente), function_clause ou badarithbadarith para qualquer termo contentorio_lib
Precisão ou contagem de preenchimento negativa (~.*c com -1)Ciclo infinitobadargio

erl_scan

DiferençaOTPClauseResponsável
Localização de uma continuação de tokens/3,4 (continuation_location/1, não documentada)Onde o scanner parou, dentro do token inacabadoO início do token inacabado, que é analisado de novo com os próximos caractereserl_scan
{compiler_internal, [ssa_checks]}Analisa os comentários de verificação %ssa% como tokensIgnorado: continuam a ser comentárioserl_scan
Um número de vírgula flutuante com base (16#1.8#e1, base diferente de 10) cujos dígitos excedem 53 bitsA mantissa convertida como o ERTS converte inteiros grandesAcumulado num double; o último bit pode diferirerl_scan
Um elemento de lista que não é um carácter dentro de uma string, átomo entre aspas ou escapefunction_clause, case_clause ou if_clause, consoante a cláusulafunction_clauseerl_scan

erl_parse

DiferençaOTPClauseResponsável
Tokens '%ssa%' (cláusulas de verificação SSA dos testes do compilador OTP)Analisados como cláusulas ssa_check_whenUm erro de sintaxe; erl_scan nunca produz o tokenerl_parse

erl_eval

DiferençaOTPClauseResponsável
Stack trace de um erro lançado pelo avaliador ({badmatch, V}, undef de uma chamada local, ...)A pilha atual do processo avaliador (current_stacktrace de process_info/2)A pilha no throw do avaliador que a recolhe, nos frames do Clauseerl_eval

erl_lint

DiferençaOTPClauseResponsável
Behaviours nomeados por -behaviourQualquer módulo no caminho de código responde a behaviour_info/1Só respondem módulos ligados ao programa; outro é undefined_behaviourerl_lint
Ordem de vários erros encontrados numa redução de map (variáveis de tipo únicas de um tipo, especificações sem função, verificações de callbacks)A ordem interna do map (átomos por índice)Ordem dos termoserl_lint
erlang:is_builtin/3 para entradas -deprecated, -removed e -unsafe que não são exportadasA tabela de BIFs do OTPOs builtins do runtime, que incluem funções nativas de bibliotecaerl_lint
is_guard_expr/1 de uma construção de recordLança case_clauseResponde se os campos são expressões de guarderl_lint

epp

DiferençaOTPClauseResponsável
-include_lib("App/...") fora do caminho de inclusãoEncontrado em code:lib_dir(App), que conhece as aplicações do OTPEncontrado em code:lib_dir(App) do caminho de código do Clause, que não tem aplicações OTP a menos que lhe sejam adicionadasbiblioteca

erl_pp

DiferençaOTPClauseResponsável
Forma dos caracteres devolvidos por erl_ppListas de caracteres profundasUma lista de caracteres plana; a saída aplanada é igualbuiltins

qlc

DiferençaOTPClauseResponsável
Stack trace de uma exceção lançada num processo de cursor, quando next_answers/1,2 a relançaO stack trace do cursor seguido do process_info(self(), current_stacktrace) do proprietárioSeguido do stack trace de uma exceção capturada no proprietário (o Clause não tem o item current_stacktrace)qlc
qlc:q/1,2 em erl_eval, ets:table/1,2, dets:table/1,2 num programa que nunca nomeia qlcqlc está sempre carregadoundef para qlc: estes chegam-lhe por um nome em runtime, pelo que só programas que nomeiam qlc (qualquer módulo que inclua qlc.hrl o faz) o ligambiblioteca
Números de anotações no código de consultas compiladas (info/2 com {format, abstract_code})O transform do OTP numera as anotações à volta de todos os inteiros do módulo, incluindo os caracteres do caminho de qlc.hrl no seu atributo fileO mesmo transform, mas o qlc.hrl do Clause tem outro caminho, pelo que os números após a primeira consulta podem diferir; o código é igual nos restantes aspetosqlc

qlc_pt

DiferençaOTPClauseResponsável
Mensagens de qlc_pt:parse_transform/2 em runtimeDe compile:noenv_forms/2 (strong_validation): erl_lint mais as passagens core do compilador, como avisos de sys_core_foldApenas de erl_lint, como o qlc_pt do OTP faz quando o compilador não está disponívelqlc_pt

Shell interativa

DiferençaOTPClauseResponsável
Edição de linhas num terminaledlin: teclas de cursor, histórico de linhas, pesquisa, conclusão com Tab através de edlin_expand, o prompt multilinha ..>A edição de linhas do próprio terminal (modo cooked); as linhas são lidas tal como o terminal as entrega, com o mesmo prompt para cada linha adicional de um comando, como o OTP faz para entrada por pipebiblioteca
Controlo de tarefasCtrl+G abre o menu JCL (shells novas, ligadas, interrompidas e terminadas)Nenhum; o cabeçalho e a indicação de comando lento continuam a nomear Ctrl+G como o OTP os imprimebiblioteca
exit(). quando a shell lê entrada por pipeUma shell nova arranca e não lê mais nadaUma shell nova arranca e lê o resto da entradabiblioteca
Programas que iniciam a shell sem --shellTodos os módulos do caminho de código podem ser chamadosApenas os módulos que o programa liga; sem --keep-exports as chamadas dinâmicas chegam apenas a exportações alcançáveis pelo programabiblioteca
Records de módulos compilados (rr(Module), shell_default e user_default no arranque)Lidos da informação de depuração ou do código-fonte do módulo{error, nofile}: o código ligado não mantém código abstrato; rr/1,2,3 de ficheiros de código-fonte e .beam leem-nosbiblioteca
save_module/1Escreve o módulo e compila-o com c:c/1Escreve apenas o módulo (sem compilador)biblioteca
edlin_expand:expand/1,2 dentro de uma chamada ou valor de campo de recordCabeças de funções e tipos de argumentos da especificação da função (lists:seq(From, To)), átomos e tipos permitidos pela especificaçãoCabeças Mod:Fun/Arity das aridades exportadas, sem sugestões de tipos: o código ligado não mantém especificaçõesbiblioteca
edlin_expand:expand/1,2 de funções e módulosFunções agrupadas pelos grupos da documentação; módulos do caminho de códigoUm grupo Functions (sem documentação); os módulos do programabiblioteca
Colunas de c:i/0,1, c:ni/0, c:regs/0Chamada inicial e função atual de cada processoA chamada inicial de proc_lib ou undefined; a função atual undefined (sem item current_function)biblioteca

Números aleatórios

DiferençaOTPClauseResponsável
Alturas das faixas do zigurate normal de randConstantes tabeladasCalculadas para o double mais próximo a partir das constantes do zigurate; uma altura pode diferir no último bit, o que altera uma aceitação no caminho lento apenas para um sorteio dentro desse bit do limite (probabilidade próxima de 2^-53 por sorteio no caminho lento). As larguras e os limites das faixas são observados a partir do OTP e são iguaisbuiltins

crypto

DiferençaOTPClauseResponsável
Ordem de crypto:supports(ciphers)A tabela do NIF ordenada por índice de átomo, que varia entre execuções da VM, depois os aliasesA ordem da tabela do OTP, depois os aliasesbuiltins
{File, Line} dos erros {badarg | notsup | error, {File, Line}, Description} de cryptoFicheiro-fonte C e linha do OTP ({"hash.c", 111})Ficheiro-fonte C++ e linha do Clause ({"hash.cpp", 63}); a classe e a descrição são as do OTPbuiltins
link_type de crypto:info/0Como o OTP ligou libcrypto (normalmente dynamic)Sempre static, também quando é ligada uma libcrypto partilhada instaladaOpenSSL
Cálculos longos de pbkdf2_hmac/5 (mais de 100 iterações ou 64 bytes)Executados num escalonador de CPU dirtyExecutados na thread de trabalho do escalonador do processo chamador, que não executa mais nenhum processo entretantobuiltins
modules da aplicação crypto[crypto, crypto_ec_curves][crypto]biblioteca
Textos longos de crypto_one_time/4,5 e crypto_one_time_aead/4,6,7 (mais de 20000 bytes)Executados num escalonador de CPU dirtyExecutados na thread de trabalho do escalonador do processo chamador, que não executa mais nenhum processo entretantobuiltins
A variável de aplicação fips_mode de cryptoLida quando o módulo crypto é carregado: true ativa o modo FIPSNão é lida (o Clause não tem on_load e os programas não têm sys.config): usar crypto:enable_fips_mode/1 ou clau --fipscrypto
crypto:info_fips/0 sem um fornecedor FIPS carregávelnot_enabled quando o OTP foi compilado com suporte FIPS, not_supported caso contrárionot_supportedcrypto
Quando a aplicação crypto é carregadaQuando o módulo crypto é carregado (o seu on_load)Quando um gerador crypto_cache, crypto_aes ou crypto_prng1 lê rand_cache_size pela primeira vezbiblioteca
Geração de chaves RSA (crypto:generate_key(rsa, ...)) e assinaturas SLH-DSAExecutadas num escalonador de CPU dirtyExecutadas na thread de trabalho do escalonador do processo chamador, que não executa mais nenhum processo entretantobuiltins
A opção rsa_sslv23_padding de crypto:public_encrypt/4 e das funções afinsAceite quando o OTP é compilado com um OpenSSL que tem padding SSLv23 (1.1, 3.x)"Bad padding type in option rsa_padding", como o OTP compilado com OpenSSL 4builtins
crypto:ec_curve/1 de uma curva que a libcrypto ligada não tem (um OpenSSL compilado sem curvas binárias)Os parâmetros de crypto_ec_curveserror:function_clause, como para uma curva desconhecida: os parâmetros vêm das curvas incorporadas da libcryptobuiltins
Desencriptação de informação de depuração por beam_lib num programa que não chama cryptocrypto está sempre presentekey_missing_or_invalid a menos que o programa ligue crypto (--with-crypto), pois beam_lib chama-o dinamicamentebiblioteca

ASN.1

DiferençaOTPClauseResponsável
Pilha em {error, {asn1, {Reason, Stack}}}Frames das funções geradas enc_*/dec_* e de asn1rtt_*Frames de Module:encode/2 ou decode/2 e do builtin do codecasn1
Funções de um módulo geradoTambém exporta enc_Type/1,2, dec_Type/1,2 e as restantes funções por tipo geradas por asn1ctApenas encode/2, decode/2, info/0, as funções de opções e as funções de valoresasn1
Um CHOICE cujo corpo começa com ... (sem alternativas de raiz)asn1ct comunica um erro de sintaxeAceiteasn1
Macros e funções de valores que nomeiam outro valor dentro de um tipo aberto (mgf1SHA1, rSASSA-PSS-Default-Identifier de PKCS-1)asn1ct deixa {'Externalvaluereference', Line, Module, Name} no lugar do valorO valor referenciadoasn1
Um erro de runtime (não de ASN.1) enquanto public_key descodifica ou codifica um valor de extensãoLançado quando ocorre, sobretudo da classe error, a partir da função gerada dec_ext-*/enc_ext-*exit({error, {asn1, Reason}}): o valor passa por decode/2 ou encode/2 do módulo gerado, que encapsula todas as falhaspublic_key
Os grupos Diffie-Hellman predefinidos de public_key:dh_gex_group/4Os grupos gerados pelo OTP (lib/public_key/priv/moduli), 60–81 por tamanhoOito por tamanho do ficheiro moduli do OpenSSH; os mesmos tamanhos (2047 a 8191)public_key
Frames de uma exceção de public_keypublic_key, pubkey_pem, pubkey_pbe, pubkey_cert_records, pubkey_cert, pubkey_sshpublic_key, clause_public_key_codec e clause_public_key_keyspublic_key

Parse transforms

DiferençaOTPClauseResponsável
Nome no atributo file de um ficheiro incluído (--print-abstr, entrada do transform)O diretório de include unido ao nome, tal como encontrado (inc.hrl, /abs/dir/inc.hrl, ../inc/x.hrl)O caminho relativo ao diretório de trabalho quando o ficheiro está dentro dele, caso contrário o caminho absolutotransforms
Anotações de linha 0 de formas importadas (código gerado, como o do transform de qlc)Uma linha válida: o código não tem linha de origemO código toma o lugar do nó importado antes deletransforms
Anotações generated de formas importadas (entradas .abstr, saída do transform)erl_lint e o compilador omitem alguns avisos para código geradoIgnoradas: o código é verificado como código-fontetransforms
Formas {error, {Location, Module, Descriptor}} em código importadoFormatadas com Module:format_error/1O texto do termo do descritor; a formatação requer o OTPtransforms
Um módulo com erros de pré-processamento ou de análise sintática que nomeia um parse transformO transform corre e recebe os erros como formas {error, E}; erl_lint comunica-os depoisOs erros são comunicados e o transform não corretransforms
Opções de compilação que um transform recebeA lista completa de opções do erlc{features, _}, report_warnings, report_errors, {cwd, _}, {outdir, _} (o diretório de trabalho), {i, _}, {d, ...} e {parse_transform, _}transforms