On dit que java est plus sûr dans la manipulation de la mémoire de C. En C, il est très facile de provoquer une erreur de segmentation en accédant pointeur non valide. Maintenant, je voudrais savoir si le code Java peut également provoquer une erreur de segmentation. Quelqu'un peut-il me donner un exemple?
En règle générale dans le programme Java normale vous n'avez pas ce problème. Mais oui si vous utilisez chose comme sun.misc.Unsafe
vous pouvez provoquer une erreur de segmentation. Mais ce pourquoi Unsafe
est appelé Unsafe
. Normalement , vous ne devez pas utiliser si vous ne disposez pas de ces problèmes dans votre code.
Pour plus d' informations: Où est - sun.misc.Unsafe documenté?
Bug signalé avec l' erreur basé Segmentation avec sun.misc.Unsafe
https://github.com/eclipse/openj9/issues/4153
Voici un exemple comment vous pouvez tester:
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class MainClass {
public static void main(String[] args)
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);
long ten = 10;
byte size = 1;
long mem = unsafe.allocateMemory(size);
//Put here the wrong address!!!
unsafe.putAddress(1, ten);
//With this will work:
//unsafe.putAddress(mem, ten);
long readValue = unsafe.getAddress(mem);
System.out.println("result: " + readValue);
}
}
Quand j'Executer sur Ubuntu 18.04, je reçois cette sortie: A fatal error has been detected by the Java Runtime Environment:
SIGSEGV (0xb) at pc=0x00007f05bdf04d27, pid=4145, tid=4147
JRE version: OpenJDK Runtime Environment (10.0.2+13) (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
Sous Windows, je pense que ce sera une sortie similaire avec la description d'erreur fatale.
Bonne chance à tous!