CodeQL 文档

长开关语句

ID: cpp/long-switch
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - maintainability
   - readability
Query suites:
   - cpp-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

此规则查找开关语句,其 case 语句包含过多的代码。长 case 语句通常会导致大量嵌套,这使得理解代码的实际功能变得更加困难。请考虑将每个 case 语句的代码封装在函数中,并在每个 case 语句中仅使用 switch 语句调用相应的函数。

指示的 switch 语句的 case 语句长度超过 30 行。

建议

考虑为长 case 语句中的代码创建单独的函数。

示例

//This switch statement has long case statements, and can become difficult to
//read as the processing for each message type becomes more complex
switch (message_type) {
	case CONNECT:
		_state = CONNECTING;
		int message_id = message_get_id(message);
		int source = connect_get_source(message);
		//More code here...
		send(connect_response);
		break;
	case DISCONNECT:
		_state = DISCONNECTING;
		int message_id = message_get_id(message);
		int source = disconnect_get_source(message);
		//More code here...
		send(disconnect_response);
		break;
	default:
		log("Invalid message, id : %d", message_get_id(message));
}

//This is better, as each case is split out to a separate function
switch (packet_type) {
	case STREAM:
		process_stream_packet(packet);
		break;
	case DATAGRAM:
		process_datagram_packet(packet);
		break;
	default:
		log("Invalid packet type: %d", packet_type);
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私