코드 품질이 낮으면 예측할 수 없는 동작이 발생합니다. 사용자 입장에서는 사용 편의성이 떨어지는 것으로 나타나는 경우가 많습니다. 공격자에게는 예상치 못한 방법으로 시스템에 부담을 줄 수 있는 기회가 됩니다.
assert
Solidity 함수를 사용하여 false 문을 확인합니다.assert
Solidity 함수는 true
로 평가되는 문 확인 전용입니다. 이 함수에 false
문이 전달되면 함수가 올바르게 작동하지 않는 코드를 가리키거나 입력 유효성 검사 등에서 함수가 잘못 사용됩니다.assert
함수를 사용하여 false 문을 확인합니다.
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
은 getChunk
이 프로그램에 정의된 함수의 이름이므로 항상 false가 됩니다.
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();
}
}
}
}
User
또는 RegularUser
클래스가 아닌 user
인스턴스에 대해 getAccessLevel()
메서드를 호출하므로 이 조건에서는 항상 true
가 반환됩니다. 그리고 이 if/else
블록 부분으로 진입하기 위해 instanceof
를 사용했더라도 제한된 작업이 수행됩니다.serialPersistentFields
를 올바르게 사용하려면 private
, static
및 final
로 선언되어야 합니다.serialPersistentFields
배열에서 지정하여 클래스에 대해 Serializable 필드를 수동으로 정의할 수 있습니다. 이 기능은 serialPersistentFields
가 private
, static
및 final
로 선언된 경우에만 작동합니다.serialPersistentFields
선언은 private
, static
및 final
이 아니기 때문에 Serializable
필드를 정의하는 데 사용되지 않습니다.
class List implements Serializable {
public ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("myField", List.class) };
...
}
java.util.Arrays.equals().
대신 배열에 대해 Object.equals()
를 호출합니다.Object.equals()
호출은 잘못된 것입니다. 이와 같이 호출하면 배열 요소가 아니라 배열 주소가 같은지를 확인하기 때문입니다. 일반적으로는 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()
를 사용하여 함수 routine
을 호출 스레드의 정리 스택으로 푸시하고 반환합니다. pthread_cleanup_push()
와 해당 파트너 함수인 pthread_cleanup_pop()
은 IBM AIX가 아닌 플랫폼에서 매크로로 구현되므로 pthread_cleanup_push()
에 의해 생성되는 데이터 구조는 이후의 pthread_cleanup_pop()
호출에 액세스할 수 없게 됩니다. 코드가 컴파일에 실패하거나 이러한 함수가 매크로로 구현되는 모든 플랫폼에서는 런타임 시 코드가 올바로 작동하지 않습니다.
void helper() {
...
pthread_cleanup_push (routine, arg);
}