Detección automática del compilador de la adición de la misma instancia de objeto a un contenedor en un bucle

StackOverflow https://stackoverflow.com/questions/1465486

Pregunta

Este es un error tonto:

List<Foo> fooList = new List<Foo>();
Foo f = new Foo();
while (something.Read()) {
    f.Fill(something.GetRecord());
    fooList.Add(f);
}

Por supuesto, debería instanciar un nuevo foo dentro del bucle.

¿Puede un compilador detectar este tipo de error en el momento de la compilación?

A los ojos ingenuos parece que debería poder detectar este comportamiento (llenar una lista con instancias del mismo objeto en un bucle). Luego debe emitir una advertencia como "Estás llenando un contenedor con la misma instancia más de una vez".

Entonces, ¿qué tan ingenuo estoy siendo? ¿Sabes de un idioma donde existe algo como esto?

¿Fue útil?

Solución

Sí, esto es posible.

Sin embargo, no creo que una herramienta o compilador advierta sobre esto por sí mismos, por lo que tendrá que usar una herramienta que pueda extenderse con sus propios análisis. Para Java, FindBugs es una herramienta así. Para C, C ++, etc., GCC 4.5 permitirá complementos para que la gente escriba sus propias extensiones y sonido metálico De LLVM también está diseñado para esto. También hay Deshidra de Mozilla, nuevamente para C ++. Para los idiomas de la EM, está el Marco de Phoenix.

Entonces la pregunta es, ¿cómo se escribe este análisis? Eso es un poco más complicado y depende de la herramienta. Pero básicamente:

  • Puede detectar bucles con bastante facilidad (busque "componentes fuertemente conectados"),
  • El análisis de alias puede decirle si una variable o parámetro particular se refiere a un solo objeto, o a muchos objetos (busque "objetos abstractos", tal vez),
  • Puede encontrar el contenedor correcto utilizando el tipo estático de un objeto o variable.

Entonces podría detectar fácilmente una llamada a List<>.append(x) En un bucle, donde X puede referirse a un solo objeto.

Otros consejos

¿Qué pasa si desea llenar una lista <> con múltiples instancias de un objeto? ¿Necesitaría decorar su código con #pragma ¿Entonces el compilador te deja en paz?

¿Cómo declararía que una clase tiene este tipo de restricciones? List <> no es más que una clase C#, puede descompilar mscorlib.dll y ver su implementación completa. Entonces, para tener este tipo de conocimiento, tendría que estar codificado en alguna parte. Atributos? Eso sería increíblemente restringido. ¿Métodos especiales para validar su código? Agregaría sobrecarga a sus objetos.

Este tipo de cosas nunca (y quiero decir nunca) se usa por una razón: el número extremadamente pequeño de casos en los que ayudaría, en lugar de obstaculizar, no se acerca a superar el costo muy real que requeriría en ambos dificultades de implementación (de la de la implementación (de la Framework en sí mismo y de su código) y golpes de rendimiento (de objetos sobreblozados que deben moverse alrededor de la memoria a medida que el GC hace lo suyo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top