# Análisis de código de CodeQL para lenguajes compilados

Comprenda cómo CodeQL analiza los lenguajes compilados, las opciones de compilación disponibles y aprenda a personalizar el proceso de generación de bases de datos si es necesario.

## Comparación de modos de compilación

<div class="ghd-tool rowheaders">

| Característica del modo de compilación                                        | Ninguno                      | Autocompilación               | Manual                    |
| ----------------------------------------------------------------------------- | ---------------------------- | ----------------------------- | ------------------------- |
| Se usa de forma predeterminada y para la habilitación a nivel de organización | Sí (C/C++, C#, Java y Rust)  | Sí, donde `none` no se admite | No                        |
| El análisis se realiza correctamente sin la configuración del usuario         | Sí                           | Variable                      | No                        |
| Integridad del análisis                                                       | Código generado no analizado | Variable                      | Controlado por el usuario |
| Precisión del análisis                                                        | Bueno                        | Bueno                         | Óptima                    |

</div>

## Elegir un modo de compilación

Cuando se configura code scanning por primera vez o en varios repositorios, es mejor usar la configuración predeterminada. La configuración predeterminada usa el método más sencillo disponible para generar una CodeQL base de datos y analizar el código, de modo que pueda empezar a corregir las alertas lo antes posible. Una vez que haya resuelto las alertas iniciales, puede cambiar a la configuración avanzada con un proceso de compilación manual para repositorios de alto riesgo.

Para obtener información sobre el comportamiento específico `autobuild` del lenguaje, los requisitos del ejecutor y los detalles del modo de compilación para los lenguajes compilados, consulte [Opciones y pasos de compilación de CodeQL para lenguajes compilados](/es/code-security/reference/code-scanning/codeql/codeql-build-options-and-steps-for-compiled-languages).

## Uso de varios modos de compilación en un repositorio de varios lenguajes

En el caso de los repositorios con varios lenguajes compilados, puede usar diferentes modos de compilación para distintos lenguajes. Por ejemplo, si el repositorio contiene C/C++, C# y Java, es posible que desee proporcionar pasos de compilación manuales para un lenguaje (aquí C/C++). Este flujo de trabajo especifica un modo de compilación diferente para cada lenguaje.

```yaml
strategy:
  matrix:
    include:
      # Analyzes C and C++ code using the commands in `Build C and C++ code`
      - language: c-cpp
        build-mode: manual
      # Analyzes C# code by automatically detecting a build
      - language: csharp
        build-mode: autobuild
      # Analyzes Java code directly from the codebase without a build
      - language: java-kotlin
        build-mode: none # analyzes Java only
steps:
- name: Checkout repository
  uses: actions/checkout@v5

# Initializes CodeQL tools and creates a codebase for analysis.
- name: Initialize CodeQL
  uses: github/codeql-action/init@v4
  with:
    languages: ${{ matrix.language }}
- if: ${{ matrix.build-mode == 'manual' }}
  name: Build C and C++ code
  run: |
    echo 'If you are using a "manual" build mode for one or more of the' \
      'languages you are analyzing, replace this with the commands to build' \
      'your code, for example:'
    echo ' make bootstrap'
    echo ' make release'
    exit 1
```

Para obtener información sobre los lenguajes, bibliotecas y marcos que se admiten en la versión más reciente de CodeQL, vea [Lenguajes y marcos admitidos](https://codeql.github.com/docs/codeql-overview/supported-languages-and-frameworks) en la CodeQL documentación. Para obtener información sobre los requisitos del sistema para ejecutar la versión más reciente de CodeQL, consulte [Requisitos del sistema](https://codeql.github.com/docs/codeql-overview/system-requirements/#additional-software-requirements) en la CodeQL documentación.

## Habilitar el almacenamiento en caché de dependencias para CodeQL

En el caso de los flujos de trabajo de configuración predeterminados, el almacenamiento en caché de dependencias solo está habilitado para GitHublos ejecutores hospedados en repositorios públicos y privados.

En el caso de los flujos de trabajo de configuración avanzada, el almacenamiento en caché de dependencias está deshabilitado de forma predeterminada. Para habilitar el almacenamiento en caché de dependencias para CodeQL, use el ajuste `dependency-caching` para la acción CodeQL en su flujo de trabajo avanzado de configuración. Esta configuración acepta los siguientes valores:

* `false`
  /
  `none`
  /
  `off`: el almacenamiento en caché de dependencias está deshabilitado (valor predeterminado).
* `restore`: solo se restauran las cachés existentes, no se almacenan nuevas cachés.
* `store`: solo se almacenan las cachés nuevas, no se almacenan las existentes.
* `true`
  /
  `full`
  /
  `on`: se restauran las cachés existentes y se almacenan las cachés nuevas.

Por ejemplo, la siguiente configuración habilitaría el almacenamiento en caché de dependencias para la CodeQL acción:

```yaml
    # Initializes CodeQL with dependency caching enabled
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v4
      with:
        languages: java
        dependency-caching: true
```

## Uso del `none` modo de compilación para CodeQL

Para C/C++, C#, Java y Rust, CodeQL crea una base de datos sin necesidad de una compilación cuando se habilita la configuración predeterminada para code scanning a menos que el repositorio también incluya código de Kotlin. Si un repositorio contiene código de Kotlin además de Java código, la configuración predeterminada se habilita con el proceso de creación automática porque el análisis de Kotlin requiere una compilación.

La creación de una CodeQL base de datos sin una compilación puede producir resultados menos precisos que usar `autobuild` o pasos de compilación manuales si:

* Los scripts de compilación no se pueden consultar para obtener información de dependencia y las estimaciones de dependencia son inexactas.
* Normalmente, el repositorio genera código durante el proceso de compilación.

Para usar `autobuild` o pasos de compilación manual, puedes usar la configuración avanzada.

> \[!NOTE] Para el análisis de Java, si `build-mode` está establecido en `none` y el código de Kotlin se encuentra en el repositorio, no se analizará el código de Kotlin y se generará una advertencia. Consulte [Opciones y pasos de compilación de CodeQL para lenguajes compilados](/es/code-security/reference/code-scanning/codeql/codeql-build-options-and-steps-for-compiled-languages#building-java-and-kotlin).

## Uso `autobuild` para CodeQL

La CodeQL acción usa `autobuild` para analizar los lenguajes compilados en los casos siguientes.

* La configuración predeterminada está habilitada y el lenguaje no admite la compilación `none` (compatible con C/C++, C#, Java y Rust).
* La configuración avanzada está habilitada y el flujo de trabajo especifica `build-mode: autobuild`.
* La configuración avanzada está habilitada y el flujo de trabajo tiene un paso de Autobuild para el lenguaje mediante la acción `autobuild` (`github/codeql-action/autobuild@v4`).

### Use la opción `build-mode`.

```yaml
# Initializes the CodeQL tools for scanning.
name: Analyze
strategy:
  matrix:
    include:
      # Analyze C and C++ code
      - language: c-cpp
        build-mode: autobuild
      # Analyze Go code
      - language: go
        build-mode: autobuild

steps:
  - uses: github/codeql-action/init@v4
    with:
      languages: ${{ matrix.language }}
      build-mode: ${{ matrix.build-mode }}
```

### Uso del paso Autobuild

```yaml
    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v4
      with:
        languages: ${{ matrix.language }}

    - name: Autobuild
      uses: github/codeql-action/autobuild@v4
```

## Especificar manualmente los pasos de compilación

Solo puede especificar los pasos de compilación manuales si ha habilitado la configuración avanzada, consulte [Establecimiento de la configuración avanzada para el examen del código](/es/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/configuring-advanced-setup-for-code-scanning#configuring-advanced-setup-for-a-repository).

Si se produce un error en `autobuild`, o si quieres analizar otro conjunto de archivos de origen de los compilados por el proceso `autobuild`, tendrás que hacer lo siguiente:

* Si el flujo de trabajo especifica un modo de compilación para el lenguaje, cambie el modo de compilación a `manual`.
* Si el flujo de trabajo contiene un paso `autobuild`, elimine o convierta en comentario el paso `autobuild` en el flujo de trabajo.

Después, quita la marca de comentario del paso `run` y especifica manualmente el proceso de compilación que se va a usar. Para C/C++, C#, Go, Java, Kotlin y Swift, CodeQL analizará cualquier código fuente generado por los pasos de compilación que hayas especificado.

Actualiza el flujo de trabajo para definir `build-mode` como `manual`.

```yaml
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v4
  with:
    languages: ${{ matrix.language }}
    build-mode: manual
- uses: github/codeql-action/analyze@v4
  with:
    category: "/language:${{ matrix.language }}"
```

Como alternativa, actualice el flujo de trabajo para convertir en comentario el paso "Autobuild".

```yaml
    # Autobuild attempts to build any compiled languages.
    # - name: Autobuild
    #  uses: github/codeql-action/autobuild@v4
```

### Adición de comandos de compilación

Cuando la compilación manual está habilitada, quite la marca de comentario del paso `run` en el flujo de trabajo y agregue comandos de compilación adecuados para el repositorio. El paso `run` ejecuta herramientas de línea de comandos mediante el shell del sistema operativo. Puede modificar estos comandos y agregar más comandos para personalizar el proceso de compilación.

```yaml
- run: |
    make bootstrap
    make release
```

Para obtener más información sobre la palabra clave `run`, consulta [Sintaxis del flujo de trabajo para GitHub Actions](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun).

<!-- For "no-build" this is covered earlier in the article under "About CodeQL build modes". -->

Si ha agregado pasos de compilación manuales para lenguajes compilados y code scanning sigue sin funcionar en el repositorio, póngase en contacto con con nosotros a través del [Soporte técnico de GitHub](https://support.github.com).