Un API es un contrato entre un autor de llamada y un receptor de llamada. Las formas de abuso de API más comunes los produce el autor de llamada cuando no consigue atender su fin de este contrato. Por ejemplo, si un programa no consigue llamar chdir() después de llamar chroot(), se viola el contrato que especifica cómo cambiar el directorio de origen activo de una forma segura. Otro buen ejemplo de un abuso de manual es esperar que el receptor devuelva una información de DNS de confianza al autor de llamada. En este caso, el autor de llamada abusa el API del receptor haciendo determinadas suposiciones sobre su comportamiento (que el valor de retorno se puede usar con fines de autenticación). También se puede violar el contrato entre el autor de llamada y el receptor desde el otro lado. Por ejemplo, si un codificador envía SecureRandom y devuelve un valor no aleatorio, se viola el contrato.
Equals()
se llama en un objeto que no implementa Equals()
.Equals()
en una clase (o una superclase/interfaz) que no implemente explícitamente Equals()
resulta en una llamada al método Equals()
heredado de System.Object
. En lugar de comparar campos de miembros de objetos u otras propiedades, Object.Equals()
compara dos instancias de objetos para ver si son las mismas. Aunque estos son usos legítimos de Object.Equals()
, a menudo es indicativo de que el código contiene errores.
public class AccountGroup
{
private int gid;
public int Gid
{
get { return gid; }
set { gid = value; }
}
}
...
public class CompareGroup
{
public bool compareGroups(AccountGroup group1, AccountGroup group2)
{
return group1.Equals(group2); //Equals() is not implemented in AccountGroup
}
}
equals()
se llama en un objeto que no implementa equals()
.equals()
en una clase (o una superclase/interfaz) que no implemente explícitamente equals()
resulta en una llamada al método equals()
heredado de java.lang.Object
. En lugar de comparar campos de miembros de objetos u otras propiedades, Object.equals()
compara dos instancias de objetos para ver si son las mismas. Aunque estos son usos legítimos de Object.equals()
, a menudo es indicativo de que el código contiene errores.
public class AccountGroup
{
private int gid;
public int getGid()
{
return gid;
}
public void setGid(int newGid)
{
gid = newGid;
}
}
...
public class CompareGroup
{
public boolean compareGroups(AccountGroup group1, AccountGroup group2)
{
return group1.equals(group2); //equals() is not implemented in AccountGroup
}
}
finalize()
debería llamar a super.finalize()
.finalize()
llame a super.finalize()
[1].super.finalize()
.
protected void finalize() {
discardNative();
}
private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;
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");
ToString()
se llama en una matriz.ToString()
en una matriz indica que un desarrollador está interesado en devolver el contenido de la matriz como cadena. Sin embargo, una llamada directa ToString()
en una matriz devolverá un valor de cadena que contiene el tipo de la matriz.System.String[]
.
String[] stringArray = { "element 1", "element 2", "element 3", "element 4" };
System.Diagnostics.Debug.WriteLine(stringArray.ToString());
toString()
se llama en una matriz.toString()
en una matriz indica que un desarrollador está interesado en devolver el contenido de la matriz como cadena. Sin embargo, una llamada directa para toString()
en una matriz devolverá un valor de cadena que contiene el tipo de matriz y el código hash en memoria.[Ljava.lang.String;@1232121
.
String[] strList = new String[5];
...
System.out.println(strList);