Skip to main content

Atualmente o GitHub AE está em versão limitada.

Verificação de código do CodeQL para linguagens compiladas

Compreenda o método de compilação automática que a análise do CodeQL utiliza para compilar código em linguagens compiladas e saiba como você pode personalizar o comando de compilação, caso seja necessário.

Quem pode usar esse recurso

If you have write permissions to a repository, you can configure code scanning for that repository.

A Code scanning está disponível para os repositórios pertencentes à organização do GitHub AE. Esse é um recurso do GitHub Advanced Security (gratuito durante a versão beta). Para obter mais informações, confira "Sobre a Segurança Avançada do GitHub".

Sobre o Fluxo de trabalho de análise do CodeQL e as linguagens compiladas

O Code scanning trabalha executando consultas em um ou mais bancos de dados. Cada banco de dados contém uma representação de todo o código em uma linguagem única no seu repositório. Para as linguagens compiladas de C/C++, C#, e Java, o processo de preenchimento deste banco de dados envolve a construção do código e extração de dados.

O CodeQL analisa os arquivos de origem do C/C++, C#, e Java criados no repositório.

O Fluxo de trabalho de análise do CodeQL básico usa a ação autobuild para compilar seu código. Como alternativa, é possível desabilitar autobuild e especificar comandos de compilação explícitos para analisar apenas os arquivos criados por esses comandos personalizados.

Você configurou GitHub para executar code scanning para o seu repositório, adicionando um fluxo de trabalho de GitHub Actions ao repositório. Para a code scanning do CodeQL, você adiciona o Fluxo de trabalho de análise do CodeQL. Para obter mais informações, confira "Como definir a verificação de código".

Para obter informações sobre as linguagens, bibliotecas e estruturas compatíveis na versão mais recente do CodeQL, consulte "Linguagens e estruturas compatíveis" na documentação do CodeQL. Para obter mais informações sobre os requisitos do sistema para executar a última versão do CodeQL, consulte "Requisitos do sistema" na documentação do CodeQL.

Se o fluxo de trabalho usar uma matriz language, autobuild tentará criar cada uma das linguagens compiladas listadas na matriz. Sem uma matriz, autobuild tentará criar a linguagem compilada compatível que tem mais arquivos de origem no repositório. Com exceção de Go, a análise de outras linguagens compatíveis no repositório irá falhar, a menos que você forneça comandos de criação explícitos.

Sobre autobuild para o CodeQL

O CodeQL analisa os arquivos de origem do C/C++, C#, e Java criados no repositório.

O Fluxo de trabalho de análise do CodeQL básico usa a ação autobuild para compilar seu código. Como alternativa, é possível desabilitar autobuild e especificar comandos de compilação explícitos para analisar apenas os arquivos criados por esses comandos personalizados.

Observação: Você precisa instalar o software necessário nos executores auto-hospedados. Para saber mais sobre executores auto-hospedados, confira "Hospedar seus próprios executores".

autobuild para C/C++

Tipo de sistema compatívelNome do sistema
Sistema operacionalWindows, macOS e Linux
Sistema de criaçãoWindows: MSbuild e scripts de build
Linux e macOS: Autoconf, Make, CMake, qmake, Meson, Waf, SCons, Linux Kbuild e scripts de build

O comportamento da etapa autobuild varia de acordo com o sistema operacional em que a extração é executada. No Windows, a etapa autobuild tenta fazer a detecção automática de um método de build adequado para C/C++ usando a seguinte abordagem:

  1. Invocar MSBuild.exe no arquivo de solução (.sln) ou de projeto (.vcxproj) mais próximo da raiz. Se autobuild detectar vários arquivos de solução ou de projeto na mesma profundidade (mais curta) do diretório de nível superior, ele tentará compilar todos eles.
  2. Invocar um script parecido com um script de build: build.bat, build.cmd e build.exe (nessa ordem).

No Linux e no macOS, a etapa autobuild revisa os arquivos presentes no repositório para determinar o sistema de build usado:

  1. Procure um sistema de criação no diretório-raiz.
  2. Se nenhum for encontrado, procure um diretório único nos subdiretórios com um sistema de criação para C/C++.
  3. Execute um comando apropriado para configurar o sistema.

Para executores auto-hospedados, você provavelmente precisará instalar o compilador gcc, e projetos específicos também podem exigir acesso a clang ou mscv executáveis. Você também precisará instalar o sistema de compilação (por exemplo msbuild, make, cmake, bazel) e utilitários (como python, perl, lex e yacc) dos quais seus projetos dependem.

autobuild para C#

Tipo de sistema compatívelNome do sistema
Sistema operacionalWindows, macOS e Linux
Sistema de criação.NET, MSbuild e scripts de criação

O processo autobuild tenta fazer a detecção automática de um método de build adequado para C# usando a seguinte abordagem:

  1. Invocar dotnet build no arquivo de solução (.sln) ou de projeto (.csproj) mais próximo da raiz.
  2. Invocar MSbuild (Linux) ou MSBuild.exe (Windows) no arquivo de solução ou de projeto mais próximo da raiz. Se autobuild detectar vários arquivos de solução ou de projeto na mesma profundidade (mais curta) do diretório de nível superior, ele tentará compilar todos eles.
  3. Invocar um script parecido com um script de build: build e build.sh (nessa ordem, para o Linux) ou build.bat, build.cmd e build.exe (nessa ordem, para o Windows).

Para o desenvolvimento de aplicativos NET Core em executores auto-hospedados, o SDK .NET é necessário (para dotnet).

Para o desenvolvimento de aplicativos NET Framework, no Windows, você precisará das Ferramentas do Microsoft Build (para msbuild) e da CLI Nuget (para nuget). No Linux e macOS, você precisará do Mono Runtime (para executar mono, msbuild ou nuget).

autobuild para Java

Tipo de sistema compatívelNome do sistema
Sistema operacionalWindows, macOS e Linux (sem restrição)
Sistema de criaçãoGradle, Maven e Ant

O processo autobuild tenta determinar o sistema de build para bases de código Java aplicando esta estratégia:

  1. Procurar um arquivo de criação no diretório-raiz. Verifique o arquivos do Gradle, do Maven e, em seguida, do Ant.
  2. Execute o primeiro arquivo de criação encontrado. Se os arquivos do Gradle e do Maven estiverem presentes, será usado o arquivo do Gradle.
  3. Caso contrário, procure arquivos de criação nos subdiretórios diretos do diretório-raiz. Se apenas um subdiretório contiver arquivos de criação, execute o primeiro arquivo identificado nesse subdiretório (usando a mesma preferência de 1). Se mais de um subdiretório conter arquivos de criação, relate um erro.

Se você estiver usando executores auto-hospedados, a(s) versão(ões) necessária(s) do Java deverá(ão) estar presente(s):

  • Se o executor for usado para analisar repositórios que precisam de uma única versão do Java, a versão apropriada do JDK precisará ser instalada e precisará estar presente na variável PATH (para que java e javac possam ser encontrados).

  • Se o executor for usado para analisar repositórios que precisam de várias versões do Java, as versões apropriadas do JDK precisarão ser instaladas e poderão ser especificadas por meio do arquivo toolchains.xml. Este é um arquivo de configuração, normalmente usado pelo Apache Maven, que permite especificar o local e a versão das ferramentas, além de qualquer configuração adicional necessária para utilizá-las. Para obter mais informações, consulte "Guia para usar toolchains" na documentação do Apache Maven.

Os seguintes executáveis provavelmente serão necessários para uma variedade de projetos Java e devem estar presentes na variável PATH, mas não serão essenciais em todos os casos:

  • mvn (Apache Maven)
  • gradle (Gradle)
  • ant (Apache Ant)

Você também precisará instalar o sistema de compilação (por exemplo make, cmake, bazel) e utilitários (como python, perl, lex e yacc) dos quais seus projetos dependem.

Adicionar passos de criação a uma linguagem compilada

Se autobuild falhar ou você quiser analisar um conjunto de arquivos de origem diferentes daqueles criados pelo processo autobuild, remova a etapa autobuild do fluxo de trabalho e adicione manualmente as etapas de compilação. Para projetos C/C++, C#, Go, e Java, o CodeQL analisará qualquer código-fonte criado por suas etapas de compilação especificadas. Para obter informações sobre como editar o arquivo de fluxo de trabalho, confira "Como personalizar verificação de código".

Depois de remover a etapa autobuild, remova o comentário da etapa run e adicione comandos de build adequados ao seu repositório. A etapa run do fluxo de trabalho executa programas de linha de comando usando o shell do sistema operacional. Você pode modificar esses comandos e adicionar mais comandos para personalizar o processo de compilação.

- run: |
    make bootstrap
    make release

Para obter mais informações sobre a palavra-chave run, confira "Sintaxe de fluxo de trabalho para o GitHub Actions".

Se o repositório contiver várias linguagens compiladas, você poderá especificar comandos de compilação específicos da linguagem. Por exemplo, se o repositório contiver C/C++, C# e Java e autobuild compilar corretamente C/C++ e C#, mas não compila Java, você poderá usar a configuração a seguir no seu fluxo de trabalho, após a etapa init. Isso especifica as etapas de compilação para Java enquanto ainda usa autobuild para C/C++ e C#:

- if: matrix.language == 'cpp' || matrix.language == 'csharp'
  name: Autobuild
  uses: github/codeql-action/autobuild@v2

- if: matrix.language == 'java'
  name: Build Java
  run: |
    make bootstrap
    make release

Para obter mais informações sobre o if condicional, confira "Sintaxe de fluxo de trabalho para o GitHub Actions".

Para obter mais dicas e truques sobre por que autobuild não criar seu código, confira "O build automático falhou em uma linguagem compilada".

Se você adicionou etapas de criação manual para linguagens compiladas, mas o code scanning ainda não está funcionando no seu repositório, entre em contato com seu proprietário da empresa.