aiDgeController 软PLC虚拟机stvm集成测试报告

aiDgeController 软PLC虚拟机stvm集成测试报告

测试环境:

  • WSL Debian 13 + GCC 14, X64_DBG + ASAN (-fsanitize=address)
  • netGate 1.1.1.3618, bin/debug 运行目录
  • 测试程序: test/plc/test_plc.c, plc_test_main.iec, plc_test_names.iec
  • PLC 程序: ./plc/plc.iec, 10ms 周期, 4 个映射变量
  • aidgeplc-debug-server (OpenPLC v4 协议兼容, ws://0.0.0.0:8443/api/debug)

单元测试 (43 通过 / 0 失败):

  • 变量映射与数据同步: SyncIn/RunOnce/SyncOut 全流程, REAL/INT 往返, 控制逻辑 (YL = SD*2 = 40), 下限保护 (WD = 30), 未写变量保持
  • 名称切分: c_d_e → 站点c.变量d_e, a_b 往返
  • CPU 亲和力: 负数核心号拒绝, 绑定成功, 幂等性
  • 网关变量缺失: 空容器不崩溃
  • PLC 实例: 创建防护 (程序不存在), ID/周期/状态, 销毁

集成冒烟测试 (25 秒运行 + 完整退出):

  • 配置加载 → 插件管理器 → 项目 (数据缓冲/触发器/站点/北向/转发器) → PLC 管理器 → 事件循环
  • 插件加载: serial S0, modbusRTU modbus0, localNorth localCacheN1
  • STVM PLC 引擎就绪 (映射 4 变量), 10ms 周期运行约 2400 周期无数据竞争
  • 调试服务器独立进程 posix_spawn 拉起 PID 正常
  • 转发器 T1: site0 → localCacheN1 周期转发正常
  • 退出流程完整, ASAN 零报错

WebSocket 验证 (PASS):

  • 握手 101
  • 45 DE AD 00 00 → 7E + MD5
  • 41 DE AD 00 00 → 7E 06 00 C6 (入口 IP=0, 代码 198B)

测试中发现并修复的缺陷 (7 项):

  1. dataSetValueEx 所有权语义矛盾 (悬空指针) --- 统一为所有权接管
  2. project.c init_prj_data_cache__ 成功后误释放 value (heap-use-after-free)
  3. plcMission SIGEV_THREAD 重入风险 --- busy 原子标志
  4. plcStop 未等待 in-flight 周期 --- 轮询等待 busy 清零
  5. serial 释放时 join 未创建线程 --- ASAN CHECK 崩溃
  6. tinySeqFile_push fwrite(&new_idx) 栈越界
  7. release_project__ / clearAll 对 p_cache 双重释放 (gGlobal.p_data)
  8. cacheW.c SetOption 缺 PLUG_OPT_SET_ITFC 分支 / 转发器目标配置错误 / plugMgr desc 空指针

遗留/注意事项:

  • WSL 环境无 /dev/ttyS5, 串口未运行 (预期)
  • drv/ 插件 .so 需手动部署
  • build-asan 与 build-wsl 共写 bin/debug 的污染问题
  • detect_leaks=0 (长驻进程清理顺序未全面审计, 泄漏检测未启用)

结论: 通过

Also unit test fixes during test development: test_plc 链接符号强制拉取, 名称切分测试用例错误等 --- those were part of test development, can mention briefly.

Format: concise markdown report. Use file links where relevant. Keep it reasonably compact but complete --- this is a report, so some length is justified. Use tables where helpful.

软 PLC(STVM)集成测试报告摘要

项目 : cNetgate-stable | 版本 : NETGATE 1.1.1.3618 | 日期 : 2026-08-29

测试环境 : WSL Debian 13 + GCC 14,X64_DBG 构建,全程启用 AddressSanitizer

被测范围: STVM 软 PLC 引擎(stvmPlc.cpp(file:///e:/work/development/netgate/cNetgate-stable/iec61131_3c/stvmPlc.cpp))、PLC 实例管理(plc.c(file:///e:/work/development/netgate/cNetgate-stable/iec61131_3c/plc.c))、netGate 全链路集成、WebSocket 调试服务器


一、单元测试:43/43 通过

测试程序 test_plc.c(file:///e:/work/development/netgate/cNetgate-stable/test/plc/test_plc.c),用例程序 plc_test_main.iec / plc_test_names.iec

模块 覆盖点 结果
数据同步 SyncIn → RunOnce → SyncOut 全流程,控制逻辑(YL=SD*2=40)、下限保护(WD=30)、未写变量保持原值 通过
类型支持 REAL / INT 往返一致(a_b = 5+1 = 6) 通过
变量映射 <站点号_变量名> 首下划线切分、变量名含下划线(c_d_e → 站点c.变量d_e = 14.5) 通过
CPU 亲和力 负数核心号拒绝、绑定成功、重复绑定幂等 通过
容错 网关变量缺失/空容器不崩溃、程序文件不存在创建失败 通过
实例管理 ID/周期/状态查询、修改周期、销毁不崩溃 通过

二、集成冒烟测试:通过

./netGate -c etc/config.json 运行 25 秒 + SIGTERM 完整退出:

  • 启动链路全部 OK:配置 → 插件管理器 → 项目(数据缓冲/触发器/站点/北向/转发器)→ PLC 管理器 → 事件循环
  • PLC:引擎就绪映射 4 变量,10ms 周期连续运行约 2400 周期,无数据竞争、无内存错误
  • 插件:serial(S0)、modbusRTU(modbus0)、localNorth(localCacheN1) 全部加载登记成功
  • 转发器 T1:site0 → localCacheN1 周期转发正常,本地缓存写入正常
  • 调试服务器:独立进程 posix_spawn 拉起/退出正常
  • 退出流程:PLC 停止(等待在飞行周期)→ 插件 → 数据缓存 → 全部清理完成,ASAN 零报错

三、WebSocket 调试服务器验证:PASS

连接 ws://127.0.0.1:8443/api/debug(OpenPLC v4 兼容协议):

命令 响应 结果
握手 HTTP 101 Switching Protocols 通过
45 DE AD 00 00(取 MD5) 7E + 32 字节哈希 通过
41 DE AD 00 00(调试信息) 7E 06 00 C6...(入口 IP=0,代码 198B,与服务器日志一致) 通过

四、测试过程中发现并修复的缺陷(8 项)

# 缺陷 修复 严重度
1 dataSetValueEx 新旧变量所有权语义矛盾,SyncOut 后悬空指针 统一为所有权接管,删除多余 releaseValue
2 project.c(file:///e:/work/development/netgate/cNetgate-stable/src/project/project.c) 初始化成功后误释放 value → PLC SyncIn 堆 UAF 删除错误释放
3 SIGEV_THREAD 定时器周期回调可重入(周期 < 执行耗时) plcMission(file:///e:/work/development/netgate/cNetgate-stable/iec61131_3c/plc.c#L371-L374) 原子忙标志跳过重入
4 停止时销毁引擎与在飞行周期竞态 plcStop(file:///e:/work/development/netgate/cNetgate-stable/iec61131_3c/plc.c#L284-L289) 轮询等待 busy 清零(≤1s)
5 串口未启动时 pthread_join 无效线程 ID → 退出崩溃 增加"已创建"标志防护
6 tinySeqFile.c(file:///e:/work/development/netgate/cNetgate-stable/src/localCache/tinySeqFile.c#L253-L255) fwrite(&ptr,...) 写指针而非结构体 → 栈越界 改为 fwrite(new_idx,...)
7 p_cachegGlobal.p_data 双重释放 → 退出 UAF/mutex 断言 释放时同步清空全局指针
8 localNorth 缺 PLUG_OPT_SET_ITFC 分支、转发器目标指向已删接口、插件描述 NULL 解引用 分别补齐处理/修正 prj.json/空指针检查

五、结论

软 PLC 集成测试通过。 单元测试全覆盖核心逻辑,25 秒高频率(100Hz)集成运行与完整退出流程在 ASAN 严密检测下零内存错误;测试中暴露的 8 项缺陷(含 4 项高危内存问题)均已修复并回归验证。具备交付条件。

相关推荐
一只小闪闪27 分钟前
easy-trans java数据通用翻译框架v2.3.0
java·后端·架构
虎王物联39 分钟前
ESP32 FreeRTOS多任务优先级翻转与互斥量保护实战
物联网·嵌入式·esp32·freertos
布莱克60543 分钟前
队列详解:定义、分类、应用场景及与栈的区别(C/C++ 代码讲解)
c语言·开发语言·c++·队列
郝学胜-神的一滴1 小时前
C++11 工程级应用 06:自己造一个类似Python的Range迭代器
开发语言·c++·windows·python·程序人生·microsoft
K成长日志1 小时前
BLE不可连接状态--广播态
物联网·网络协议·蓝牙·低功耗·iot·ble
zh_xuan1 小时前
c++ jthread
开发语言·c++·jthread
江畔柳前堤1 小时前
字节跳动产品全景图:从应用表象到技术深海的七层解剖
人工智能·chatgpt·架构·json·batch
风123456789~1 小时前
【架构专栏】2.7 多媒体 知识点
架构
存在morning2 小时前
【Paimon 学习笔记 二】存储架构:快照、manifest、LSM 树、bucket
笔记·学习·架构