Validação de dados em C++: visão geral de ferramentas e abordagens
A validação de dados é uma etapa crítica no desenvolvimento de qualquer aplicação em C++. Dados de entrada incorretos podem levar a comportamento indefinido, vulnerabilidades (como buffer overflow) ou erros lógicos. Neste artigo, examinaremos as principais bibliotecas e métodos para verificação de dados disponíveis no ecossistema C++.
Por que a validação é necessária?
Os principais objetivos da validação:
- Segurança — prevenção de ataques (SQL injection, estouro de buffer).
- Integridade — garantia de que os dados correspondem ao formato esperado (números, datas, email).
- Estabilidade — evitar falhas devido a entrada incorreta.
1. Recursos padrão do C++ (validação manual)
Abordagem básica — verificação através de std::cin, std::string e std::regex. Adequado para cenários simples.
#include <iostream>#include <regex>#include <string>
bool validateEmail(const std::string& email) { const std::regex pattern( R"((\\w+)(\\.\\w+)*@(\\w+)(\\.\\w+)+)" ); return std::regex_match(email, pattern);}
int main() { std::string input; std::cout << "Digite o email: "; std::getline(std::cin, input); if (validateEmail(input)) { std::cout << "Email válido." << std::endl; } else { std::cout << "Email inválido." << std::endl; } return 0;}Desvantagens: o código se torna extenso com regras complexas, difícil de manter.
2. Boost.LexicalCast e Boost.Conversion
A biblioteca Boost oferece conversão segura de tipos. Por exemplo, boost::lexical_cast gera uma exceção quando a conversão é impossível.
#include <boost/lexical_cast.hpp>#include <iostream>
int main() { std::string str = "123abc"; try { int value = boost::lexical_cast<int>(str); std::cout << "Número: " << value << std::endl; } catch (const boost::bad_lexical_cast& e) { std::cerr << "Erro de validação: " << e.what() << std::endl; } return 0;}Isso é útil para verificar números, mas não cobre estruturas complexas.
3. nlohmann/json — validação de dados JSON
A biblioteca nlohmann/json (JSON for Modern C++) permite não apenas fazer parsing, mas também verificar a estrutura JSON usando esquemas (JSON Schema).
#include <nlohmann/json.hpp>#include <iostream>
using json = nlohmann::json;
int main() { std::string input = R"({"name": "Alice", "age": 25})"; json data = json::parse(input); // Verificação da presença de campos if (data.contains("name") && data["name"].is_string()) { std::cout << "Nome: " << data["name"] << std::endl; } else { std::cerr << "Campo name ausente ou não é string." << std::endl; } // Validação da idade (número inteiro, > 0) if (data.contains("age") && data["age"].is_number_integer()) { int age = data["age"]; if (age > 0 && age < 150) { std::cout << "Idade: " << age << std::endl; } else { std::cerr << "Idade fora do intervalo permitido." << std::endl; } } else { std::cerr << "Campo age ausente ou não é número inteiro." << std::endl; } return 0;}Para validação completa por esquema, pode-se usar nlohmann::json_schema (requer inclusão separada).