Reino: Code Quality

Una mala calidad del código lleva a un comportamiento no predecible. Desde la perspectiva de un usuario, muchas veces también supone una usabilidad limitada. Pero para un atacante es una oportunidad para atacar al sistema de formas insospechadas.

Code Correctness: Non-Synchronized Method Overrides Synchronized Method

Abstract
Los métodos sincronizados no deben reemplazarse con métodos no sincronizados.
Explanation
Una clase principal declara el método synchronized, garantizando un comportamiento correcto cuando varios subprocesos acceden a la misma instancia. Todos los métodos de reemplazo también deben ser declarados como synchronized porque, de no ser así, podría producirse un comportamiento inesperado.

Ejemplo 1: en el código siguiente, la clase Foo reemplaza a la clase Bar, pero no declara el método synchronizedMethod para que sea synchronized:


public class Bar {
public synchronized void synchronizedMethod() {
for (int i=0; i<10; i++) System.out.print(i);
System.out.println();
}
}

public class Foo extends Bar {
public void synchronizedMethod() {
for (int i=0; i<10; i++) System.out.print(i);
System.out.println();
}
}


En este caso, se podría convertir una instancia de Foo en el tipo Bar. Si se da la misma instancia a dos subprocesos distintos y synchronizedMethod se ejecuta repetidamente, el comportamiento se impredecible.
References
[1] Sun Microsystems, Inc. Bug ID: 4294756 Javac should warn if synchronized method is overridden with a non synchronized
[2] TSM00-J. Do not override thread-safe methods with methods that are not thread-safe CERT
[3] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1
[4] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 2
[5] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[6] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
desc.structural.java.code_correctness_non_synchronized_method_overrides