Resumo
Esta aula fecha a oitava unidade e, com ela, o curso. Reúne o que se alcançou nas três aulas da unidade; reconstrói a cadeia de conceitos que vai da interface de um módulo à depuração como método; separa o que disso vale em qualquer linguagem do que é próprio do C++; mostra a violação da regra de uma definição que ninguém diagnostica e reúne em uma lista todo o comportamento indefinido do curso, com o que detecta cada caso; repete na sua avaliação de saída as habilidades da avaliação de entrada; propõe seis desafios que combinam a unidade; e termina com o projeto final do curso, especificado com precisão, com a sua rubrica, em quatro etapas, cada uma com uma solução de referência verificada.
Objetivos de aprendizagem
- Organizar um programa em vários módulos com cabeçalhos, guardas e contratos, compilá-lo separadamente e diagnosticar as mensagens do ligador.
- Testar um módulo a partir da sua especificação, com um programa de testes automáticos executado sob os detectores, e verificar com asserções o que não pode ocorrer.
- Localizar um defeito com um método (reproduzir, reduzir, formular hipóteses, bissectar) e com o depurador, e documentar a investigação.
- Reconhecer o comportamento indefinido que o curso mostrou, com o que detecta cada caso, e a violação da regra de uma definição que ninguém diagnostica.
- Integrar todo o curso em um projeto: especificar, decompor, construir, testar, medir o custo e depurar um programa de gestão de dados tabulares.
O que a unidade alcançou
A unidade propôs-se ensinar a organizar, verificar e depurar programas que já não cabem em um arquivo nem na cabeça. O propósito cumpriu-se apoiando-se no que a introdução declarou como sabido: a declaração e a definição, a compilação e a ligação, o contrato, o invariante e a busca binária. O programa do catálogo de livros com que se abriu a unidade, que cabia em um arquivo, copiava parseInt mais uma vez e omitia em silêncio “Cien años de soledad” por escrever < onde a especificação dizia “ambos incluídos”, é reescrito na última seção desta aula como projeto final: quatro módulos com contratos, um programa principal que responde a comandos e um programa de testes com vinte e cinco casos. Dois desses casos, “entre, bordas” e “entre, um ano”, falham com a condição do programa original, e por isso o defeito não voltaria sem que ninguém o notasse.
Vários arquivos e bibliotecas próprias
A aula Vários arquivos e bibliotecas próprias dividiu um programa em um cabeçalho que declara, um arquivo de implementação que define e um main.cpp que usa. Apresentou as guardas de inclusão, que impedem a inclusão dupla dentro de uma unidade de tradução; a regra de uma definição, que explica “multiple definition” e “undefined reference” e dá a inline o seu sentido atual de permissão; a compilação separada com -c, que recompila só os objetos cujas fontes ou cabeçalhos mudaram; e uma biblioteca própria com funções de aulas anteriores.
Testar
A aula Testar ensinou a derivar os casos de uma especificação, por regiões, bordas e casos especiais, com o resultado esperado calculado por outro caminho; a escrever um programa de testes automáticos que informa só as falhas e termina com código de saída 0 ou 1; a usar assert para o que não pode ocorrer, sabendo que -DNDEBUG o apaga junto com a sua condição; a testar em tempo de compilação com static_assert e constexpr; e a executar os testes com os detectores (o de erros de memória, AddressSanitizer, e o de comportamento indefinido, UndefinedBehaviorSanitizer). Tudo repousa na advertência de Dijkstra: um teste mostra a presença de defeitos, nunca a sua ausência.
Depurar
A aula Depurar apresentou a depuração como método experimental: reproduzir a falha, formular hipóteses refutáveis, decidir entre elas com experimentos e bissectar o trecho suspeito. Desenvolveu o instrumento (-g sem otimização, a configuração do Visual Studio Code nos três sistemas, uma sessão real do GDB, os pontos de interrupção simples e condicionais, os passos e a pilha de chamadas) e as estratégias que valem mais que ele: reduzir o caso, buscar o último ponto correto com asserções e começar pelo primeiro quadro do próprio código no relatório do detector.
Carregando o conteúdo…