/sdl (Habilitar verificações de segurança adicionais)

Habilita as verificações recomendadas do SDL (Security Development Lifecycle). Essas verificações transformam os avisos relevantes à segurança em erros e definem recursos adicionais de geração de código seguro.

Sintaxe

/sdl[-]

Comentários

A /sdl habilita um superconjunto de verificações de segurança de linha de base fornecidas por /GS e substitui /GS-. Por padrão, /sdl permanece desativado. /sdl- desabilita as verificações de segurança adicionais.

Verificações de tempo de compilação

/sdl habilita esses avisos como erros:

Aviso habilitado pela opção /sdl Opção de linha de comando equivalente Descrição
C4146 /we4146 Um operador unário de subtração foi aplicado a um tipo sem sinal, gerando um resultado sem sinal.
C4308 /we4308 Uma constante integral negativa convertida em tipo sem sinal, gerando um resultado possivelmente sem sentido.
C4532 /we4532 O uso de palavras-chave continue, break ou goto em um bloco __finally/finally tem um comportamento indefinido durante o encerramento anormal.
C4533 /we4533 A inicialização de uma variável no código não será executada.
C4700 /we4700 Uso de uma variável local não inicializada.
C4703 /we4703 Uso de uma variável de ponteiro local possivelmente não inicializada.
C4789 /we4789 Saturação de buffer quando funções específicas do CRT (runtime do C) são usadas.
C4995 /we4995 Uso de uma função marcada com pragma deprecated.
C4996 /we4996 Uso de uma função marcada como deprecated.

verificações de runtime

Quando /sdl está habilitado, o compilador gera o código que faz essas verificações em tempo de execução:

  • Habilita o modo estrito de detecção de saturação de buffer em tempo de execução do /GS, equivalente à compilação com #pragma strict_gs_check(push, on).

  • Faz a limpeza de ponteiro limitada. Em expressões que não envolvem desreferências e em tipos que não têm nenhum destruidor definido pelo usuário, as referências de ponteiro são definidas como um endereço não válido após uma chamada para delete. Essa limpeza ajuda a evitar a reutilização de referências de ponteiro obsoletas.

  • Inicializa ponteiros de membro de classe. Inicializa automaticamente os membros da classe do tipo de ponteiro como nullptr na instanciação do objeto (antes da execução do construtor). Isso ajuda a impedir o uso de ponteiros não inicializados que o construtor não inicializa explicitamente. A inicialização do ponteiro do membro gerado pelo compilador é chamada desde que:

    • O objeto não é alocado usando um operator new personalizado (definido pelo usuário)

    • O objeto não é alocado como parte de uma matriz (por exemplo new A[x])

    • A classe não é gerenciada nem importada

    • A classe tem um construtor padrão definido pelo usuário.

    Para ser inicializado pela função de inicialização de classe gerada pelo compilador, um membro deve ser um ponteiro e não uma propriedade ou uma constante.

Para mais informações, confira Avisos, /sdl e melhoria da detecção de variáveis não inicializadas.

Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.

  2. Selecione a página de propriedades Propriedades da Configuração>C/C++>Geral.

  3. Defina a propriedade Verificações do SDL usando o controle suspenso da propriedade. Escolha OK ou Aplicar para salvar as alterações.

Confira também

Opções do compilador MSVC
Sintaxe da linha de comando do compilador MSVC