Práctica de aplicación de modelos grandes en el campo de la detección de defectos de código.

Autor | Xiaoxin, Chelizi

Introducción 

El escaneo de código estático (SA) puede identificar rápidamente defectos de código, como acceso a puntero nulo, matriz fuera de límites, etc., lo que garantiza la calidad y mejora la eficiencia de la entrega con un mayor retorno de la inversión. La capacidad de escaneo actual se basa principalmente en la experiencia artificial para generar reglas, lo que tiene una capacidad de generalización débil y una iteración retrasada, lo que genera fugas. Este artículo propone resolver el problema de qué aprender para la máquina basándose en el gráfico de conocimiento del código y resolver el problema de cómo aprende la máquina basándose en el modelo de código grande, para que la computadora pueda entender el código como un humano. y descubrir automáticamente defectos en el código y dar consejos para lograr mejores resultados. Menor costo de mano de obra, mejor generalización de efectos y mayor recuperación de problemas.

El texto completo tiene 3519 palabras y el tiempo estimado de lectura es de 9 minutos.

01 Introducción básica a la detección de defectos de código

El escaneo de código estático (SA) significa que en ingeniería de software, después de que los programadores escriben el código fuente, analizan y verifican el programa sin ejecutar el programa de computadora. Al intervenir en SA durante la etapa de codificación antes de la prueba del código, los problemas del código se pueden descubrir y reparar con anticipación, lo que reduce efectivamente el tiempo de prueba y mejora la eficiencia de I + D. Cuanto más tarde se descubra un ERROR, mayor será el costo de repararlo.

imagen

La capacidad SA de MEG se estableció en 2018. Es compatible con C++, GO y otros lenguajes, y ha creado más de 100 reglas, que cubren la mayoría de los módulos de MEG, lo que garantiza la calidad en línea hasta cierto punto. La detección actual se basa principalmente en reglas generadas manualmente, lo que resulta en altos costos de escritura manual, capacidades de generalización débiles e iteraciones retrasadas, lo que lleva a la filtración de problemas. En el segundo trimestre de 2022, nuestro equipo intentará introducir modelos grandes: a través de modelos grandes en lenguaje de código, las máquinas pueden detectar defectos de forma autónoma, mejorar las capacidades de generalización y la eficiencia de iteración, y reducir el costo de escribir reglas manualmente. A continuación, les traeré presentaciones relevantes.

02 Principales problemas en la detección de defectos de código basado en reglas

A medida que aumentan las reglas de defectos y aumentan los idiomas y módulos cubiertos, hay dos puntos débiles pendientes que deben resolverse con urgencia:

1. Cada regla requiere mantenimiento manual basado en la experiencia y el análisis de fugas posterior, lo cual es costoso. Tomando el escenario del puntero nulo como ejemplo, el código de regla escrito manualmente tiene un total de 4439 líneas y se mantienen un total de 227 casos de regresión, pero hay todavía 3 en el segundo trimestre. Se filtró un error. ¿Cómo podemos introducir modelos grandes para reducir los costos de desarrollo y mejorar la calidad y la eficiencia?

2. La eficiencia es baja y las capacidades de escaneo son limitadas (como enlaces rotos, marcos no vacíos garantizados, escenas complejas estáticas difíciles de identificar, etc.) y la aceptación de riesgos es diferente. Algunos de los problemas de alto riesgo escaneados tienen baja disposición a reparar, lo que molesta a los usuarios... ¿Cómo podemos usar el modelo para aprender de los falsos positivos históricos, filtrarlos, reducir las interrupciones y mejorar la recuperación?

03 Solución

Para resolver los dos puntos débiles, se proponen las soluciones correspondientes.

3.1 Escaneo automático de defectos basado en modelos grandes

Cómo hacer que la computadora comprenda el código como un humano y automáticamente encuentre defectos en el código y dé indicaciones. Para permitir que las computadoras detecten defectos de forma independiente, es necesario resolver dos problemas técnicos centrales:

[Qué aprender] El contenido que se ingresa en la computadora puede hacer que la computadora aprenda más rápido y mejor; se basa principalmente en el gráfico de conocimiento del código para extraer fragmentos relacionados con las variables objetivo, lo que reduce el tamaño de muestra requerido para el aprendizaje automático y mejora la precisión. de aprendizaje.

[Cómo aprender] Según el contenido de entrada, ¿qué algoritmo se debe utilizar para permitir que la máquina lea múltiples lenguajes de programación como un humano y complete las tareas de detección? Se utiliza el método de aprendizaje profundo, que incluye principalmente entrenamiento previo. y puesta a punto. La tecnología de preentrenamiento permite a las computadoras aprender la semántica de código común en múltiples idiomas a partir de muestras masivas sin etiquetar. Este proyecto utiliza principalmente modelos grandes preentrenados de código abierto. La tecnología de ajuste ingresa muestras de detección de defectos en el modelo grande para obtener un modelo grande que se adapta a la escena, lo que permite a la máquina identificar defectos de forma independiente.

imagen

3.1.1 Fragmentos de extracción del gráfico de conocimiento del código

Para equilibrar el rendimiento y los recursos del modelo, diferentes modelos grandes permiten diferentes magnitudes de tokens de entrada. Por ejemplo, el modelo Bert limita 512 tokens. Por lo tanto, es necesario reducir la entrada. El gráfico de conocimiento del código es una red de conocimiento del código de caja blanca de software construida sobre la base de métodos de análisis de programas, después de un análisis léxico difuso o preciso, un análisis de sintaxis y un análisis semántico del código fuente empresarial, combinado con análisis de dependencia, minería de relaciones y otros medios. Graph proporciona una variedad de métodos de acceso a datos, lo que permite a los usuarios acceder a datos de código a bajo costo.

Con la ayuda de las capacidades del gráfico de conocimiento del código, se pueden formular diferentes capacidades de adquisición de código fuente contextual relacionadas con las variables de destino o los escenarios de destino de acuerdo con diferentes escenarios. Los pasos clave de la extracción incluyen:

  • Construya un gráfico de conocimiento del código analizado.

  • Detección e identificación de variables de destino: identifique la variable de destino en el código modificado como una variable a detectar

  • Análisis de dependencia de variables: análisis de variables dependientes relacionadas con variables objetivo según el flujo de control y el flujo de datos.

  • Extracción y poda de oraciones destacadas

imagen

Tomando como ejemplo la detección de riesgo de puntero nulo, finalmente obtenemos la siguiente información de división de código de muestra:

imagen

3.1.2 Utilice un algoritmo de aprendizaje de modelos grandes para la predicción de defectos

Hay dos ideas para detectar defectos en modelos grandes:

1. Uno es identificar si existen defectos y el tipo de defectos mediante el método discriminante;

2. Una es utilizar un método generativo para generar mensajes y dejar que el programa escanee automáticamente todos los defectos relacionados.

Este proyecto adopta principalmente el método discriminante y ha demostrado que este método tiene cierta viabilidad en la práctica. En el experimento de sincronización del método generativo, a continuación se presentan algunas prácticas de las dos ideas.

3.1.2.1 Método discriminante

A través de la idea de clasificación y en base al modelo, aprendemos las reglas de muestras históricas para predecir la categoría de nuevas muestras. Entre los muchos algoritmos de aprendizaje profundo, como TextCNN, LSTM, etc., ¿cuál debería utilizarse? A través de múltiples conjuntos de experimentos comparativos, finalmente seleccionamos el modelo grande de código BERT con el mejor efecto.

imagen

△Efecto de modelo

El uso de BERT para la detección de defectos consta de tres pasos: entrenamiento previo, ajuste e inferencia.

  • En la etapa previa a la capacitación, se utilizan modelos grandes en varios idiomas de código abierto para aprender mejor la semántica de múltiples lenguajes de programación.

  • En la etapa de ajuste fino, se ingresa al modelo con las porciones relacionadas con los puntos de uso variables extraídos a través del gráfico de conocimiento del código, así como las etiquetas de si hay defectos o tipos de defectos, y se genera un modelo ajustado para que que la máquina tiene la capacidad de realizar tareas de detección. Formato de entrada:

 {
 "slices": [{"line":"行代码内容", "loc": "行号"}],
 "mark": {"label":"样本标签", "module_name":"代码库名", "commit_id":"代码版本", "file_path":"文件名", "risk_happend_line":"发生异常的行"}
 }
  • En la etapa de inferencia, se analizan las porciones relevantes de las variables objetivo de los puntos de uso y se hacen predicciones ajustando el modelo para obtener si los puntos de uso son defectuosos y el tipo de defectos.

Una vez que el modelo se conecta, el estado de retroalimentación del usuario sobre los resultados incluye falsos positivos y aceptación, se recopilan muestras de retroalimentación real y se agrega entrenamiento automático del modelo ajustado, para lograr el propósito de iteración automática y aprendizaje rápido de nuevos conocimientos.

imagen

3.1.2.2 Método generativo

Los modelos generativos están floreciendo, incluidos los de código cerrado como chatgpt y Wen Xinyiyan, y los de código abierto como llama, bloom y starcode. Probamos principalmente Wen Xinyiyan, llama y Bloom, y exploramos el efecto de predicción del modelo en la detección de defectos de puntero nulo mediante indicaciones (algunos disparos, introducción de cadenas de pensamiento, especificación de reglas de guía abstractas) y ajustes finos. La medida general de f1 no es alta, el mejor florecimiento es del 61,69%, muy por detrás del 80% de la ruta Bert, y la estabilidad del modelo es pobre. Debido a que la ruta generativa tiene sus propias ventajas, como una gran cantidad de parámetros, aparición inteligente y una mayor capacidad de razonamiento, lo que permite que la cantidad de tokens de entrada siga aumentando, lo que puede reducir la dependencia de la limpieza de cortes y se puede combinar con la reparación. etc., predecimos que habrá defectos Los métodos generativos para escenarios de detección son una tendencia. A continuación, continuaremos optimizando, intentaremos constantemente indicaciones y ajustes, y estimularemos mejor el potencial del modelo a través de una guía más adecuada, mejorando así el efecto de los métodos generativos en escenarios de detección.

imagen

3.2 Utilice reglas + aprendizaje automático para filtrar falsos positivos

Los defectos identificados en los escenarios de detección de defectos son riesgos y existe un problema de aceptación. Cómo filtrar los problemas de bajo riesgo es un problema difícil. Al analizar los falsos positivos y las muestras reparadas, recopilamos características relacionadas con los falsos positivos, como el tipo de puntero, la tasa de falsos positivos del módulo, la tasa de falsos positivos del archivo y otras más de 10 características relacionadas con los falsos positivos, entrenamos un modelo de aprendizaje automático (regresión logística), y juzgue si se requiere filtrado.

El diagrama de arquitectura general del programa es el siguiente:

imagen

04 Implementación empresarial

Las capacidades de detección de defectos de código basadas en IA se pueden integrar en la plataforma de administración de código. Cada vez que se envía el código, se muestran posibles defectos del código, se bloquea la integración y se recopilan comentarios de los desarrolladores para facilitar la iteración del modelo.

05 Ganancias y perspectivas

5.1 Ingresos

A través de la teoría y la práctica, se ha demostrado que es factible dejar que la computadora aprenda el lenguaje de programación de forma independiente y complete la tarea de detección de defectos.

1. El método de este proyecto ha sido publicado en IEEE AITest Conference 2023:

《Aprovechamiento de modelos de aprendizaje profundo para la detección de riesgos de puntero nulo de funciones cruzadas》( https://ieeeaitest.com/accepted-papers/ )

2. Efecto de implementación real: el escenario de puntero nulo de C ++ de 2023Q2 cubrió más de 1100 módulos y se solucionaron 662 problemas. En comparación con la recuperación de escaneo de código estático normal, la recuperación representó el 26,9%, la recuperación incremental fue de 484 y el grado de superposición fue del 26,8%, lo que prueba preliminarmente que la capacidad de recuperación de IA abre la puerta a modelos grandes para la detección de defectos de código. También verifica que los modelos grandes tienen las ventajas de una recuperación ampliada y un bajo costo de las reglas tradicionales, y pueden formar un circuito autocerrado de marcado + entrenamiento + detección.

5.2 Perspectivas

Basado en los beneficios de 5.1, nos da la confianza para utilizar modelos grandes para la detección de defectos de código. Continuaremos fortaleciéndonos en los siguientes aspectos:

1. Expandir más lenguajes y escenarios, como escenarios de división por cero, bucle infinito y matriz fuera de límites, y realizar una capacitación rápida en Go, Java, etc. en varios idiomas, y publicarlo;

2. Con el surgimiento de los modelos generativos, se acumularán gradualmente datos efectivos sobre problemas y reparaciones, y se contribuirán con modelos grandes generales de Wenxin para el entrenamiento previo y el ajuste para explorar la aplicación de modelos generativos en el campo de la detección inteligente de defectos y reparar;

3. Al mismo tiempo, investigaremos tecnologías de corte más básicas y obtendremos un corte de código más rico y efectivo para mejorar la precisión de las llamadas.

--FIN--

Lectura recomendada

Admite la práctica de reconstrucción de código OC a través de scripts de Python (2): los elementos de datos proporcionan generación de código para las rutas de datos de acceso al módulo

Hable con InfoQ sobre el motor de búsqueda de alto rendimiento y código abierto de Baidu, Puck

Una breve discusión sobre la tecnología del escenario de la capa de presentación de búsqueda: la práctica de tanGo

Primera introducción a la búsqueda: la primera lección del gerente de productos de búsqueda de Baidu

Aplicación de tecnología inteligente de preguntas y respuestas en la búsqueda de Baidu

Alibaba Cloud sufrió un fallo grave y todos los productos se vieron afectados (restaurados). Tumblr enfrió el sistema operativo ruso Aurora OS 5.0. Se presentó la nueva interfaz de usuario Delphi 12 y C++ Builder 12, RAD Studio 12. Muchas empresas de Internet contratan urgentemente programadores de Hongmeng. Tiempo UNIX está a punto de entrar en la era de los 1.700 millones (ya entró). Meituan recluta tropas y planea desarrollar la aplicación del sistema Hongmeng. Amazon desarrolla un sistema operativo basado en Linux para deshacerse de la dependencia de Android de .NET 8 en Linux. El tamaño independiente es reducido en un 50%. Se lanza FFmpeg 6.1 "Heaviside"
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4939618/blog/10140696
Recomendado
Clasificación