class T implements Runnable {
public void run() {
Thread thisThread = Thread.currentThread();
thisThread.stop();
}
}
Compilar un proyecto desarrollado en Java de forma estricta.
A continuación se describen las condiciones bajo las cuales la siguiente solución tiene sentido:
Se está desarrollando una aplicación en Java.
Por defecto, Java impone un ambiente de compilación bastante estricto en cuanto al manejo de tipos. Sin embargo, algunas opciones de compilación pueden ser bastante útiles a la hora de ayudar en la producción de un código más seguro.
En general, y como primera regla, no es buena idea compilar un programa en Java usando miembros o clases obsoletas. La opción -deprecation (o - Xlint:deprecation) da mayor información sobre los elementos obsoletos utilizados en el programa. Esto puede ayudar a evitar que los programadores hagan uso de funciones inseguras.
De manera general, las advertencias sobre este tipo de situaciones no deberían ignorarse.
Por ejemplo, se crea una clase que use el método stop de la clase Thread.
class T implements Runnable {
public void run() {
Thread thisThread = Thread.currentThread();
thisThread.stop();
}
}
Se nota que compilando del modo tradicional, solamente se informa que se está haciendo uso de clases obsoletas, pero no se ofrece mucho detalle al respecto.
% javac T.java
Note: T.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
En cambio, al utilizar la opción -deprecation, la información obtenida es mayor, en este caso, si se indica el lugar exacto donde se produce el problema.
% javac -deprecation T.java
T.java:5: warning: [deprecation] stop() in Thread has been deprecated
thisThread.stop();
^
1 warning
Se observa que utilizando la opción -Xlint:deprecation se consigue el mismo resultado:
% javac -Xlint:deprecation T.java
T.java:5: warning: [deprecation] stop() in Thread has been deprecated
thisThread.stop();
^
1 warning
Por defecto, Java incluye información de depuración sobre el número de línea y el nombre archivo. Sin embargo, esto puede modificarse para que Java no de tanta información. En producción esto no es deseable y se sugiere remover toda la información de depuración
Por ejemplo, se comparará la ejecución del siguiente código.
class X {
public static void main(String... args) {
int x = 5 / 0;
}
}
Cuando se compila del modo tradicional, se observa que el mensaje de la excepción informa que el error fue producido en la línea 5 en un archivo llamado +X.java.
% javac X.java
% java X
Exception in thread "main" java.lang.ArithmeticException: / by zero
at X.main(X.java:5)
Por el contrario, cuando se compila usando la opción -g:none, simplemente se informa que que la fuente es desconocida:
% javac -g:none X.java
% java X
Exception in thread "main" java.lang.ArithmeticException: / by zero
at X.main(Unknown Source)
Por último, Java permite la generación de archivos clase para los archivos fuente cargados implícitamente. Esto puede ser peligroso, se sugiere deshabilitar esta característica.
javac -deprecation -g:none -implicit:none
Copyright © 2021 Fluid Attacks, We hack your software. All rights reserved.