Exceção no meio do fluxo, arquivo aberto: por que o SDK em C++17 do jsonW fecha no lugar certo
Em novembro de 2026, um levantamento sobre credenciais expostas no GitHub mostrou 1.122 arquivos públicos com segredo de verdade. A lição serve ao C++: o recurso precisa fechar no lugar certo, mesmo no erro. O SDK em C++17 do jsonW faz isso com RAII: jsonw::Leitor e jsonw::Escritor fecham no fim do escopo e o arquivo .jsw só aparece completo. O texto explica o que muda na prática, traz o código real do cabeçalho e as medições declaradas no README.

O arquivo fechado no meio do fluxo
Em 9 de novembro de 2026, o site de notícias de tecnologia LavX News publicou um levantamento da empresa de segurança Apiiro sobre o Claude Code, da Anthropic. O número que importa para quem escreve software é este: 1.122 cópias públicas do arquivo .claude/settings.local.json, encontradas pelo GitHub, continham credencial de verdade, entre senhas de banco, tokens e chaves de nuvem. O total, contando versões antigas e forks, chegou a 2.539 segredos em 1.994 repositórios (LavX News, 09/11/2026).
Vale ler a notícia por inteiro para entender a lição. O problema não foi só de ferramenta: o problema é que credencial escrita à mão numa linha de comando, ou num arquivo de configuração que ninguém fecha direito, sai do controle. A parte que interessa a um time de C++ é a mesma de sempre, e não depende de IA nenhuma: recurso aberto precisa ser fechado no lugar certo, mesmo quando o meio do caminho falha.
É exatamente o que o C++ resolve com RAII, e o que o SDK em C++17 do jsonW usa como base para abrir e gravar um arquivo .jsw: o leitor e o escritor são objetos de escopo, e o arquivo não fica aberto quando o código dá errado.
O que muda na prática para quem decide tecnologia
Quem mantém um sistema em C++ convive com três custos que não aparecem no relatório: arquivo aberto por mais tempo do que devia, dado perdido quando o processo morre no meio da gravação, e conversão de formato feita em três lugares diferentes. Na prática, os três saem do mesmo lugar.
Segundo o README do jsonW, o formato é um modelo de dados com três formas que se convertem sem perda: linha (binária, para mensagem e evento), coluna (o arquivo .jsw, em blocos lidos por mmap) e texto (jsonW-texto, em que todo JSON válido já é válido). O mesmo README declara duas medições feitas com 100 mil registros, comparando com o mesmo conjunto em JSONL lido pelo próprio leitor de JSON do projeto: arquivo 4,9 vezes menor e leitura de um campo de uma linha 3.281 vezes mais rápida. O próprio README avisa que bibliotecas de JSON mais otimizadas reduzem a diferença ao gravar e ler tudo, e que a diferença do acesso direto vem do formato em colunas. O convite é medir na máquina de cada um com wjsw medir.
Sobre custo de nuvem, memória e servidor, o README não traz número medido. O que existe é o mecanismo: o .jsw é lido por mmap compartilhado entre processos, e a leitura remota parcial baixa só os blocos das linhas pedidas. Disco menor, menos conversão e menos cópia de memória são consequência direta desse desenho. Quem compra servidor decide com a própria medição, não com a de outro.
Por que RAII resolve, e não é detalhe de estilo
RAII é o nome da ideia de amarrar a liberação de um recurso ao tempo de vida de um objeto. No C++, o destruidor do objeto roda quando ele sai de escopo. A referência da linguagem confirma que, ao fim do escopo, o compilador chama os destruidores dos membros na ordem inversa da declaração e depois os das classes base (cppreference, página de destruidor). Ou seja: quem escreve o código não precisa lembrar de fechar nada em cada caminho de saída.
No SDK do jsonW em C++17, arquivo sdk/cpp/jsonw.hpp, isso aparece de forma explícita. A classe jsonw::Leitor abre no construtor e fecha no destrutor. A classe jsonw::Escritor faz o mesmo, e ainda oferece descarregar() e fechar(), onde fechar() troca o arquivo de forma atômica, de modo que o .jsw só aparece completo. Se o construtor falhar, ele lança exceção com a mensagem de erro que veio da biblioteca.
jsonw::Escritor w("vendas.jsw", "id:i64,produto:texto,preco:dinheiro");
w.gravar(R"({"id":1,"produto":"Café especial","preco":"12,50 BRL"})");
w.fechar();
jsonw::Leitor a("vendas.jsw");
for (auto i = 0u; i < a.linhas(); i++) std::cout << a.json(i) << "\n";
O trecho acima é o exemplo que abre o próprio cabeçalho jsonw.hpp. Nenhuma linha chama um abrir solto, nenhuma linha chama fechar no fim do laço: o leitor fecha quando sai de escopo.
flowchart TD
A["escopo abre"] --> B["Leitor ou Escritor no construtor"]
B --> C{"a operação deu certo?"}
C -- sim --> D["gravar ou ler linha a linha"]
D --> E{"fechar() chamado?"}
E -- sim --> F["arquivo .jsw publicado inteiro"]
C -- nao --> G["exceção sai do trecho"]
G --> H["destrutor roda na saída do escopo"]
E -- nao --> H
H --> I["nenhum arquivo fica aberto"]
O que se usa hoje e o que o SDK muda
O caminho mais comum em C++ é abrir o arquivo na mão, escrever, e confiar que todo return do meio lembra de fechar. Quando alguém esquece, o problema aparece dias depois, no processo que não consegue mexer no arquivo. O SDK em C++17 do jsonW troca isso por objeto de escopo, com duas consequências práticas.
A primeira é a custódia. Segundo o README, cada bloco do .jsw carrega marcador, crc32c e hash, e o comando wjsw conferir verifica a cadeia inteira: se algum byte foi trocado, a conferência falha. A segunda é a checagem no lugar certo: conferir() no leitor é um método, chamado quando o time quiser, e não uma cerimônia esquecida no fim do código.
wjsw de-texto "id:i64,produto:texto,preco:dinheiro" vendas.jsonl vendas.jsw
wjsw conferir vendas.jsw
O primeiro comando converte o JSONL para .jsw a partir de um esquema de uma linha. O segundo responde com a contagem de linhas e blocos e a conferência de sha256 e crc32c, como descrito no AGENTS.md do repositório. É a diferença entre acreditar que o arquivo está bom e ter a prova na mão.
Qualidade do dado e liberdade funcional
Para quem decide tecnologia, formato só vale a pena quando evita erro caro. O esquema do jsonW é uma linha de texto, do tipo id:i64,produto:texto,preco:dinheiro, e usa tipos de negócio no lugar de texto para tudo. O preço entra como dinheiro, com a moeda junto do valor. O código de produto entra como codigo, guardado byte a byte, e por isso o zero à esquerda de um CNPJ não some. Peso e volume entram como medida[unidade], convertidos ao gravar. Esses são fatos declarados no README e no AGENTS.md.
A liberdade funcional vem de não trocar de banco. O README lista o wcon, que lê PostgreSQL, MySQL, SQLite, Redis e MongoDB para um .jsw e volta, com o esquema tirado do tipo de cada coluna. Quem já tem PostgreSQL continua com ele. O jsonW entra como a camada de arquivo e de leitura rápida, no lugar do CSV ou do JSONL que sobra no meio do processo.
Em C++17, o SDK não pede reescrita do sistema: é um cabeçalho sobre a ABI C da biblioteca. O núcleo é C sem dependência, o que mantém a cadeia de build enxuta e o binário pequeno, sem arrastar runtime extra para dentro do servidor.
Como resolver passo a passo
1. Escolha um conjunto e um esquema. Comece por uma tabela que já dá dor: pedidos, notas fiscais, eventos. Escreva o esquema com o tipo de negócio de cada coluna, sem transformar CPF em número nem preço em texto.
2. Exporte com o wcon. O esquema sai do banco, não da cabeça de alguém. O README documenta a credencial sempre em arquivo, com a senha do PostgreSQL vindo de PGPASSWORD ou de ~/.pgpass, nunca na linha de comando.
3. Confira. Rode wjsw conferir e depois wjsw medir na própria máquina. A medição de 100 mil registros do README serve de referência, não de promessa.
4. Troque o acesso no C++. Onde havia fluxo de arquivo aberto na mão, entra jsonw::Leitor. Onde havia gravação no meio do processo, entra jsonw::Escritor, com fechar() no fim e o destrutor cobrindo o caminho de exceção.
5. Revise credencial e comando. A lição da notícia da Apiiro vale aqui também: senha não se escreve em comando, e arquivo local com segredo não pode ir para o repositório.
A leitura da Wortic é que o ganho não está em trocar a linguagem, e sim em parar de converter o mesmo dado quatro vezes entre o banco, o arquivo e a API. O SDK em C++17 dá a esse caminho o que o C++ já domina: o tempo de vida do recurso dentro do escopo.
Onde a Wortic entra
A Wortic mantém o jsonW e roda nele os seus sistemas de gestão com IA. O SDK em C++17 é uma das dez linguagens atendidas pela mesma ABI C, todas passando pela mesma prova byte a byte (cd sdk && bash prova.sh). Para quem precisa de um acordo comercial, outra plataforma ou suporte na migração de um conjunto de dados, o contato está no site da Wortic.
Para começar, o repositório é público: github.com/developer-wortic/jsonw. A apresentação do formato está em jsonw.org, e as regras para times e para agentes de código estão no AGENTS.md do próprio repositório.
Perguntas frequentes
O SDK em C++ do jsonW exige compilador muito novo?
O cabeçalho é declarado para C++17. Ele é um invólucro fino sobre a ABI C da biblioteca, então o requisito principal é o padrão da linguagem, e não um framework. O arquivo sdk/cpp/jsonw.hpp está no repositório.
O que acontece se o programa cair no meio da gravação?
O README diz que o .jsw só anexa e que cada bloco se sustenta com marcador, crc32c e hash. Se a gravação for cortada, perde-se só o último bloco, e wjsw reparar refaz o fim. Além disso, o fechar() do escritor troca o arquivo de forma atômica.
O jsonW guarda a senha do banco em algum lugar?
Segundo o README e o AGENTS.md, a credencial fica em arquivo ou em variável de ambiente lida pela ferramenta, nunca na linha de comando. O jsonW não é um gerenciador de segredos: a recomendação de guardar a senha num cofre e referenciar por variável continua valendo.
Dá para ler o arquivo pela metade, sem carregar tudo na memória?
Sim, é o desenho do formato. O .jsw é organizado em blocos por coluna e lido por mmap sem cópia, e a leitura de um campo não exige decodificar o resto da linha. O README também descreve a leitura paralela por bloco.
A medição de 4,9 vezes menor vale para qualquer dado?
Não. O README declara a medição com 100 mil registros, contra o mesmo conjunto em JSONL lido pelo leitor de JSON do próprio projeto, e avisa que bibliotecas de JSON mais otimizadas diminuem a diferença ao gravar e ler tudo. A orientação do próprio projeto é medir com wjsw medir no dado de cada empresa.
Preciso parar de usar o PostgreSQL para usar o jsonW?
Não. O jsonW se apresenta como camada de arquivo e de leitura ao lado do banco. O wcon exporta do PostgreSQL para .jsw e grava de volta numa transação, com COPY binário, segundo o README.
Por que usar RAII no acesso ao arquivo e não só fechar no fim da função?
Porque o fim da função não é o único caminho de saída. Quando uma exceção sai do trecho, o fluxo no meio é abandonado, e o objeto de escopo é destruído mesmo assim, chamando o fechamento. A referência da linguagem confirma que os destruidores rodam na saída do escopo, na ordem inversa da declaração.
O jsonW faz parte dos sistemas da Wortic?
Sim. Segundo o README, o jsonW é mantido pela Wortic, que roda nele o índice dos seus agentes, os seus modelos de IA e a borda da sua infraestrutura. É a mesma equipe que entrega os sistemas de gestão com IA.
Fontes
- LavX News, 09/11/2026: Claude Code exposed thousands of credentials in public GitHub repositories
- LavX News, 07/11/2026: Claude Code's 'Don't Ask Again' Setting Exposes Secrets in Public GitHub Repositories
- cppreference, página do destruidor: destrutor (C++)
- README e AGENTS.md do jsonW: github.com/developer-wortic/jsonw
- SDK em C++17: sdk/cpp/jsonw.hpp
- Site do jsonW: jsonw.org
Perguntas frequentes
O que é RAII no C++ e por que usar no acesso a arquivo?
RAII amarra a liberação de um recurso ao tempo de vida de um objeto: o arquivo é aberto no construtor da classe e fechado no destrutor. Como o destruidor roda quando o objeto sai de escopo, inclusive quando uma exceção interrompe o trecho, o arquivo não fica aberto. É o que o SDK em C++17 do jsonW faz com jsonw::Leitor e jsonw::Escritor, e a documentação está no repositório developer-wortic/jsonw.
Como ler um arquivo .jsw em C++17?
Use jsonw::Leitor do cabeçalho sdk/cpp/jsonw.hpp. Basta abrir com o caminho do arquivo, consultar linhas() e ler cada linha com json(), que devolve o JSON da linha. O leitor fecha sozinho no fim do escopo, e o método conferir() valida a custódia do arquivo. O repositório developer-wortic/jsonw traz o exemplo completo.
O que acontece se o programa travar no meio da gravação de um .jsw?
Segundo o README do jsonW, o arquivo só anexa e cada bloco se sustenta com marcador, crc32c e hash. Uma gravação cortada perde apenas o último bloco, e o comando wjsw reparar refaz o fim. O fechar() do escritor também troca o arquivo de forma atômica, para que só apareça completo.
O SDK do jsonW em C++ precisa de dependências externas?
Não. O núcleo da biblioteca é C sem dependência, e o cabeçalho C++17 é um invólucro fino sobre a ABI C, conforme o README do projeto. Isso mantém a cadeia de build enxuta e evita runtime extra no servidor.
Quanto o jsonW economiza de disco e de velocidade?
O README declara duas medições com 100 mil registros, comparando com o mesmo conjunto em JSONL lido pelo próprio leitor de JSON do projeto: arquivo 4,9 vezes menor e leitura de um campo 3.281 vezes mais rápida. O projeto avisa que bibliotecas de JSON mais otimizadas reduzem a diferença e recomenda medir na própria máquina com wjsw medir.
Senha do banco pode ir na linha de comando ao exportar com o wcon?
Não. O README e o AGENTS.md do jsonW orientam manter a credencial em arquivo ou variável de ambiente: no PostgreSQL, a senha vem de PGPASSWORD ou de ~/.pgpass, e nos outros bancos o arquivo de credencial é indicado por variável. A lição vale para qualquer ferramenta, como mostra o caso de credenciais expostas em repositórios públicos relatado pela Apiiro.
Preciso trocar o PostgreSQL para usar o jsonW num sistema em C++?
Não. O jsonW funciona ao lado do banco: o wcon exporta do PostgreSQL para um arquivo .jsw e grava de volta numa transação, com o esquema tirado do tipo de cada coluna. O C++ passa a ler o .jsw pelo SDK, e a Wortic mantém o projeto em jsonw.org.
Como o jsonW evita que o preço vire texto e o CPF perca o zero?
O esquema usa tipos de negócio: dinheiro guarda o valor com a moeda ISO, decimal guarda valor exato sem passar por ponto flutuante e codigo guarda bytes exatos, então o zero à esquerda de um CNPJ permanece. A regra está no README e no AGENTS.md do jsonW, mantido pela Wortic.
Fontes
- LavX News, 09/11/2026: Claude Code exposed thousands of credentials in public GitHub repositories
- LavX News, 07/11/2026: Claude Code's 'Don't Ask Again' Setting Exposes Secrets in Public GitHub Repositories
- cppreference: destrutor (C++)
- README e AGENTS.md do jsonW
- SDK em C++17 (sdk/cpp/jsonw.hpp)
- Site do jsonW
Conheça: jsonW em C++17.
Quer isso funcionando na sua empresa?
Um consultor da Wortic olha o seu caso e mostra o caminho, sem compromisso.
Falar com um consultorEquipe editorial
Equipe editorial da Wortic especializada em automacao, IA, ERP, CRM e crescimento operacional.
- Automacao com IA
- Gestao empresarial
- CRM
- ERP
- Marketing digital


