issue on sizeof()

本文探讨了C语言中结构体的内存对齐问题,通过两个不同成员顺序的结构体示例,展示了成员变量的不同排列如何影响结构体的大小。通过对sizeof运算符结果的分析,可以帮助理解内存对齐原理及其对程序效率的影响。

 

 

 

 

 

sizeof(AType) 应该返回8还是返回5 ?

   5 = sizeof(char)+sizeof(int) = 1 + 4;

 

??????

 

static void check_hung_uninterruptible_tasks(unsigned long timeout) { int max_count = sysctl_hung_task_check_count; unsigned long last_break = jiffies; struct task_struct *g, *t; bool need_check = true; /* * If the system crashed already then all bets are off, * do not report extra hung tasks: */ 1. Condition test_taint(7), taking false branch. 2. Condition did_panic, taking false branch. if (test_taint(TAINT_DIE) || did_panic) return; hung_task_show_lock = false; rcu_read_lock(); 3. Condition 0 /* !((((sizeof (g->tasks.next) == sizeof (char) || sizeof (g->tasks.next) == sizeof (short)) || sizeof (g->tasks.next) == sizeof (int)) || sizeof (g->tasks.next) == sizeof (long)) || sizeof (g->tasks.next) == sizeof (long long)) */, taking false branch. 4. Switch case value 8. 49821: (#2 of 2): Out-of-bounds read (OVERRUN) overrun-local: Overrunning array of 1 bytes at byte offset 7 by dereferencing pointer (__u64 *)__u.__c. 这里为什么会有越界? CID 166846:MISRA C-2004 Control Statement Expressions (MISRA C-2004 Rule 13.1) [ "select issue" ] for_each_process_thread(g, t) { if (!max_count--) goto unlock; if (time_after(jiffies, last_break + HUNG_TASK_LOCK_BREAK)) { if (!rcu_lock_break(g, t)) goto unlock; last_break = jiffies; } trace_android_vh_check_uninterruptible_tasks(t, timeout, &need_check); if (need_check) /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ CID 49821:(#1 of 2):Out-of-bounds read (OVERRUN) [ "select issue" ] if (READ_ONCE(t->__state) == TASK_UNINTERRUPTIBLE) check_hung_task(t, timeout); } trace_android_vh_check_uninterruptible_tasks_dn(NULL); unlock: rcu_read_unlock(); if (hung_task_show_lock) debug_show_all_locks(); if (hung_task_show_all_bt) { hung_task_show_all_bt = false; trigger_all_cpu_backtrace(); } if (hung_task_call_panic) panic("hung_task: blocked tasks"); }
06-14
int hiTrafficTestPacketSet(user_port up, char *rawPacket, char *src_mac, char *dst_mac, char *src_ip, char *dst_ip, UINT16 lenType, UINT8 vlan, UINT32 *packetId) { int rc; int dev = 0; int dstPort = 0; struct in_addr srcIp; struct in_addr dstIp; UINT8 srcMac[MAC_ADDR_SIZE] ={0}; UINT8 dstMac[MAC_ADDR_SIZE] ={0}; UINT8 trafficTestBuf[TOTAL_PKT_LEN] = {0}; GT_U8 *packetDataPtr = (GT_U8 *)trafficTestBuf; if (!UP_IS_VALID(up)) { printf("invalid port: %d", UP_PORT(up)); return ERR_BAD_PARAM; } adPmpUp2Dp(up, &dev, &dstPort); inet_pton(AF_INET, src_ip, &srcIp); inet_pton(AF_INET, dst_ip, &dstIp); str2ether(src_mac, srcMac); str2ether(dst_mac, dstMac); TRAFFIC_TEST_PKT_ETHER_HEADER *ethPtr = NULL; TRAFFIC_TEST_PKT_IP_HEADER *ipPtr = NULL; TRAFFIC_TEST_PKT_UDP_HEADER *udpPtr = NULL; UINT8 *payloadPtr = NULL; ethPtr = (TRAFFIC_TEST_PKT_ETHER_HEADER*)trafficTestBuf; memcpy(ethPtr->dst_mac, &dstMac, MAC_ADDR_SIZE); memcpy(ethPtr->src_mac, &srcMac, MAC_ADDR_SIZE); ethPtr->lenType = htons(lenType); ipPtr = (TRAFFIC_TEST_PKT_IP_HEADER*)(trafficTestBuf + sizeof(TRAFFIC_TEST_PKT_ETHER_HEADER)); memcpy(ipPtr->src_ip, &srcIp, IPv4_SIZE); memcpy(ipPtr->dst_ip, &dstIp, IPv4_SIZE); ipPtr->ver_ihl = 0x45; ipPtr->tos = 0; ipPtr->id = 0; ipPtr->flags_fragOffset = 0x4000; ipPtr->ttl = 64; ipPtr->total_length = htons(0x0058); ipPtr->protocol = 0x11; ipPtr->checkSum = 0; udpPtr = (TRAFFIC_TEST_PKT_UDP_HEADER*)(trafficTestBuf + sizeof(TRAFFIC_TEST_PKT_ETHER_HEADER) + sizeof(TRAFFIC_TEST_PKT_IP_HEADER)); udpPtr->src_port = htons(0x1638); udpPtr->dst_port = htons(0x1638); udpPtr->length = htons(0x0044); udpPtr->checkSum = 0; payloadPtr = (UINT8*)(trafficTestBuf + sizeof(TRAFFIC_TEST_PKT_ETHER_HEADER) + sizeof(TRAFFIC_TEST_PKT_IP_HEADER) + sizeof(TRAFFIC_TEST_PKT_UDP_HEADER)); memcpy(payloadPtr, rawPacket, MAX_PAYLOAD_LEN); rc = hiTrafficPacketSdmaTxPacketSend(vlan, packetDataPtr, TOTAL_PKT_LEN, dstPort, packetId); if(rc != ERR_NO_ERROR) { printf("hiTrafficPacketSdmaTxPacketSend error rc=%d \n",rc); } return ERR_NO_ERROR; } memcpy(payloadPtr, rawPacket, MAX_PAYLOAD_LEN); rc = hiTrafficPacketSdmaTxPacketSend(vlan, packetDataPtr, TOTAL_PKT_LEN, dstPort, packetId);这里修改一下复制负载同样长度,计算整个报文总长度并传入发包函数】、
最新发布
11-05
还是不行 CN25G(config-dnsproxy-doh)#show DNS over HTTPS (DoH) Configuration =========================================== Global DoH Switch : Enabled ------------------------------------------- Configured DoH Servers: ID Name Status URL ----------------------------------------------------------- 1 zzx on https://test2.com 2 test on test.com =========================================== CN25G(config-dnsproxy-doh)#set 2 % Another server is being edited (ID: 1) % Commit or abort current session first CN25G(config-dnsproxy-doh)#set 1 CN25G(config-dnsproxy-doh-set)# cancel - Cancel the doh set commit - Commit the doh dnsserver - Set doh dnsserver name - Set doh name status - Set doh status end - Return to Privileged EXEC Mode exit - Exit current mode history - Display command history no - Negate command show - Display system information CN25G(config-dnsproxy-doh-set)# CN25G(config-dnsproxy-doh-set)#name test1 % Name updated for server 1: test1 CN25G(config-dnsproxy-doh-set)#commit CN25G(config-dnsproxy-doh-set)#exit CN25G(config-dnsproxy-doh)#show DNS over HTTPS (DoH) Configuration =========================================== Global DoH Switch : Enabled ------------------------------------------- Configured DoH Servers: ID Name Status URL ----------------------------------------------------------- 1 zzx on https://test2.com 2 test on test.com =========================================== STATUS cli_dnsproxy_doh_server_set(cli_env *pCliEnv, const char *id_str) { char buffer[128]; // 转换ID为数字 unsigned id_num = convert_id_str_to_num(id_str); if (id_num == 0) { snprintf(buffer, sizeof(buffer), "%% Invalid server ID: %s", id_str); RCC_EXT_WriteStrLine(pCliEnv, buffer); return ERROR; } // 检查编辑会话状态 if (s_doh_edit_ctx.in_edit) { if (s_doh_edit_ctx.server_id == id_num) return OK; snprintf(buffer, sizeof(buffer), "%% Another server is being edited (ID: %u)\n" "%% Commit or abort current session first", s_doh_edit_ctx.server_id); RCC_EXT_WriteStrLine(pCliEnv, buffer); return ERROR; } CFG_DOH_SERVER_T **server_list = NULL; APPL_ERRCODE ret = dmDohCfgServerGetAll(&server_list); if (ret != ERR_NO_ERROR) { snprintf(buffer, sizeof(buffer), "%% Failed to get server list (error: 0x%X)", ret); RCC_EXT_WriteStrLine(pCliEnv, buffer); return ERROR; } // 查找匹配的服务器 bool found = false; for (int i = 0; server_list[i] != NULL; i++) { unsigned server_id = (unsigned)atoi(server_list[i]->id); if (server_id == id_num) { // 关键修正:直接引用原始数据结构 s_doh_edit_ctx.server_id = id_num; s_doh_edit_ctx.server = *server_list[i]; // 结构体拷贝 found = true; break; } } // 释放服务器列表 dmDohCfgServerListFree(server_list); if (!found) { snprintf(buffer, sizeof(buffer), "%% Server not found (ID: %u)", id_num); RCC_EXT_WriteStrLine(pCliEnv, buffer); return ERROR; } // 设置编辑状态 s_doh_edit_ctx.in_edit = true; snprintf(buffer, sizeof(buffer), "%% Editing server (ID: %u)", id_num); RCC_EXT_WriteStrLine(pCliEnv, buffer); return OK; } // 提交编辑会话 - 统一处理函数 STATUS cli_dnsproxy_doh_server_set_commit(cli_env *pCliEnv) { char buffer[256]; APPL_ERRCODE ret; // 1. 验证编辑状态 if (!s_doh_edit_ctx.in_edit) { RCC_EXT_WriteStrLine(pCliEnv, "%% No active edit session"); return ERROR; } // 2. 确保ID字段正确设置 CFG_DOH_SERVER_T *ent = &s_doh_edit_ctx.server; snprintf(ent->id, sizeof(ent->id), "%u", s_doh_edit_ctx.server_id); // 3. 调试日志:打印将要保存的配置 snprintf(buffer, sizeof(buffer), "%% Saving config: ID=%s, Name=%s, URL=%s, Status=%s", ent->id, ent->name, ent->server, ent->status); RCC_EXT_WriteStrLine(pCliEnv, buffer); // 4. 调用数据库API ret = dmDohCfgServerSet(ent); if (ret != ERR_NO_ERROR) { snprintf(buffer, sizeof(buffer), "%% Failed to update server (error: 0x%X)", ret); RCC_EXT_WriteStrLine(pCliEnv, buffer); return ERROR; } // 5. 清除编辑状态(关键修复) s_doh_edit_ctx.in_edit = false; // 6. 显示成功消息 snprintf(buffer, sizeof(buffer), "%% Successfully committed changes for server %s", ent->id); RCC_EXT_WriteStrLine(pCliEnv, buffer); return OK; } STATUS cli_dnsproxy_doh_server_set_name(cli_env *pCliEnv, const char *new_name) { // 1. 验证编辑状态 if (!s_doh_edit_ctx.in_edit) { RCC_EXT_WriteStrLine(pCliEnv, "%% No active edit session"); return ERROR; } // 2. 设置新名称 strncpy(s_doh_edit_ctx.server.name, new_name, DNSPROXY_LEN_NAME64-1); s_doh_edit_ctx.server.name[DNSPROXY_LEN_NAME64-1] = '\0'; // 3. 反馈 char buffer[128]; snprintf(buffer, sizeof(buffer), "%% Name updated for server %d: %s", s_doh_edit_ctx.server_id, new_name); RCC_EXT_WriteStrLine(pCliEnv, buffer); return OK; } STATUS cli_dnsproxy_doh_server_set_dnsserver(cli_env *pCliEnv, const char *new_url) { if (!s_doh_edit_ctx.in_edit) { RCC_EXT_WriteStrLine(pCliEnv, "%% No active edit session"); return ERROR; } // URL格式验证 if (strncmp(new_url, "https://", 8) != 0) { RCC_EXT_WriteStrLine(pCliEnv, "%% URL must start with https://"); return ERROR; } strncpy(s_doh_edit_ctx.server.server, new_url, DNSPROXY_LEN_SERVER_URL-1); s_doh_edit_ctx.server.server[DNSPROXY_LEN_SERVER_URL-1] = '\0'; char buffer[128]; snprintf(buffer, sizeof(buffer), "%% Server URL updated for %d: %s", s_doh_edit_ctx.server_id, new_url); RCC_EXT_WriteStrLine(pCliEnv, buffer); return OK; } STATUS cli_dnsproxy_doh_server_set_status(cli_env *pCliEnv, const char *new_status) { if (!s_doh_edit_ctx.in_edit) { RCC_EXT_WriteStrLine(pCliEnv, "%% No active edit session"); return ERROR; } // 扩展状态值验证 const char *valid_status[] = {"on", "off", "enable", "disable", NULL}; bool valid = false; for (int i = 0; valid_status[i] != NULL; i++) { if (strcasecmp(new_status, valid_status[i]) == 0) { valid = true; break; } } if (!valid) { RCC_EXT_WriteStrLine(pCliEnv, "%% Status must be 'on', 'off', 'enable' or 'disable'"); return ERROR; } strcpy(s_doh_edit_ctx.server.status, new_status); char buffer[128]; snprintf(buffer, sizeof(buffer), "%% Status updated for server %d: %s", s_doh_edit_ctx.server_id, new_status); RCC_EXT_WriteStrLine(pCliEnv, buffer); return OK; } STATUS cli_dnsproxy_doh_server_set_cancel(cli_env *pCliEnv) { if (!s_doh_edit_ctx.in_edit) { RCC_EXT_WriteStrLine(pCliEnv, "%% No active edit session to abort"); return ERROR; } unsigned current_id = s_doh_edit_ctx.server_id; memset(&s_doh_edit_ctx, 0, sizeof(s_doh_edit_ctx)); char buffer[128]; snprintf(buffer, sizeof(buffer), "%% Edit session aborted (ID: %u)", current_id); RCC_EXT_WriteStrLine(pCliEnv, buffer); return OK; }
10-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值