Engenheiros analisando código

O que é análise estática de código?

Análise estática de código: o que é

A análise estática de código (SCA) é um método de verificação do código-fonte em busca de bugs, vulnerabilidades de segurança e código abaixo do ideal, sem executar o programa. Ela usa ferramentas automatizadas para varrer o código e realizar análises avançadas em tempo real.

Também chamada de análise de código-fonte, a análise estática de código identifica erros de lógica e vazamentos de memória antes que as aplicações sejam executadas, o que reduz o tempo de depuração. Ela procura automaticamente erros de sintaxe e vulnerabilidades de segurança ocultas que um ser humano poderia deixar passar. Ela faz cumprir os padrões de programação, ajuda a garantir a conformidade regulatória em equipes grandes e, de modo geral, acelera o desenvolvimento como um todo.

Ao contrário da análise dinâmica de código, a análise estática de código acontece antes de o código ser executado. A análise dinâmica consiste em executar a aplicação e observar seu comportamento. Já a análise estática trata o código-fonte como um conjunto de dados estruturais, que ela varre para identificar problemas antes mesmo de a aplicação ser compilada, empacotada ou implementada. Essa abordagem modela o comportamento futuro do programa a partir de sua estrutura. As duas técnicas são importantes para uma prática abrangente de garantia de qualidade dentro de um framework de DevOps ou DevSecOps.

Como funciona a análise estática de código?

A análise estática de código envolve três etapas principais.

1. Análise sintática e geração da AST

O analisador lê o código-fonte e o decompõe em tokens. Esses tokens são passados a um parser, que os avalia segundo as regras gramaticais de uma linguagem de programação específica e os reorganiza em uma árvore sintática abstrata (AST) hierárquica. A AST mapeia a estrutura do software em um formato legível por máquina.

2. Análise de fluxo de controle e de fluxo de dados

O analisador constrói um grafo de fluxo de controle (CFG) para mapear os caminhos de execução, em combinação com a análise de fluxo de dados, que acompanha como as variáveis mudam de valor da inicialização até o uso.É nessa etapa que o analisador pode descobrir erros como o código morto (código que nunca chega a ser executado).

3. Aplicação de regras

Com base na AST e nos modelos de fluxo, a ferramenta confronta o código com diretrizes de programação e heurísticas. Elas vão de simples convenções de nomenclatura a verificações de segurança mais sofisticadas, como a análise de contaminação, que rastreia entradas de usuário contaminadas capazes de levar a injeções de SQL.

AI Academy

Torne-se um especialista em IA

Adquira conhecimento para priorizar os investimentos em IA que estimulam o crescimento dos negócios. Comece a usar hoje mesmo a nossa AI Academy sem custo e lidere o futuro da IA na sua organização.

A evolução da análise estática de código

Nos primórdios da computação, executar código era caro, e os desenvolvedores não podiam se dar ao luxo de desperdiçar capacidade de computação com depuração. A verificação dependia inteiramente da inteligência humana, com revisões de código lentas e manuais.

A criação do Lint por Stephen C. Johnson nos Bell Labs, em 1978, marca o início da moderna análise estática de código. O Lint foi desenvolvido para o sistema operacional Unix, com o objetivo de varrer o código-fonte e sinalizar construções suspeitas antes da compilação.

O Lint apontava com precisão o código problemático a ser removido sem alterar a lógica do programa, o que economizava valiosa capacidade de computação. Johnson batizou a ferramenta de Lint por causa dos fiapos (lint, em inglês) que ficam presos no filtro da secadora de roupas, porque ela retirava o código problemático indesejado (os fiapos) sem alterar a lógica (a estrutura da peça de roupa).

À medida que a internet cresceu ao longo dos anos 1990 e 2000, cresceu também a necessidade de mitigar as falhas de segurança. Surgiram novas ferramentas para atender a essa demanda, assim como formas de análise mais complexas, que compilavam o código em modelos matemáticos para acompanhar como as variáveis se movimentavam. Novos frameworks como o static application security testing (SAST) surgiram para conter essas ameaças, enquanto métodos como o dynamic application security testing (DAST) permitiram a avaliação em tempo de execução.

Embora matematicamente precisas, essas técnicas sofriam com altas taxas de falsos positivos, por causa de sua capacidade limitada de entender o contexto. A ascensão do aprendizado de máquina e dos grandes modelos de linguagem (LLMs) na década de 2020 deu início a uma nova era da análise de código, em que os modelos podiam ser treinados com bilhões de linhas de código. Esse treinamento lhes deu a capacidade de inferir a intenção do desenvolvedor e o contexto semântico.

Tradicionalmente, a análise estática de código era um processo de barreira executado antes do lançamento, mas hoje ela é feita ao longo de todo o ciclo de vida de desenvolvimento de software (SDLC). Essa filosofia de "shift left" consiste em deslocar o teste "para a esquerda", para mais perto da criação do código.

Hoje, ferramentas de análise de código como SonarQube, ESLint e GitHub Advanced Security são parte integrante do fluxo de trabalho do desenvolvedor. Elas são executadas dentro dos ambientes de desenvolvimento integrado (IDEs) e sinalizam erros em tempo real, à medida que o desenvolvedor digita. Essas ferramentas também funcionam como pontos de verificação automatizados dentro dos pipelines de integração contínua e implementação contínua, ou CI/CD.

Análise estática de código com IA

Os assistentes de programação modernos, impulsionadas por aprendizado de máquina, viabilizaram uma análise de código descentralizada, rápida e quase invisível, que permite aos desenvolvedores detectar erros cedo e melhorar a qualidade do código em tempo real. O IBM Bob, por exemplo, tem um fluxo de trabalho "Review" que roda em um painel separado, procura automaticamente code smells e sinaliza violações dos padrões de programação, que os usuários podem então descartar ou deixar que o Bob resolva automaticamente.

A análise também pode ser feita de forma proativa, com o uso estratégico de prompts. Por exemplo, em vez de pedir a um assistente de programação que "encontre bugs", o desenvolvedor pode pedir que ele revise repositórios com objetivos específicos em vista. Para uma revisão de arquitetura, basta pedir que ele analise a organização dos diretórios, os pontos de entrada, as relações entre componentes e o stack de tecnologia como um todo, tudo isso gerando documentação detalhada. Um prompt que analise o design do banco de dados pode identificar metas de modernização. Prompts especializados podem abranger o design do banco de dados, a análise de migração e uma revisão completa da dívida técnica, com recomendações sobre a forma mais estratégica de sanar os problemas.

Autor

Cole Stryker

Staff Editor, AI Models

IBM Think

Soluções relacionadas
IBM Bob

Acelere a entrega de software com o IBM® Bob, seu parceiro de IA para desenvolvimento seguro e consciente de intenção.

Explore o IBM Bob
Soluções de IA para desenvolvedores

Desenvolva, implemente e gerencie aplicações de IA mais rápido com ferramentas prontas para empresas.

Explore IA para desenvolvedores
Serviços de modernização de aplicações

Reimagine sistemas legados com modernização inteligente de IA.

Explore os serviços de modernização de aplicações
Dê o próximo passo

Utilize IA generativa e automação avançada para oferecer código pronto para empresas com maior velocidade e consistência. Os modelos do Bob aumentam os conjuntos de habilidades dos desenvolvedores, agilizando os fluxos de trabalho de modernização e simplificando tarefas complexas de desenvolvimento.

  1. Conheça o agente de programação de IA
  2. Explore soluções de IA para desenvolvedores