¿Cuál es la diferencia entre el análisis de código estático y la revisión de código?

9

Solo quería saber cuál es la diferencia entre el análisis de código estático y la revisión de código. ¿Cómo se hacen cada uno de estos dos? Más específicamente, ¿cuáles son las herramientas disponibles hoy para la revisión de código / análisis estático de PHP? También me gustaría saber sobre buenas herramientas para la revisión de código para cualquier idioma.

Thomas Owens
fuente
Una revisión de código es generalmente un proceso manual mediante el cual otro programador revisa su código. Es una forma de detectar pequeños errores o desviaciones de las convenciones de codificación, etc., y una buena manera de mejorar la calidad general del código. El análisis de código estático es algo para lo que puede usar una herramienta, aunque nunca lo he hecho yo mismo. Interesado para ver qué respuestas tienen otros
99
En dos palabras? "Un cerebro".
MSalters

Respuestas:

19

La revisión de código es algo que la gente hace, el análisis estático es algo que hacen las máquinas. Hay (a veces buenas) herramientas de análisis estático. La revisión del código es cuando un colega / mentor / profesor / amigo revisa su código y le da una crítica constructiva.

El análisis estático es, por otro lado, un proceso automatizado en el que una máquina, informada por lo que sabe sobre el lenguaje que está analizando (generalmente del sistema de tipos), analiza un programa e intenta identificar cosas que podrían ser incorrectas, estilo ineficiente, deficiente o de otro modo subóptimo.

Rafe Kettler
fuente
2
Siempre he tenido la impresión de que la revisión de código es una especie de análisis estático, ya que es una forma de medir el estado del software sin ejecutarlo.
Buhb
44
@Buhb: agrega de manera crucial el conocimiento del contexto. Un revisor de código debe entender si el código está haciendo lo que se espera que haga. Una herramienta estática (en el mejor de los casos, si el lenguaje lo permite a través de alguna decoración / afirmación / contrato) verificará que formalmente todo esté bien ... Así que podría decirlo de otra manera: el análisis estático es una especie de revisión de código, realizada algorítmicamente
Francesco
Solo para agregar, Lint (analista estático): ¡ Amigo que no es necesario! Colega (Revisor): ¡ También puedes hacerlo de esa manera!
Kushal
11

El análisis estático es el proceso de analizar un software sin ejecutarlo. Esto es muy bueno y recomendado, pero debes tener en cuenta que

  1. Las diferentes herramientas de análisis estático tienen una comprensión diferente del código que están estudiando, por lo tanto, pueden señalar (o no señalar) diferentes problemas. Una herramienta puede dar un informe limpio, y la otra puede quejarse de un millón de cosas.
  2. Una herramienta dinámica (por nombrar un ejemplo, piense en valgrind) puede encontrar muchos otros problemas, a costa de una carga grave sobre el consumo de recursos (tiempo, uso de memoria). Esto es así porque generalmente está ejecutando una versión instrumentada del software. Tenga en cuenta que, al estar instrumentado de alguna manera (reemplazar su malloc con un malloc de depuración), no es exactamente idéntico a su software (como puede ver en los tiempos de ejecución)

Ambos enfoques adolecen de la falta de contexto: no saben lo que se supone que debe lograr el sw.

La revisión del código la realiza otro codificador, que supuestamente lo sabe y puede verificar

  1. si el código es correcto
  2. si el software es semánticamente correcto

Es mucho más costoso y tiene un grado variable de repetibilidad, pero es de gran ayuda.

Como siempre, no hay una sola bala de plata que repare todos los errores y evite todos los problemas. Se recomienda aplicar: tanto como sea posible dado el lugar, el código, la hora, las tres formas de verificación (estática, dinámica, más ojos (y cerebros) que realmente miran el código).

PD: Debo señalar que, por lo general, es mucho mejor aplicar las herramientas desde cero. La conversión de un sistema heredado es una experiencia mucho menos placentera, debido a los falsos positivos. Si comienza desde cero y siempre apunta a mantener limpia la herramienta de análisis, probablemente evitará muchos problemas.

pps: en cuanto a herramientas, depende del idioma. En el mundo de C y C ++, puede comenzar mirando Visual Studio, que contiene una herramienta de análisis estático incorporada. Se puede encontrar una lista relativamente completa en Wikipedia.

ppps: el análisis estático es más adecuado para lenguajes estáticos, como C o C ++. Para Python puede ser realmente difícil decir si un nombre que se refiere a una lista en un punto se referirá a una lista para el resto del programa, debido a sus propiedades dinámicas. Esto no significa que no se pueda hacer nada, como muestra un esfuerzo JIT como PyPy .

Francesco
fuente
2

La revisión de código es cuando una autoridad superior o una autoridad dedicada verifica su código, su forma de codificación, los estándares seguidos en el código y específicamente el nivel lógico del código

En lo que respecta al análisis estático, es el análisis de software que se realiza sin ejecutar realmente programas creados a partir de ese software (el análisis realizado en la ejecución de programas se conoce como análisis dinámico)

La lista de herramientas según la tecnología se proporciona en el siguiente enlace

Lista de herramientas para el análisis estático

Por lo tanto, la revisión de código y el análisis estático son términos completamente diferentes.

OM la eternidad
fuente
77
La respuesta de OM es esencialmente correcta, excepto que objeto con 'Una persona mayor o una autoridad dedicada verifica su código ...'. Es cierto que algunas tiendas disfuncionales realizan revisiones de código de esta manera padre / hijo, muchas (y mejores) tiendas tienen un sistema de revisión de código entre pares que no se parece a un maestro que califica un problema de tarea. Donde trabajo es igual de común que un junior revise el trabajo de un senior. El objetivo es que un segundo par de ojos mire todo el código antes de que se registre.
Jim In Texas
2
@JimInTexas, lo mismo en nuestra tienda. Diría que el resultado más importante (a largo plazo) de las revisiones de código es difundir el conocimiento, unificar las prácticas y la visión arquitectónica / de diseño en todo el equipo. A este respecto, un junior que revisa el código de un senior es, en el peor de los casos, una excelente manera de aprender las mejores prácticas locales, pero ¿quién dice que un senior nunca comete errores y un junior nunca puede detectarlos?
Péter Török
1

La revisión del código es una evaluación más cualitativa, el análisis del código estático es una evaluación más cuantitativa.

Oye chico, este método se puede escribir mejor

vs, fe

Disminución del rendimiento. Es ineficiente identificar una cadena vacía utilizando la construcción 'wcslen (str)> 0'. Una forma más eficiente es verificar: str [0]! = '\ 0'.

Disminución del rendimiento. La expresión de strlen (MyStr.c_str ()) puede reescribirse como MyStr.length ()

Disminución del rendimiento. En caso de que 'Order' sea iterador, es más efectivo usar la forma de incremento de prefijo. Reemplace iterator ++ con ++ iterator.

Si bien los errores reales pueden (obviamente) existir y ser detectados por SCA

Formato incorrecto. Considere verificar el argumento N real de la función 'Foo'

La expresión estaba entre paréntesis dos veces: ((expresión)). Un par de paréntesis es innecesario o hay un error de imprenta

Una llamada de la función 'memset' conducirá al desbordamiento del búfer 'dest.lfFaceName'

Tejón perezoso
fuente
Lamento haberte insultado. En cuanto a lo que mi comentario (¿desaparecido?) Pretendía decir, ¿conoce alguna razón por la cual un ser humano no puede ofrecer los mismos comentarios que proporciona como ejemplos de resultados del análisis de código estático?
sq33G
@ sq33G: No. Cualquier persona con suministros de oficina (prácticamente una cantidad infinita de papel) puede simular una máquina Turing arbitraria. Sin embargo, es aburrido y requiere mucho tiempo. (Posiblemente no sea el indicado, pero diga comportamientos indefinidos en C).
Maciej Piechotka
Ah Entonces, la verdadera respuesta a la pregunta del OP es que las máquinas de Turing no son completas para humanos.
sq33G
0

El análisis estático es cuando se analiza un artefacto sin ser ejecutado. Aunque se puede aplicar a cualquier artefacto, a menudo se aplica al código fuente o al código objeto y se refiere al uso de herramientas específicas para analizar y obtener información sobre estos productos de trabajo. Estas herramientas producen informes que son interpretados por un ingeniero para determinar la calidad del sistema en construcción y como una guía para planificar el desarrollo y el mantenimiento. Wikipedia tiene una lista de herramientas para el análisis estático , organizadas por idioma y con una breve descripción de sus capacidades.

Las revisiones son una evaluación humana de algún producto de trabajo, que podría ser código. También se pueden realizar revisiones de diseños u otros documentos. La idea es que las personas familiarizadas con el producto de trabajo que no sea el desarrollador lo estén buscando para encontrar errores, que van desde problemas de seguridad hasta violaciones del estándar de codificación.

Técnicamente, una revisión de código puede considerarse una forma de análisis estático, ya que el código no se ejecuta realmente durante la revisión. Sin embargo, en terminología común, el "análisis estático" generalmente se refiere al análisis automático de los archivos fuente u objeto mientras que la "revisión" indica que los humanos son los que hacen el análisis.

Thomas Owens
fuente
-2

La revisión de código es una técnica útil para detectar problemas en el código fuente en una etapa muy temprana. Como parte de este ejercicio, se identificaron y rectificaron muchos problemas, como el rendimiento, la escalabilidad y los estándares de codificación. Esto mejorará la calidad del código.

El análisis estático se utiliza para analizar métricas de calidad de código como la complejidad ciclométrica, el índice de mantenibilidad, la profundidad de la herencia y los acoplamientos de clase. Varias herramientas disponibles en el mercado para analizar calidades de código. El desarrollador de C # usa Microsoft Visual Studio para generar informes métricos.

Balasubramanian.S
fuente
-3

El análisis de código estático se realiza mediante una herramienta automatizada, la revisión del código se realiza con personas antes de que se confirme el código.

Herramientas para la revisión de código:

1.más allá de comparar

2.la diferencia del software de control de versiones

Estas herramientas siempre se utilizan para generar la diferencia entre la versión anterior y la nueva versión.

upton
fuente
2
1) No tiene que ser antes de que se confirme el código: la revisión del código es realizada por personas y 2) Encuentro la descripción de las herramientas diff como herramientas de revisión del código "interesantes", sin duda son herramientas utilizadas para identificar el código para su revisión, pero si Me preguntaron sobre las herramientas de revisión de código que probablemente señalaría en aquellas que ayudan a administrar el proceso (he usado Kiln y Crucible, por ejemplo).
Murph