|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CWE-478: Missing Default Case in Switch Statement
Description Summary The code does not have a default case in a switch statement, which might lead to complex logical errors and resultant weaknesses.
Example 1 The following does not properly check the return code in the case where the security_check function returns a -1 value when an error occurs. If an attacker can supply data that will invoke an error, the attacker can bypass the security check: (Bad Code) Example
Language: C #define FAILED 0 #define PASSED 1 int result; ... result = security_check(data); switch (result) { case FAILED:
printf("Security check failed!\n");
exit(-1);
//Break never reached because of exit()
break;
case PASSED:
printf("Security check passed.\n");
break;
} // program execution continues... ... Instead a default label should be used for unaccounted conditions: (Good Code) Example
Language: C #define FAILED 0 #define PASSED 1 int result; ... result = security_check(data); switch (result) { case FAILED:
printf("Security check failed!\n");
exit(-1);
//Break never reached because of exit()
break;
case PASSED:
printf("Security check passed.\n");
break;
default:
printf("Unknown error (%d), exiting...\n",result);
exit(-1);
} This label is used because the assumption cannot be made that all possible cases are accounted for. A good practice is to reserve the default case for error handling. Example 2 In the following Java example the method getInterestRate retrieves the interest rate for the number of points for a mortgage. The number of points is provided within the input parameter and a switch statement will set the interest rate value to be returned based on the number of points. (Bad Code) Example
Language: Java public static final String INTEREST_RATE_AT_ZERO_POINTS =
"5.00"; public static final String INTEREST_RATE_AT_ONE_POINTS =
"4.75"; public static final String INTEREST_RATE_AT_TWO_POINTS =
"4.50"; ... public BigDecimal getInterestRate(int points) { BigDecimal result = new
BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);
switch (points) {
case 0:
result = new
BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);
break;
case 1:
result = new
BigDecimal(INTEREST_RATE_AT_ONE_POINTS);
break;
case 2:
result = new
BigDecimal(INTEREST_RATE_AT_TWO_POINTS);
break;
}
return result;
} However, this code assumes that the value of the points input parameter will always be 0, 1 or 2 and does not check for other incorrect values passed to the method. This can be easily accomplished by providing a default label in the switch statement that outputs an error message indicating an invalid value for the points input parameter and returning a null value. (Good Code) Example
Language: Java public static final String INTEREST_RATE_AT_ZERO_POINTS =
"5.00"; public static final String INTEREST_RATE_AT_ONE_POINTS =
"4.75"; public static final String INTEREST_RATE_AT_TWO_POINTS =
"4.50"; ... public BigDecimal getInterestRate(int points) { BigDecimal result = new
BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);
switch (points) {
case 0:
result = new
BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);
break;
case 1:
result = new
BigDecimal(INTEREST_RATE_AT_ONE_POINTS);
break;
case 2:
result = new
BigDecimal(INTEREST_RATE_AT_TWO_POINTS);
break;
default:
System.err.println("Invalid value for points, must be
0, 1 or 2");
System.err.println("Returning null value for interest
rate");
result = null;
}
return result;
}
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Page Last Updated:
September 12, 2011
|
|
CWE is a Software Assurance strategic initiative co-sponsored by the National Cyber Security Division of the U.S. Department of Homeland Security. This Web site is sponsored and managed by The MITRE Corporation to enable stakeholder collaboration. Copyright © 2006-2012, The MITRE Corporation. CWE, CWSS, CWRAF, and the CWE logo are trademarks of The MITRE Corporation. Contact cwe@mitre.org for more information. |
|||



