es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo buscar el operador de división en mi código C utilizando expresiones regulares?

En un conjunto de código C, me gustaría encontrar todas las ocurrencias de divisiones (para revisar si están verificando la división por cero). Por lo tanto, estoy tratando de construir una expresión regular que pueda usar para grep para encontrar todos los <code>/</code>.

Construí algunos casos, lo que debería coincidir y lo que no, porque es por ejemplo una inclusión, un comentario, etc .:

Líneas que deberían coincidir:

int i = 5/0; //y un comentario en la línea
double d = 58 * 17 / 16 / (3 + 5)

Líneas que no deberían coincidir:

#include <include/pathes.h> (puede tener espacios en blanco delante)
bla //doble barra para comentarios
/* barra simple con * en comentarios de bloque */
// barras dentro de comentarios / deben ignorarse
// barras dentro de comentarios / deben ignorarse (con espacios en blanco delante)

Gracias a https://regex101.com/, intenté la siguiente expresión regular: <code>(?. Esto cubre al menos todas las coincidencias, pero coincide incorrectamente con las barras en las líneas de inclusión y también con las barras dentro de los comentarios.

¿Cómo puedo mejorar la expresión regular de manera que se ignoren las barras en las inclusiones y las barras en los comentarios? (Sé que también puede haber barras en comentarios de varias líneas, que no son tan fáciles de buscar, pero tengo que empezar en algún lugar).

¿Alguien tiene una mejor solución que grep para encontrar divisiones en el código fuente?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para mejorar el regex y ignorar las barras incluidas en los comentarios y las inclusiones, puedes modificar el regex para que solo coincida con las barras / que no estén precedidas por los caracteres #include, //, /* o */. Aquí tienes un regex modificado:

    (?<!(#include|\s*\/\/|\/\*|\*\/))\/(?![\/\*])
    

    Esto utiliza una búsqueda negativa hacia atrás para excluir los patrones que no queremos coincidir (#include, //, /*, */) y una búsqueda negativa hacia adelante para excluir las barras dentro de los comentarios.

    En cuanto a soluciones mejores que buscar / con grep, podrías considerar el uso de una herramienta de análisis estático de código que pueda detectar posibles errores de división por cero, como Coverity o SonarQube. Estas herramientas pueden analizar el código e identificar posibles problemas, incluyendo divisiones por cero.

Comments are closed.