From ae7de73a7c4a9e9442c1641ca9270741e2e344d5 Mon Sep 17 00:00:00 2001 From: cnc Date: Thu, 4 Jun 2026 20:23:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=82=E8=80=83=E6=89=80=E6=9C=89=E5=88=86?= =?UTF-8?q?=E7=BB=84=EF=BC=8C=E5=AE=8C=E6=88=90=E5=B0=BD=E9=87=8F=E5=A4=9A?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AE=B9=E3=80=82=E7=A6=81=E6=AD=A2=E9=A1=BA?= =?UTF-8?q?=E6=89=8B=E6=89=A9=E5=8A=9F=E8=83=BD=20smoke?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结论:补强 WASM runtime shim 的 LinuxCNC HAL source-map 与 probe,确认 HAL lookup 在浏览器安全 shim 中保持不可用边界,不扩展 smoke 行为。 --- check-linuxcnc-wasm-shims-source-map.sh | 9 ++++ .../cnc_sim_wasm_runtime_probe_main.cc | 46 +++++++++++++++++++ docs/linuxcnc-wasm-shims-source-map.md | 2 +- test-linuxcnc-wasm-cmake-safe-probe.sh | 4 ++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/check-linuxcnc-wasm-shims-source-map.sh b/check-linuxcnc-wasm-shims-source-map.sh index 4b9256b..c59d444 100755 --- a/check-linuxcnc-wasm-shims-source-map.sh +++ b/check-linuxcnc-wasm-shims-source-map.sh @@ -29,6 +29,13 @@ grep -F 'int _task = 0;' "$linuxcnc_root/src/emc/rs274ngc/gcodemodule.cc" >/dev/ grep -F 'int _task = 1;' "$linuxcnc_root/src/emc/task/emctaskmain.cc" >/dev/null grep -F 'struct _inittab builtin_modules[]' "$linuxcnc_root/src/emc/task/taskclass.cc" >/dev/null grep -F 'int Interp::fetch_hal_param(' "$linuxcnc_root/src/emc/rs274ngc/interp_namedparams.cc" >/dev/null +grep -F 'hal_get_pin_value_by_name(hal_name, &type, &ptr, &conn)' \ + "$linuxcnc_root/src/emc/rs274ngc/interp_namedparams.cc" >/dev/null +grep -F 'hal_get_signal_value_by_name(hal_name, &type, &ptr, &conn)' \ + "$linuxcnc_root/src/emc/rs274ngc/interp_namedparams.cc" >/dev/null +grep -F 'hal_get_param_value_by_name(hal_name, &type, &ptr)' \ + "$linuxcnc_root/src/emc/rs274ngc/interp_namedparams.cc" >/dev/null +grep -F 'HAL_TYPE_UNINITIALIZED = 0,' "$linuxcnc_root/include/hal.h" >/dev/null grep -F 'wordexp(basename, &exp_result, 0);' "$linuxcnc_root/src/emc/rs274ngc/rs274ngc_pre.cc" >/dev/null grep -F 'EMC_STAT *emcStatus = new EMC_STAT;' "$linuxcnc_root/src/emc/sai/dummyemcstat.cc" >/dev/null grep -F 'NMLmsg::NMLmsg' "$linuxcnc_root/src/libnml/nml/nmlmsg.cc" >/dev/null @@ -71,6 +78,7 @@ expected_shims = { "src/emc/task/emctaskmain.cc", "src/emc/task/taskclass.cc", "src/emc/rs274ngc/interp_namedparams.cc", + "include/hal.h", "src/hal/hal_lib.c", "src/emc/rs274ngc/rs274ngc_pre.cc", ], @@ -123,6 +131,7 @@ for phrase in [ "RS274/WASM manifest", "browser-safe LinuxCNC adaptations", "dynamic loading unavailable", + "unavailable HAL lookup", "inactive-DB return values", "negative-status short-circuit behavior", ]: diff --git a/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc b/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc index 9316c1b..d664cda 100644 --- a/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc +++ b/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc @@ -1,4 +1,5 @@ #include "cnc_sim_api.h" +#include "hal.h" #include #include @@ -9,6 +10,8 @@ // LinuxCNC source basis: src/emc/rs274ngc/rs274ngc_pre.cc provides read(), // execute(), and wordexp() paths; interp_convert.cc converts G0, G2, and M30. +// src/emc/rs274ngc/interp_namedparams.cc calls the HAL lookup functions +// declared in include/hal.h and implemented by src/hal/hal_lib.c. namespace { int collect_event(const CncSimEvent *event, void *user_data) { @@ -57,6 +60,46 @@ bool wordexp_expands_environment_variables() { return ok; } +bool hal_lookup_is_unavailable() { + if (hal_init("cnc_sim_wasm_runtime_probe") != 1) { + return false; + } + if (hal_ready(1) != 0) { + return false; + } + + hal_data_u dummy{}; + hal_data_u *data = &dummy; + hal_type_t type = HAL_FLOAT; + bool connected = true; + if (hal_get_pin_value_by_name("cnc-sim.missing-pin", &type, &data, &connected) != -1 || + type != HAL_TYPE_UNINITIALIZED || + data != nullptr || + connected) { + return false; + } + + data = &dummy; + type = HAL_FLOAT; + bool has_writers = true; + if (hal_get_signal_value_by_name("cnc-sim.missing-signal", &type, &data, &has_writers) != -1 || + type != HAL_TYPE_UNINITIALIZED || + data != nullptr || + has_writers) { + return false; + } + + data = &dummy; + type = HAL_FLOAT; + if (hal_get_param_value_by_name("cnc-sim.missing-param", &type, &data) != -1 || + type != HAL_TYPE_UNINITIALIZED || + data != nullptr) { + return false; + } + + return true; +} + } // namespace int main() { @@ -66,6 +109,9 @@ int main() { if (!wordexp_expands_environment_variables()) { return 6; } + if (!hal_lookup_is_unavailable()) { + return 7; + } std::vector events; CncSimHandle *sim = cnc_sim_create(); diff --git a/docs/linuxcnc-wasm-shims-source-map.md b/docs/linuxcnc-wasm-shims-source-map.md index dffccfa..5613ba3 100644 --- a/docs/linuxcnc-wasm-shims-source-map.md +++ b/docs/linuxcnc-wasm-shims-source-map.md @@ -17,7 +17,7 @@ only; it must not add CNC behavior and must not expand the temporary smoke parse | `core/wasm_shims/dlfcn.cc` | `src/emc/rs274ngc/interp_base.cc` | Satisfies native `dlopen` symbols for browser-safe probes while keeping dynamic loading unavailable. | | `core/wasm_shims/emc_status_shim.cc` | `src/emc/sai/dummyemcstat.cc` | Provides the source-backed `emcStatus` singleton shape without task/NML startup. | | `core/wasm_shims/gettext_shim.cc` | `src/emc/rs274ngc/interp_internal.hh` | Preserves LinuxCNC diagnostic call sites without browser gettext catalogs. | -| `core/wasm_shims/linuxcnc_runtime_shim.cc` | `src/emc/rs274ngc/gcodemodule.cc`, `src/emc/task/emctaskmain.cc`, `src/emc/task/taskclass.cc`, `src/emc/rs274ngc/interp_namedparams.cc`, `src/hal/hal_lib.c`, `src/emc/rs274ngc/rs274ngc_pre.cc` | Keeps preview/task, builtin Python module, HAL lookup, and `wordexp()` edges compile-safe. | +| `core/wasm_shims/linuxcnc_runtime_shim.cc` | `src/emc/rs274ngc/gcodemodule.cc`, `src/emc/task/emctaskmain.cc`, `src/emc/task/taskclass.cc`, `src/emc/rs274ngc/interp_namedparams.cc`, `include/hal.h`, `src/hal/hal_lib.c`, `src/emc/rs274ngc/rs274ngc_pre.cc` | Keeps preview/task, builtin Python module, unavailable HAL lookup, and `wordexp()` edges compile-safe. | | `core/wasm_shims/nml_status_shim.cc` | `src/libnml/nml/nmlmsg.cc`, `src/libnml/nml/stat_msg.cc` | Provides NML status constructors needed by source-linked EMC status objects. | | `core/wasm_shims/python_c_api_shim.cc` | `src/emc/rs274ngc/interp_python.cc`, `src/emc/rs274ngc/interp_namedparams.cc`, `src/emc/rs274ngc/gcodemodule.cc`, `src/emc/pythonplugin/python_plugin.cc` | Satisfies Python C API symbols while Python/Boost.Python remap paths remain tracked blockers. | | `core/wasm_shims/rcs_print_shim.cc` | `src/libnml/rcs/rcs_print.cc` | Provides LinuxCNC RCS print diagnostics used by NML validation. | diff --git a/test-linuxcnc-wasm-cmake-safe-probe.sh b/test-linuxcnc-wasm-cmake-safe-probe.sh index a753c3b..fb8218b 100755 --- a/test-linuxcnc-wasm-cmake-safe-probe.sh +++ b/test-linuxcnc-wasm-cmake-safe-probe.sh @@ -1531,6 +1531,10 @@ grep -F 'LinuxCNC source basis: src/emc/rs274ngc/interp_base.cc native loader fl grep -F 'LinuxCNC source basis: src/emc/rs274ngc/gcodemodule.cc defines _task=0' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null grep -F 'LinuxCNC source basis: src/emc/task/taskclass.cc and' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null grep -F 'LinuxCNC source basis: src/emc/rs274ngc/interp_namedparams.cc fetch_hal_param()' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null +grep -F 'src/emc/rs274ngc/interp_namedparams.cc calls the HAL lookup functions' core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc >/dev/null +grep -F 'bool hal_lookup_is_unavailable()' core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc >/dev/null +grep -F 'hal_get_pin_value_by_name("cnc-sim.missing-pin", &type, &data, &connected) != -1' core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc >/dev/null +grep -F 'type != HAL_TYPE_UNINITIALIZED' core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc >/dev/null grep -F 'LinuxCNC source basis: src/emc/rs274ngc/rs274ngc_pre.cc uses wordexp()' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null grep -F 'extern "C" int wordexp(const char *words, wordexp_t *pwordexp, int)' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null grep -F 'extern "C" void wordfree(wordexp_t *pwordexp)' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null