DAT
Documentação

Códigos de erro

Estes são os códigos de erro comuns às bibliotecas de serviço oficialmente suportadas pelo DAT.

Cada código carrega dois valores — impacto e repetição — e alguns recebem ainda a etiqueta suspeita.

Impacto — o golpe que o serviço sofre

É o critério para disparar um alerta. Observa-se apenas uma coisa: "o serviço está parado neste momento?".

ImpactoSignificadoExemplo
CríticoO serviço ou uma função específica para. Emissão impossível, sincronização com falha permanente, falha de inicializaçãoO servidor emissor não tem um único certificado utilizável
ParcialAlgumas requisições ou ciclos falham, mas o serviço continua funcionando. Em geral, recupera-se sozinhoUm ciclo do CMS falha. Tudo continua com os certificados já existentes
Sem impactoUma requisição é rejeitada e prontoChega um token adulterado. Basta filtrá-lo

Sem impacto não é caso de alerta. Se toda a equipe de plantão tivesse que verificar porque uma entrada errada chegou uma única vez, o alerta perderia todo o sentido.

Suspeita — investigar se persistir

Os códigos com a etiqueta Suspeita fazem parte da operação normal quando aparecem isolados. O cliente pode enviar valores errados a qualquer momento, e o papel da biblioteca é justamente filtrá-los.

No entanto, se esses erros ocorrerem de forma persistente ou concentrados em uma origem específica, trata-se de um destes dois casos.

  • Anomalia de configuração — implantação incorreta, clientes de uma versão antiga ainda em operação, ou certificados desalinhados.
  • Tentativa de invasão — tentativa de passar na verificação com tokens ou chaves adulterados, ou uma varredura em busca de valores válidos.

Por isso, para esses códigos o correto é acompanhar a contagem como métrica. Basta avisar quando ultrapassar um limiar.

Repetição

RepetiçãoSignificado
TransitórioResolve-se ao tentar de novo após um backoff
PermanenteNão repetir. É preciso corrigir a configuração ou a entrada
EstadoNão é um erro, e sim um sinal

Token

Problemas com a própria cadeia do token recebido.

DAT_TOKEN_MALFORMEDSem impactoPermanenteshieldSuspeita

As partes separadas por pontos não são exatamente cinco, expire não é decimal puro, cid não é hexadecimal puro, plain ou secure não estão em base64url, ou um campo numérico ultrapassa a faixa inteira representável.

arrow_forwardRejeitar a requisição

DAT_TOKEN_EXPIREDSem impactoPermanente

expire <= now. O instante exato também conta como expirado — se expire == now, o token já está expirado.

arrow_forwardInduzir a reemissão do token

DAT_TOKEN_UNKNOWNParcialPermanente

Um erro de token que não se enquadra em nenhuma das categorias acima.

arrow_forwardVerificar os logs

Nunca confunda expiração com erro de formato

As reações são opostas — a expiração é um fim de vida normal, basta levar à renovação do token; um erro de formato significa que o token nunca foi emitido por nós e deve ser rejeitado.

A análise determina primeiro a estrutura e só depois examina os valores. Uma cadeia como "1.2.3", à qual faltam partes, não é um token expirado, mas simplesmente não é um token: por isso é DAT_TOKEN_MALFORMED.

Um sinal no campo expire, como +100, também não é expiração, e sim erro de formato. Somente dígitos ASCII puros são aceitos.


Certificado

O formato da cadeia do certificado e a questão de saber se esse certificado pode ser usado agora.

DAT_CERT_MALFORMEDCríticoPermanente

As partes separadas por pontos não são exatamente oito, a análise de cid, start, duration ou ttl falhou, um campo de chave não está em base64url, ou start + duration + ttl ultrapassa u64.

arrow_forwardReimplantar o certificado

DAT_CERT_EXPIREDCríticoPermanente

start + duration + ttl < now. Totalmente expirado: nem emitir nem verificar é possível.

arrow_forwardRenovar o certificado

DAT_CERT_NOT_YET_ISSUABLECríticoTransitório

now < start. A janela de emissão ainda não abriu.

arrow_forwardAguardar

DAT_CERT_ISSUANCE_ENDEDCríticoPermanente

now > start + duration, mas ainda resta ttl. Já não é possível emitir, apenas verificar.

arrow_forwardImplantar um novo certificado

DAT_CERT_VERIFY_ONLYCríticoPermanente

Um certificado que contém apenas a chave pública, sem a chave privada de assinatura. Verificar funciona, emitir não.

arrow_forwardVerificar a configuração de implantação

DAT_CERT_NOT_FOUNDSem impactoPermanenteshieldSuspeita

Não há nenhum certificado correspondente ao cid do token. Ou é um token falsificado, ou uma implantação errada.

arrow_forwardRejeitar a requisição

DAT_CERT_NOT_SYNCEDParcialTransitório

Esse cid ainda não foi recebido do CMS. Ocorre brevemente logo após implantar um novo certificado.

arrow_forwardTentar de novo após a sincronização

DAT_CERT_DUPLICATE_CIDCríticoPermanente

O mesmo cid aparece mais de uma vez na lista importada.

arrow_forwardVerificar a resposta do servidor

DAT_CERT_UNKNOWNParcialPermanente

Um erro de certificado que não se enquadra em nenhuma das categorias acima.

arrow_forwardVerificar os logs

DAT_CERT_NOT_FOUND e DAT_CERT_NOT_SYNCED apresentam os mesmos sintomas, mas exigem reações diferentes. O primeiro é um cid que nunca emitimos: esperar não muda nada. O segundo se resolve assim que a sincronização acontece.

Um DAT_CERT_NOT_FOUND isolado basta filtrar; se o número crescer de repente, é porque a implantação saiu do compasso ou há tokens falsificados circulando.


Assinatura

DAT_SIG_MISMATCHSem impactoPermanenteshieldSuspeita

A verificação da assinatura terminou em divergência. O valor HMAC não confere, ou ECDSA verify retorna false.

arrow_forwardBloquear a sessão, log de segurança

DAT_SIG_MALFORMEDSem impactoPermanenteshieldSuspeita

A parte da assinatura está vazia, não está em base64url, o comprimento de r‖s do ECDSA não corresponde à curva, ou a conversão para DER falhou.

arrow_forwardRejeitar a requisição

DAT_SIG_KEY_MISSINGCríticoPermanente

Tentou-se assinar com uma chave apenas de verificação. Em tempo de execução não há chave privada.

arrow_forwardVerificar a configuração do servidor emissor

DAT_SIG_BACKENDParcialPermanente

A operação de assinatura ou verificação sequer chegou a ser executada. Tipo de chave incorreto, handle liberado, ou erro interno da biblioteca criptográfica.

arrow_forwardVerificar o tipo de chave e a biblioteca

DAT_SIG_UNKNOWNParcialPermanente

Um erro de assinatura que não se enquadra em nenhuma das categorias acima.

arrow_forwardVerificar os logs

Não misture divergência com falha do backend

Os dois códigos estão em eixos opostos.

  • DAT_SIG_MISMATCH — apenas uma assinatura recebida que não confere, portanto sem impacto no serviço; em contrapartida, se persistir, é caso de suspeita.
  • DAT_SIG_BACKEND — a própria operação de verificação não rodou: é um problema do nosso lado e não um caso de suspeita.

Relatar um tipo de chave incorreto ou um bug de biblioteca como "divergência de assinatura" mistura, entre os indicadores de ataque, uma situação em que na verdade o nosso código é que está quebrado. Ao contrário, uma falsificação real classificada como erro de backend some por completo das métricas de suspeita.


Criptografia

Problemas de cifragem e decifragem do payload secure.

DAT_CRYPTO_TAG_MISMATCHSem impactoPermanenteshieldSuspeita

A tag de autenticação AES-GCM não confere. Ou o secure foi adulterado, ou a chave do certificado é outra.

arrow_forwardBloquear a sessão, log de segurança

DAT_CRYPTO_DATA_INVALIDSem impactoPermanenteshieldSuspeita

O texto cifrado não está vazio, mas não passa do tamanho do IV (12 bytes), ou a entrada excede o limite da implementação (INT_MAX, etc.).

arrow_forwardRejeitar a requisição

DAT_CRYPTO_BACKENDParcialPermanente

A operação de cifragem ou decifragem não pôde ser executada. Plataforma sem suporte a GCM, ou falha ao inicializar o contexto.

arrow_forwardVerificar o suporte da plataforma

DAT_CRYPTO_UNKNOWNParcialPermanente

Um erro de cifragem/decifragem que não se enquadra em nenhuma das categorias acima.

arrow_forwardVerificar os logs

Um payload secure vazio não é erro. Entrada vazia vira saída vazia, e nenhum código é emitido.

No caminho que pula a verificação de assinatura, a tag GCM é a única checagem de integridade. Por isso DAT_CRYPTO_TAG_MISMATCH não é agrupado com as demais falhas de decifragem sob um mesmo código.


Chave

DAT_KEY_INVALIDSem impactoPermanenteshieldSuspeita

O comprimento da chave não corresponde ao algoritmo declarado (HMAC 32/48/64, AES 16/32), o ponto não está sobre a curva, d ∉ [1,n-1], o formato não é descomprimido (0x04), ou a chave privada e a pública não formam um par.

arrow_forwardSubstituir a chave

DAT_KEY_VERIFY_ONLY_UNSUPPORTEDCríticoPermanente

Solicitou-se uma exportação apenas de verificação para um algoritmo da família HMAC.

arrow_forwardTrocar de algoritmo

DAT_KEY_UNKNOWNParcialPermanente

Um erro de chave que não se enquadra em nenhuma das categorias acima.

arrow_forwardVerificar os logs

Três casos parecidos, mas diferentes:

CódigoSignificado
DAT_KEY_VERIFY_ONLY_UNSUPPORTEDLimite estrutural do algoritmo. HMAC é simétrico e não tem conceito de chave pública
DAT_SIG_KEY_MISSINGEstado em tempo de execução. Esta chave não contém, neste momento, uma chave privada
DAT_CERT_VERIFY_ONLYForma de implantação. Este certificado foi implantado apenas para verificação

Gerenciador

O estado do objeto que guarda os certificados e é usado para emitir e verificar.

DAT_MANAGER_NO_CERTIFICATECríticoTransitório

Não há nenhum certificado. Ou antes da importação, ou após falhar a primeira sincronização com o CMS.

arrow_forwardVerificar a conexão com o CMS

DAT_MANAGER_NO_ISSUABLE_CERTIFICATECríticoPermanente

Há certificados, mas nenhum deles pode ser usado para emitir neste momento. A causa vem junto com o erro.

arrow_forwardDecidir conforme a causa — ver a tabela abaixo

DAT_MANAGER_DISPOSEDCríticoPermanente

Um gerenciador ou certificado já liberado foi utilizado.

arrow_forwardCorrigir o código que chama

DAT_MANAGER_UNKNOWNParcialPermanente

Um erro de gerenciador que não se enquadra em nenhuma das categorias acima.

arrow_forwardVerificar os logs

A causa (cause) de DAT_MANAGER_NO_ISSUABLE_CERTIFICATE é uma destas quatro. O que fazer difere completamente conforme a origem.

CausaSignificadoRepetiçãoReação
DAT_CERT_NOT_YET_ISSUABLEAntes do início da janela de emissãoTransitórioResolve-se esperando
DAT_CERT_ISSUANCE_ENDEDJanela de emissão encerrada, só a verificação é possívelPermanenteÉ preciso implantar um novo certificado
DAT_CERT_EXPIREDTodo o acervo está expiradoPermanenteÉ preciso renovar os certificados
DAT_CERT_VERIFY_ONLYTodo o acervo é apenas de verificaçãoPermanenteÉ um erro de configuração da implantação

Se o servidor emissor estiver configurado para receber apenas certificados de verificação, aparece DAT_CERT_VERIFY_ONLY. Esperar nunca resolve, portanto não é caso de repetição.


Configuração

Problemas com os valores passados por quem chama. A família CONFIG é composta inteiramente por erros que precisam ser corrigidos no código; se aparecerem em produção, é porque a implantação está errada.

DAT_CONFIG_ALG_UNSUPPORTEDCríticoPermanente

Nome de algoritmo desconhecido. Precisa coincidir exatamente com a notação de transporte (ECDSA-P256, IV-AES256-GCM).

arrow_forwardVerificar o nome do algoritmo

DAT_CONFIG_ARGUMENT_INVALIDCríticoPermanente

Um argumento obrigatório é null, está fora da faixa permitida (valor de tempo negativo, interval <= 0), é de um tipo não suportado (um número ou booleano como payload em linguagens de tipagem dinâmica), ou o corpo a ser assinado está vazio.

arrow_forwardCorrigir o código que chama

DAT_CONFIG_URI_INVALIDCríticoPermanente

A URI do servidor CMS está fora da especificação. Não é analisável, o esquema não é http/https, ou há um caminho ou uma query anexada.

arrow_forwardCorrigir a URI

DAT_CONFIG_UNKNOWNCríticoPermanente

Um erro de configuração que não se enquadra em nenhuma das categorias acima.

arrow_forwardVerificar os logs


Interno

Problemas do ambiente de execução e do runtime.

DAT_INTERNAL_UNAVAILABLECríticoPermanente

O backend criptográfico ou a API do runtime simplesmente não existe. Falta crypto.subtle, a plataforma não suporta AES-GCM, ou a versão do runtime é insuficiente.

arrow_forwardVerificar a implantação e a plataforma

DAT_INTERNAL_UNKNOWNCríticoPermanente

Falha na alocação de memória, falha na geração de aleatoriedade, falha ao adquirir um lock, ou chegou-se a um ramo projetado como inalcançável.

arrow_forwardVerificar os logs

DAT_INTERNAL_UNAVAILABLE se resolve corrigindo o ambiente de implantação; DAT_INTERNAL_UNKNOWN costuma ser uma falha de runtime ou um bug da biblioteca.


Sincronização do CMS

Sem a sincronização com o CMS, estes códigos não aparecem.

DAT_CMS_UNREACHABLEParcialTransitório

Falha de DNS, conexão recusada, falha de TLS, tempo limite. O tempo limite não tem código próprio e está incluído aqui — a reação é a mesma.

arrow_forwardTentar de novo após um backoff

DAT_CMS_UNAUTHORIZEDCríticoPermanente401

O servidor respondeu 401. O token está ausente ou incorreto.

arrow_forwardVerificar a configuração do token

DAT_CMS_FORBIDDENCríticoPermanente403

O servidor respondeu 403. O token é válido, mas não tem permissão neste endpoint.

arrow_forwardVerificar o nível do token

DAT_CMS_ENDPOINT_NOT_FOUNDCríticoPermanente404

O servidor respondeu 404. A URL está errada.

arrow_forwardVerificar a configuração da URL

DAT_CMS_SERVER_ERRORParcialTransitório5xx

O servidor respondeu 5xx.

arrow_forwardTentar de novo após um backoff

DAT_CMS_HTTP_STATUSCríticoPermanente

Uma resposta não-2xx que não corresponde a nenhum dos casos acima.

arrow_forwardVerificar o código de status

DAT_CMS_MALFORMEDCríticoPermanente

A resposta não tem linha de versão, a linha de versão não é decimal pura, ou ultrapassa a faixa.

arrow_forwardVerificar a versão do servidor

DAT_CMS_IMPORT_FAILEDCríticoPermanente

A resposta chegou, mas os certificados não puderam ser aplicados. A origem vai em cause.

arrow_forwardVerificar CERT_* / KEY_* em cause

DAT_CMS_VERSION_RESETSem impactoEstado200

O servidor devolveu uma versão anterior à nossa. É a instrução de ressincronização completa.

arrow_forwardTratado automaticamente

DAT_CMS_NOT_SYNCEDCríticoTransitório

Ainda não houve nenhuma sincronização bem-sucedida.

arrow_forwardAguardar a primeira sincronização

DAT_CMS_SYNC_IN_PROGRESSSem impactoEstado

A sincronização anterior ainda está rodando, por isso este ciclo foi pulado. Não é um erro.

DAT_CMS_NOT_SUPPORTEDCríticoPermanente

A funcionalidade CMS não está incluída na compilação. Feature desativada ou CURL ausente.

arrow_forwardVerificar as opções de compilação

DAT_CMS_UNKNOWNParcialPermanente

Um erro de CMS que não se enquadra em nenhuma das categorias acima.

arrow_forwardVerificar os logs

Os códigos em que a sincronização é considerada falha permanente (UNAUTHORIZED, FORBIDDEN, ENDPOINT_NOT_FOUND, MALFORMED, IMPORT_FAILED) são todos críticos. Repetir não resolve nada enquanto os certificados continuam expirando: se ficar sem tratamento, o serviço acabará necessariamente parando.

UNREACHABLE e SERVER_ERROR são parciais. Tudo continua com os certificados existentes e a sincronização se recupera sozinha no ciclo seguinte — mas se as falhas continuarem, no fim passa para crítico. Coloque o alerta sobre o número de falhas consecutivas.

Falhas de sincronização não são lançadas como exceção

Mesmo que a primeira sincronização falhe, o gerenciador é devolvido normalmente — é melhor que a sincronização acabe acontecendo, ainda que tarde. A falha, em contrapartida, permanece como estado consultável.

ClienteConsulta
Rustmanager.last_error().await
Gomanager.LastError()
JavaScriptmanager.lastError()
Pythonmanager.last_error()
Rubymanager.last_error
Java/Kotlinmanager.lastError
C#manager.LastError
C/C++dat_cms_manager_last_error(m)

Se nunca houve sucesso, ali consta DAT_CMS_NOT_SYNCED; em funcionamento normal o valor está vazio.


Servidor

Códigos emitidos pelo servidor CMS. Os clientes não os geram, apenas os recebem.

DAT_AUTH_UNAUTHORIZEDSem impactoPermanenteshieldSuspeita401

O cabeçalho Authorization está ausente, ou o token não está registrado em nenhum nível.

DAT_AUTH_FORBIDDENSem impactoPermanenteshieldSuspeita403

O token está registrado, mas não no nível exigido por este endpoint.

DAT_AUTH_DISABLEDCríticoEstado

Nenhum token está configurado, portanto a autenticação está inteiramente desativada. Com isso, até a API de emissão de certificados fica aberta sem autenticação. Não sai na resposta, apenas é registrada no log de inicialização.

arrow_forwardConfigurar um token imediatamente

DAT_REQ_MALFORMEDSem impactoPermanenteshieldSuspeita400

Os parâmetros de caminho ou de query não são interpretáveis, ou um argumento está fora da faixa permitida (delay negativo, mais de dez anos, etc.).

DAT_REQ_ALG_UNSUPPORTEDSem impactoPermanente400

O nome do algoritmo no caminho da requisição é desconhecido.

DAT_REQ_NOT_FOUNDSem impactoPermanenteshieldSuspeita404·405

Essa rota não existe ou o método é diferente.

DAT_REQ_TOO_LARGESem impactoPermanenteshieldSuspeita413

O tamanho do corpo da requisição foi excedido.

DAT_REQ_UNKNOWNSem impactoPermanente400

Um erro de requisição que não se enquadra em nenhuma das categorias acima.

DAT_STORE_UNAVAILABLEParcialTransitório503

Conexão com o banco perdida, pool de conexões esgotado, contenção de locks, tempo limite. O único código que usa 503 — o sinal pelo qual o cliente sabe que "isso melhora esperando".

arrow_forwardTentar de novo após um backoff

DAT_STORE_UNKNOWNCríticoPermanente500

Falha de leitura ou escrita, tabela inexistente, esquema divergente, linha de certificado corrompida.

arrow_forwardVerificar o estado do banco

Envelope de resposta:

json
{
  "code": "DAT_REQ_ALG_UNSUPPORTED",
  "details": { "algorithm": "BOGUS-ALG" }
}

Para os erros que surgem ao criar e manipular certificados, o servidor usa como estão os códigos comuns acima (DAT_CERT_*, DAT_KEY_*, DAT_CONFIG_*).

Ao receber um código do servidor

O cliente envolve o código do servidor no seu próprio código CMS e preserva o original em cause.

RecebidoHTTPCódigo emitido pelo cliente
DAT_AUTH_UNAUTHORIZED401DAT_CMS_UNAUTHORIZED
DAT_AUTH_FORBIDDEN403DAT_CMS_FORBIDDEN
DAT_REQ_NOT_FOUND404DAT_CMS_ENDPOINT_NOT_FOUND
DAT_REQ_* (os demais)400·405·413DAT_CMS_HTTP_STATUS
DAT_STORE_UNAVAILABLE503DAT_CMS_SERVER_ERROR
DAT_STORE_UNKNOWN500DAT_CMS_SERVER_ERROR
(regressão de versão)200DAT_CMS_VERSION_RESET

Buscar por sintoma

SintomaCódigo
Funciona logo após o login e pouco depois é rejeitadoDAT_TOKEN_EXPIRED — A vida útil do token acabou. Basta reemitir
A verificação falha só em um servidor específicoDAT_CERT_NOT_SYNCED — Esse servidor ainda não recebeu o novo CID
O mesmo token é rejeitado em todos os servidoresDAT_CERT_NOT_FOUND — Um CID que nunca emitimos
O servidor emissor não consegue criar tokensDAT_MANAGER_NO_ISSUABLE_CERTIFICATE + DAT_CERT_VERIFY_ONLYFoi implantado como verify-only
A emissão falha apenas logo após a inicializaçãoDAT_MANAGER_NO_CERTIFICATE — Antes da primeira sincronização. Resolve-se em breve
A sincronização com o CMS falha continuamenteDAT_CMS_UNAUTHORIZED — O token está errado. Repetir não resolve
Não chega nenhum certificadoDAT_CMS_ENDPOINT_NOT_FOUND — Há um erro de digitação na URL
Falha apenas em uma plataforma específicaDAT_INTERNAL_UNAVAILABLE — Falta o backend criptográfico
As falhas de verificação aumentam de repenteDAT_SIG_MISMATCH — Isolada é inofensiva, mas em massa é tentativa de falsificação
A decifragem do secure falha de repenteDAT_CRYPTO_TAG_MISMATCH — Certificados desalinhados ou tentativa de adulteração
Aviso no log de inicialização do CMSDAT_AUTH_DISABLEDA autenticação está desligada. A API de emissão está aberta

Apêndice

Sintaxe dos códigos

DAT_<área>_<causa>
  • Quando a mesma causa ocorre em áreas diferentes, o nome da causa é idêntico. DAT_TOKEN_MALFORMED e DAT_CERT_MALFORMED diferem apenas no objeto; o sentido é o mesmo.
  • _UNKNOWN é exclusivamente o recuo de cada área. Não é usado com outro sentido, como "algoritmo desconhecido" (para isso existe _UNSUPPORTED).
  • A cadeia do código é um contrato público. A mensagem pode ser alterada livremente; o código, não.
CategoriaPrefixo de código
TokenDAT_TOKEN_
CertificadoDAT_CERT_
AssinaturaDAT_SIG_
CriptografiaDAT_CRYPTO_
ChaveDAT_KEY_
GerenciadorDAT_MANAGER_
ConfiguraçãoDAT_CONFIG_
InternoDAT_INTERNAL_
Sincronização do CMSDAT_CMS_
ServidorDAT_AUTH_ · DAT_REQ_ · DAT_STORE_

Acesso conforme o cliente

ClienteTipo de erroCódigoClasse de repetiçãoEvento de segurança
RustDatError enumerr.code()err.retry()err.security_event()
Go*dat.Errorerr.Codedat.Retry(err)dat.SecurityEvent(err)
JavaScriptDatError extends Errore.codee.retrye.securityEvent
PythonDatError(ValueError, RuntimeError)e.codee.retrye.security_event
RubySaro::Dat::Errore.codee.retrye.security_event?
Java/KotlinDatExceptione.codee.retrye.securityEvent
C#DatExceptione.Codee.Retrye.SecurityEvent
C/C++dat_error_tdat_error_code(e)dat_error_retry(e)dat_error_is_security_event(e)
Servidor CMSEnvelope JSONcampo code

Evento de segurança só retorna true nos dois casos em que a falsificação ou a adulteração é certa (DAT_SIG_MISMATCH, DAT_CRYPTO_TAG_MISMATCH). A etiqueta suspeita deste documento abrange mais (chegando a tokens, chaves e requisições adulterados); por ora é apenas uma classificação da documentação e não é exposta pela API do cliente.

O nível de impacto também é uma classificação da documentação. Um mesmo código pode atingir de formas diferentes conforme onde ocorre — DAT_KEY_INVALID, por exemplo, não tem impacto quando serve para filtrar um token recebido, mas faz toda a sincronização fracassar quando ocorre ao ler um certificado durante a sincronização com o CMS.

As causas subjacentes não são perdidas. DAT_MANAGER_NO_ISSUABLE_CERTIFICATE e DAT_CMS_IMPORT_FAILED transmitem a origem pelo encadeamento de exceções de cada linguagem (cause / __cause__ / InnerException / Unwrap()).

C/C++ também mantém os valores inteiros

Os valores inteiros existentes de dat_error_t são mantidos por compatibilidade de ABI, mas quem vale é o código textual. A biblioteca não devolve mais os valores antigos, portanto uma comparação como err == DAT_ERROR_INVALID_DAT já não confere. Compare por meio de dat_error_code(e).

C não tem encadeamento de exceções, então a causa é consultada à parte com dat_manager_issuable_cause().