inputReader
é confiável com base em seu nome de classe. Se um invasor puder fornecer uma implementação de inputReader
que executa comandos mal-intencionados, esse código não poderá diferenciar as versões bem-intencionadas das mal-intencionadas do objeto.
if (inputReader.GetType().FullName == "CompanyX.Transaction.Monetary")
{
processTransaction(inputReader);
}
inputReader
é confiável com base em seu nome de classe. Se um invasor puder fornecer uma implementação de inputReader
que executa comandos mal-intencionados, esse código não poderá diferenciar as versões bem-intencionadas das mal-intencionadas do objeto.
if (inputReader.getClass().getName().equals("com.example.TrustedClass")) {
input = inputReader.getInput();
...
}
inputReader
é confiável com base em seu nome de classe. Se um invasor puder fornecer uma implementação de inputReader
que executa comandos mal-intencionados, esse código não poderá diferenciar as versões bem-intencionadas das mal-intencionadas do objeto.
if (inputReader::class.qualifiedName == "com.example.TrustedClass") {
input = inputReader.getInput()
...
}
finalize()
deve chamar super.finalize()
.finalize()
chamar super.finalize()
[1].super.finalize()
.
protected void finalize() {
discardNative();
}
x = NULL
e x != NULL
serão sempre false.NULL
é indeterminado. Não será equivalente a nada, nem mesmo a um outro valor NULL
. Além disso, um valor null
nunca é equivalente a outro valor.Exemplo 2: Esta instrução será sempre false.
checkNull BOOLEAN := x = NULL;
checkNotNull BOOLEAN := x != NULL;
equals()
, e não com ==
ou !=
.==
ou !=
para comparar a igualdade de duas strings, o que compara a igualdade de dois objetos, e não seus valores. São boas as chances de que as duas referências nunca serão iguais.
if (args[0] == STRING_CONSTANT) {
logger.info("miracle");
}
==
e !=
apenas se comportarão conforme esperado quando forem usados para comparar strings contidas em objetos que são iguais. A maneira mais comum de isso acontecer é internalizando as strings, processo pelo qual elas são adicionadas a um pool de objetos mantidos pela classe String
. Após a internalização de uma string, todas as suas aplicações usarão o mesmo objeto, e os operadores de igualdade terão o comportamento esperado. Todos os literais de string e constantes com valores de string são internalizados automaticamente. Outras strings podem ser internalizadas manualmente chamando String.intern()
, o que retornará uma instância canônica da string atual, criando uma se necessário.pthread_mutex_unlock()
antes que a execução de outro thread possa começar. Se o thread de sinalização não conseguir desbloquear o mutex, a chamada pthread_cond_wait()
no segundo thread não será retornada, e o thread não será executado.pthread_cond_signal()
, mas não consegue desbloquear esse mutex no qual o outro thread está aguardando.
...
pthread_mutex_lock(&count_mutex);
// Signal waiting thread
pthread_cond_signal(&count_threshold_cv);
...
getChunk == NULL
sempre será "false", pois getChunk
é o nome de uma função definida no 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()
em relação à instância user
, e não contra as classes User
ou RegularUser
, isso significa que essa condição sempre retornará true
e a operação restrita será realizada mesmo que instanceof
tenha sido usado para entrar nessa parte do bloco 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
corretamente, ele deve ser declarado como private
, static
e final
.serialPersistentFields
. Esse recurso somente funcionará se serialPersistentFields
for declarado como private
, static
e final
.serialPersistentFields
não será usada para definir campos Serializable
porque não é private
, static
e final
.
class List implements Serializable {
public ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("myField", List.class) };
...
}
Object.equals()
em um array no lugar de java.util.Arrays.equals().
Object.equals()
contra um array é um erro na maioria dos casos, pois isso verificará a igualdade dos endereços dos arrays, em vez da igualdade dos elementos dos arrays, e, em geral, deve ser substituído 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()
a fim de enviar a função routine
para a pilha de limpeza do thread de chamada e, em seguida, é retornado. Como pthread_cleanup_push()
e sua função parceira pthread_cleanup_pop()
são implementadas como macros em plataformas diferentes do IBM AIX, a estrutura de dados criada por pthread_cleanup_push()
não será acessível a chamadas subsequentes para pthread_cleanup_pop()
. O código não conseguirá compilar ou apresentará um comportamento incorreto em tempo de execução em todas as plataformas nas quais essas funções são implementadas 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()
usa um argumento do tipo object
, o método nunca é chamado.Object.equals()
:
public boolean equals(Object obj1, Object obj2) {
...
}
Object.equals()
usa apenas um argumento, o método no Example 1
nunca é chamado.ISerializable
, mas não declararem o atributo [Serializable]
, não serão serializadas.[Serializable]
. Se a classe puder ser serializada usando os métodos de serialização padrão definidos pelo .NET Framework, será necessário e suficiente que o objeto seja serializado corretamente. Se a classe exigir métodos de serialização personalizados, ela também deverá implementar a interface ISerializable
. No entanto, a classe ainda deve declarar o atributo [Serializable]
.CustomStorage
implementa a interface ISerializable
. No entanto, por não declarar o atributo [Serializable]
, ela não será serializada.
public class CustomStorage: ISerializable {
...
}
getWriter()
depois de chamar getOutputStream
, ou vice-versa.HttpServletRequest
, redirecionar uma HttpServletResponse
ou descarregar o fluxo de saída do servlet faz com que o fluxo associado seja confirmado. Quaisquer redefinições de buffer ou confirmações de fluxo subsequentes, como descarregamentos ou redirecionamentos adicionais, resultarão em IllegalStateException
s.ServletOutputStream
ou PrintWriter
, mas não ambos. Chamar getWriter()
depois de ter chamado getOutputStream()
, ou vice-versa, também causará uma IllegalStateException
.IllegalStateException
impede que o manipulador de resposta seja executado até sua conclusão, eliminando eficientemente a resposta. Isso pode causar instabilidade no servidor, o que é um sinal de um servlet inadequadamente aplicado.Exemplo 2: Por outro lado, o código a seguir tenta gravar e descarregar o buffer 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
depois que a solicitação foi encaminhada.
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
é definido como negativo.Content-Length
de um pedido indica que um programador está interessado na0
ou umContent-Length
incorreto.
URL url = nova URL("http://www.exemplo.com");
HttpURLConnection huc = (HttpURLConnection)url.openConnection();
huc.setRequestProperty("Content-Length", "-1000");
Content-Length
é definido como negativo.Content-Length
de uma solicitação indica que um programador está interessado na0
ou umContent-Length
incorretamente como negativo:
xhr.setRequestHeader("Content-Length", "-1000");
java.io.Serializable
podem causar problemas e deixar vazar informações da classe externa.
...
class User implements Serializable {
private int accessLevel;
class Registrator implements Serializable {
...
}
}
Example 1
, quando a classe interna Registrator
for serializada, ela também serializará o campo accessLevel
da classe externa User
.