Una mala calidad del código lleva a un comportamiento no predecible. Desde la perspectiva de un usuario, muchas veces también supone una usabilidad limitada. Pero para un atacante es una oportunidad para atacar al sistema de formas insospechadas.
assert
para comprobar una declaración falsa.assert
está destinada a verificar solo declaraciones que se evalúan como true
. Si una declaración false
pasa a esta función, ello indica que el código no funciona correctamente o que la función se está utilizando incorrectamente, por ejemplo, para validar entradas.assert
para comprobar una declaración falsa.
contract A {
B b = new B(7);
function checkWithAssert(){
assert(b.retValue() == 21);
...
}
}
contract B {
uint _par;
constructor(uint par){
_par = par;
}
function retValue() returns(uint){
return _par;
}
}
getChunk == NULL
siempre será falso porque getChunk
es el nombre de una función definida en el 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()
en la instancia user
y no en las clases User
o RegularUser
, la condición siempre devolverá true
y se llevará a cabo la operación restringida aunque se utilice instanceof
para entrar en esta parte del bloque if/else
.serialPersistentFields
correctamente, debe declararse como private
, static
y final
.serialPersistentFields
. Esta característica solo funcionará si serialPersistentFields
se declara como private
, static
y final
.serialPersistentFields
no se usará para definir campos Serializable
porque no es private
, static
ni final
.
class List implements Serializable {
public ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("myField", List.class) };
...
}
Object.equals()
en una matriz en vez de java.util.Arrays.equals().
.Object.equals()
en una matriz es casi siempre un error, ya que comprobará la igualdad de las direcciones de las matrices, en vez de la igualdad de los elementos de las matrices, y debería reemplazarse 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()
para insertar la función routine
en las devoluciones y la pila de limpieza del subproceso de llamada. Como pthread_cleanup_push()
y su función asociada pthread_cleanup_pop()
se implementan como macros en las plataformas que no son IBM AIX, la estructura de datos creada por pthread_cleanup_push()
no será accesible para las subsiguientes llamadas a pthread_cleanup_pop()
. El código no se compilará o se comportará incorrectamente en tiempo de ejecución en todas las plataformas donde estas funciones se implementen como macros.
void helper() {
...
pthread_cleanup_push (routine, arg);
}