inputReader
en función de su nombre de clase. Si un usuario malintencionado es capaz de suministrar una implementación de inputReader
que ejecute comandos maliciosos, el código no puede diferenciar entre las versiones benignas y maliciosas del objeto.
if (inputReader.GetType().FullName == "CompanyX.Transaction.Monetary")
{
processTransaction(inputReader);
}
inputReader
en función de su nombre de clase. Si un usuario malintencionado es capaz de suministrar una implementación de inputReader
que ejecute comandos maliciosos, el código no puede diferenciar entre las versiones benignas y maliciosas del objeto.
if (inputReader.getClass().getName().equals("com.example.TrustedClass")) {
input = inputReader.getInput();
...
}
inputReader
en función de su nombre de clase. Si un usuario malintencionado es capaz de suministrar una implementación de inputReader
que ejecute comandos maliciosos, el código no puede diferenciar entre las versiones benignas y maliciosas del objeto.
if (inputReader::class.qualifiedName == "com.example.TrustedClass") {
input = inputReader.getInput()
...
}
finalize()
debería llamar a super.finalize()
.finalize()
llame a super.finalize()
[1].super.finalize()
.
protected void finalize() {
discardNative();
}
x = NULL
y x != NULL
siempre serán falsas.NULL
es indeterminado. No es igual a ningún valor, ni incluso a otro valor NULL
. Además, un valor null
nunca es igual a otro valor.Ejemplo 2: la siguiente instrucción siempre será falsa.
checkNull BOOLEAN := x = NULL;
checkNotNull BOOLEAN := x != NULL;
equals()
, no con ==
o !=
.==
o !=
para comparar la igualdad de dos cadenas; es decir, compara la igualdad de dos objetos, no de sus valores. Hay muchas probabilidades de que dos referencias nunca sean iguales.
if (args[0] == STRING_CONSTANT) {
logger.info("miracle");
}
==
y !=
solo se comportarán según lo previsto cuando se utilicen para comparar cadenas dentro de objetos iguales. La forma más común para que esto ocurra es que las cadenas sean internas. De este modo, las cadenas se añaden a un grupo de objetos que la clase String
mantiene. Una vez que la cadena se interna, todos los usos de dicha cadena emplearán el mismo objeto y los operadores de igualdad se comportarán según lo previsto. Todos los literales de cadena y las constantes con valor de cadena se internan automáticamente. Otras cadenas pueden internarse manualmente llamando String.intern()
, lo que devolverá una instancia canónica de la cadena actual, creando una si fuera necesario.pthread_mutex_unlock()
antes de que otro subproceso empiece a ejecutarse. Si el subproceso que señala no puede desbloquear la exclusión mutua, la llamada pthread_cond_wait()
del segundo subproceso no volverá y el subproceso no se ejecutará. pthread_cond_signal()
, pero no puede desbloquear la exclusión mutua en la que espera el otro subproceso.
...
pthread_mutex_lock(&count_mutex);
// Signal waiting thread
pthread_cond_signal(&count_threshold_cv);
...
getChunk == NULL
siempre será falso porque getChunk
es el nombre de una función definida en el programa.
if (getChunk == NULL)
return ERR;
char* getName() {
char name[STR_MAX];
fillInName(name);
return name;
}
class AccessLevel{
public static final int ROOT = 0;
//...
public static final int NONE = 9;
}
//...
class User {
private static int access;
public User(){
access = AccessLevel.ROOT;
}
public static int getAccessLevel(){
return access;
}
//...
}
class RegularUser extends User {
private static int access;
public RegularUser(){
access = AccessLevel.NONE;
}
public static int getAccessLevel(){
return access;
}
public static void escalatePrivilege(){
access = AccessLevel.ROOT;
}
//...
}
//...
class SecureArea {
//...
public static void doRestrictedOperation(User user){
if (user instanceof RegularUser){
if (user.getAccessLevel() == AccessLevel.ROOT){
System.out.println("doing a privileged operation");
}else{
throw new RuntimeException();
}
}
}
}
getAccessLevel()
en la instancia user
y no en las clases User
o RegularUser
, la condición siempre devolverá true
y se llevará a cabo la operación restringida aunque se utilice instanceof
para entrar en esta parte del bloque if/else
.
private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;
serialPersistentFields
correctamente, debe declararse como private
, static
y final
.serialPersistentFields
. Esta característica solo funcionará si serialPersistentFields
se declara como private
, static
y final
.serialPersistentFields
no se utilizará para definir campos Serializable
porque no es private
, static
y final
.
class List implements Serializable {
public ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("myField", List.class) };
...
}
Object.equals()
en una matriz en vez de java.util.Arrays.equals().
.Object.equals()
en una matriz es casi siempre un error, ya que comprobará la igualdad de las direcciones de las matrices, en vez de la igualdad de los elementos de las matrices, y debería reemplazarse por java.util.Arrays.equals()
. Object.equals()
.
...
int[] arr1 = new int[10];
int[] arr2 = new int[10];
...
if (arr1.equals(arr2)){
//treat arrays as if identical elements
}
...
pthread_cleanup_push()
para insertar la función routine
en las devoluciones y la pila de limpieza del subproceso de llamada. Como pthread_cleanup_push()
y su función asociada pthread_cleanup_pop()
se implementan como macros en las plataformas que no son IBM AIX, la estructura de datos creada por pthread_cleanup_push()
no será accesible para las subsiguientes llamadas a pthread_cleanup_pop()
. El código no se compilará o se comportará incorrectamente en tiempo de ejecución en todas las plataformas donde estas funciones se implementen como macros.
void helper() {
...
pthread_cleanup_push (routine, arg);
}
void clean_up()
{
char tmp[256];
...
free(tmp);
return;
}
System.Object.Equals()
:
public boolean Equals(string obj) {
...
}
System.Object.Equals()
utiliza un argumento de tipo object
, nunca se llama al método.Object.equals()
:
public boolean equals(Object obj1, Object obj2) {
...
}
Object.equals()
toma solo un argumento, el método en el Example 1
no se llama nunca.ISerializable
, pero que no declaran el atributo [Serializable]
no se serializarán.[Serializable]
. Si la clase se puede serializar mediante los métodos de serialización predeterminados definidos por .NET Framework, esto es necesario y suficiente para que el objeto se serialice correctamente. Si la clase requiere métodos de serialización personalizados, debe implementar también la interfaz ISerializable
. Sin embargo, la clase debe declarar aún el atributo [Serializable]
.CustomStorage
implementa la interfaz ISerializable
. Sin embargo, debido a que no puede declarar el atributo [Serializable]
, no se serializará.
public class CustomStorage: ISerializable {
...
}
getWriter()
después de haber llamado getOutputStream
o viceversa.HttpServletRequest
, redirigir una HttpServletResponse
o vaciar el flujo de salida del servlet provoca la confirmación del flujo asociado. Todo restablecimiento de búfer o confirmación de flujo, como los vaciados o los redireccionamientos adicionales, provocarán una IllegalStateException
s.ServletOutputStream
o PrintWriter
, pero no ambos. Llamar getWriter()
después de haber llamado getOutputStream()
, o viceversa, también provocará una IllegalStateException
.IllegalStateException
impide que el controlador de respuesta se ejecute hasta la finalización, entregando la respuesta de forma eficaz. Esto puede causar inestabilidad en el servidor, señal de que un servlet se ha implementado incorrectamente.Ejemplo 2: por otra parte, el código siguiente intenta escribir en el búfer de
public class RedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
OutputStream out = res.getOutputStream();
...
// flushes, and thereby commits, the output stream
out.flush();
out.close(); // redirecting the response causes an IllegalStateException
res.sendRedirect("http://www.acme.com");
}
}
PrintWriter
y vaciarlo después de que la solicitud se haya enviado.
public class FlushServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
// forwards the request, implicitly committing the stream
getServletConfig().getServletContext().getRequestDispatcher("/jsp/boom.jsp").forward(req, res);
...
// IllegalStateException; cannot redirect after forwarding
res.sendRedirect("http://www.acme.com/jsp/boomboom.jsp");
PrintWriter out = res.getWriter();
// writing to an already-committed stream will not cause an exception,
// but will not apply these changes to the final output, either
out.print("Writing here does nothing");
// IllegalStateException; cannot flush a response's buffer after forwarding the request
out.flush();
out.close();
}
}
Content-Length
está configurado como negativo.Content-Length
de una solicitud indica que el desarrollador está interesado en0
o unContent-Length
incorrecto.
URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection)url.openConnection();
huc.setRequestProperty("Content-Length", "-1000");
Content-Length
está configurado como negativo.Content-Length
de una solicitud indica que el desarrollador está interesado en0
o unContent-Length
como negativo:
xhr.setRequestHeader("Content-Length", "-1000");
java.io.Serializable
pueden ocasionar problemas y filtrar información de la clase externa.
...
class User implements Serializable {
private int accessLevel;
class Registrator implements Serializable {
...
}
}
Example 1
, cuando se serializa la clase interna Registrator
, también se serializa el campo accessLevel
de la clase externa User
.