Pular para conteúdo

Testes, Depuração e Ferramentas de Build

Uma toolchain C++ gerencia opções, dependências, linking, testes e plataformas. Torne requisitos específicos por alvo e reproduzíveis.

Alvo CMake

cmake_minimum_required(VERSION 3.25)
project(cpp_notes LANGUAGES CXX)

add_executable(cpp_notes main.cpp)
target_compile_features(cpp_notes PRIVATE cxx_std_20)

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
    target_compile_options(cpp_notes PRIVATE -Wall -Wextra -Wpedantic -Werror)
elseif(MSVC)
    target_compile_options(cpp_notes PRIVATE /W4 /WX)
endif()

Prefira propriedades de alvo a flags globais. CMakeLists.txt descreve o build, mas não garante diagnósticos ou opções idênticos entre compiladores.

Níveis de teste

  • unitários exercitam contrato pequeno;
  • propriedades geram entradas e verificam invariantes;
  • integração exercita limites reais, ABI e linking;
  • builds com sanitizers detectam classes de defeitos;
  • sistema executa o artefato completo.

Para ordenação, verifique ordem, permutação, vazio, singleton, duplicatas, extremos e oráculo. Consulte técnicas de teste.

Diagnósticos

Ative warnings fortes e entenda supressões. Compiladores encontram problemas distintos; usar mais de um amplia cobertura. Warnings não substituem correção ou testes.

Sanitizers

AddressSanitizer detecta muitos erros de memória; UndefinedBehaviorSanitizer, operações indefinidas selecionadas; ThreadSanitizer, muitas corridas. Têm overhead e cobertura incompleta.

c++ -std=c++20 -g -O1 -fsanitize=address,undefined example.cpp -o example
./example

Análise estática e formatação

Analisadores examinam caminhos sem executar. Formatters removem debate de estilo, não melhoram arquitetura. Revise correções geradas.

Depuração e profiling

Compile com símbolos e use debugger para fluxo/estado; profiler para desempenho. O código-fonte pode ocultar inlining, alocação, cache, contenção e syscalls. Siga o fluxo de investigação.

Integração contínua

Compile limpo, teste e execute sanitizers/análise quando prático. Registre versões e modo da linguagem. Não compare desempenho de builds debug e otimizados como equivalentes.