Complex condition¶
ID: cpp/complex-condition
Kind: problem
Security severity:
Severity: recommendation
Precision: high
Tags:
- testability
- readability
- maintainability
- statistical
- non-attributable
Query suites:
- cpp-security-and-quality.qls
Click to see the query in the CodeQL repository
This rule finds boolean expressions that have more than 5 consecutive operators that are not of the same type (e.g. alternating &&
and ||
operators). Long chains of operators of the same type are not flagged as violations of this rule.
Complex boolean expressions are hard to read. Consequently, when modifying such expressions there is an increased risk of introducing defects. Naming intermediate results as local variables will make the logic easier to read and understand.
Recommendation¶
Use local variables or macros to represent intermediate values to make the condition easier to understand.
Example¶
//This condition is too complex and can be improved by using local variables
bool accept_message =
(message_type == CONNECT && _state != CONNECTED) ||
(message_type == DISCONNECT && _state == CONNECTED) ||
(message_type == DATA && _state == CONNECTED);
//This condition is acceptable, as all the logical operators are of the same type (&&)
bool valid_connect =
message_type == CONNECT &&
_state != CONNECTED &&
time_since_prev_connect > MAX_CONNECT_INTERVAL &&
message_length <= MAX_PACKET_SIZE &&
checksum(message) == get_checksum_field(message);