setAppelationMode(true);
setForcacaoDeBarraLevel(ForcandoABarra.EXTREME);
Tinham pedido alguns exemplos de obter ponteiro inválido em java e de fazer aritmética de ponteiros. Pois bem, lá vai.
Agradecimentos ao meu amigo Alcides Liberali.
import sun.misc.Unsafe;
import java.lang.reflect.Field;
/**
* @author Victor Williams Stafusa da Silva
* O ministério da saúde adverte: Esta classe causa câncer e
* severos outros danos a saúde. Não existem níveis seguros
* para o consumo das substâncias aqui presentes.
*
* Agradecimento: Alcides Liberali
*/
public class ApelacaoSemNocao {
public static void main(String[] args) throws Exception {
// Total appelation here!
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
Object h4ck3r = new Object();
// Colocando um belo lixo de memória aqui.
unsafe.putLong(h4ck3r, 0, 0x7777777777777777L);
// Ops, obtém um ponteiro inválido aqui!
Class<?> lollollol1one = h4ck3r.getClass();
// CRASH!
lollollol1one.toString();
}
}
import sun.misc.Unsafe;
import java.lang.reflect.Field;
/**
* @author Victor Williams Stafusa da Silva
* PERIGO: Crianças, não façam isso em casa.
* Nunca, nunca, jamais, never, em hipótese alguma use isso em um ambiente de produção.
* O uso deste programa é proibido para menores de 256 anos de idade.
*
* Agradecimento: Alcides Liberali
*/
public class AritmeticaDePonteiros {
private static class PointerGambi1 {
public long valor;
}
private static class PointerGambi2 {
public Object valor;
}
private static final String[] array = {
"cenoura",
"batata",
"uva",
"pizza",
"maionese"
};
public static void main(String[] args) throws Exception {
// Total appelation here!
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
// Obtém uns valores úteis.
long ofg1 = unsafe.objectFieldOffset(PointerGambi1.class.getField("valor"));
long ofg2 = unsafe.objectFieldOffset(PointerGambi2.class.getField("valor"));
int offset = unsafe.arrayBaseOffset(String[].class);
int scale = unsafe.arrayIndexScale(String[].class);
PointerGambi1 g1 = new PointerGambi1();
PointerGambi2 g2 = new PointerGambi2();
unsafe.putObject(g1, ofg1, array); // Converte ponteiro em long (ou seria referência em long?)
int t = unsafe.getInt(array, 8L); // Ou seja, t = array.length, que é o mesmo que *(&array + 8).
// Itera o array.
for (int a = 0; a < t; a++) {
// Calcula a posição do elemento via aritmética de ponteiros (ou seria aritmética de referências?)
long endereco;
if (scale == 4) { // Para processadores de 32 bits (aqui a portabilidade foi pro saco!)
endereco = unsafe.getInt(array, offset + 4 * a);
} else if (scale == 8) { // Para processadores de 64 bits.
endereco = unsafe.getLong(array, offset + 8 * a);
} else {
throw new Exception("Escala não suportada: " + scale);
}
// Usa o g2 como um iterador.
unsafe.putLong(g2, ofg2, endereco); // Converte long em ponteiro (ou talvez long em referência?)
// Mostra o elemento.
System.out.println(g2.valor);
}
}
}