From 951dcc79805c0f30d86a46b2c48916add532a325 Mon Sep 17 00:00:00 2001 From: cnc Date: Wed, 3 Jun 2026 19:17:18 +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 结论:收敛第 1 组 switchkins/remap 生成器约束,--all-output-dir 拒绝含空白路径和文件系统根目录,避免生成表/配置 case 误写到不受控位置;未扩展 smoke 功能。验证:./check-linuxcnc-switchkins-remap-table.sh linuxcnc-kinematics-source-files.txt、CNC_SIM_ALL_NATIVE_GUARDRAILS_ONLY=1 ./test-all-native.sh、./test-native.sh、./test-linuxcnc-source-link.sh 均通过。 --- check-linuxcnc-switchkins-remap-table.sh | 27 +++++++++++++++++++++ generate-linuxcnc-switchkins-remap-table.sh | 9 +++++++ 2 files changed, 36 insertions(+) diff --git a/check-linuxcnc-switchkins-remap-table.sh b/check-linuxcnc-switchkins-remap-table.sh index 9357ad7..aa2c61b 100755 --- a/check-linuxcnc-switchkins-remap-table.sh +++ b/check-linuxcnc-switchkins-remap-table.sh @@ -380,6 +380,8 @@ validate_generator_cli_contract() { local cli_manifest_without_postgui local cli_manifest_without_remap local cli_manifest_without_tooldata + local cli_output_root_log + local cli_output_whitespace_log cli_dir=$(mktemp -d "${TMPDIR:-/tmp}/linuxcnc_switchkins_remap_cli.XXXXXX") trap 'rm -rf "$cli_dir"' EXIT cli_manifest="$cli_dir/bridgemill-manifest.txt" @@ -408,6 +410,8 @@ validate_generator_cli_contract() { cli_manifest_without_postgui="$cli_dir/bridgemill-manifest-without-postgui.txt" cli_manifest_without_remap="$cli_dir/bridgemill-manifest-without-remap.txt" cli_manifest_without_tooldata="$cli_dir/bridgemill-manifest-without-tooldata.txt" + cli_output_root_log="$cli_dir/output-root.log" + cli_output_whitespace_log="$cli_dir/output-whitespace.log" if ! awk -F: -v manifest="$manifest_file" ' function require(key) { @@ -743,6 +747,29 @@ validate_generator_cli_contract() { exit 1 fi + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + --all-output-dir "$cli_dir/out with space" "$cli_manifest" >"$cli_output_whitespace_log" 2>&1; then + echo "switchkins remap generator accepted an output directory with whitespace" >&2 + exit 1 + fi + if ! grep -F "switchkins remap output directory must not contain whitespace: $cli_dir/out with space" \ + "$cli_output_whitespace_log" >/dev/null; then + echo "switchkins remap generator did not report whitespace output directories clearly" >&2 + sed -n '1,20p' "$cli_output_whitespace_log" >&2 + exit 1 + fi + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + --all-output-dir / "$cli_manifest" >"$cli_output_root_log" 2>&1; then + echo "switchkins remap generator accepted the filesystem root as output directory" >&2 + exit 1 + fi + if ! grep -F "switchkins remap output directory must not be the filesystem root" \ + "$cli_output_root_log" >/dev/null; then + echo "switchkins remap generator did not report filesystem-root output directories clearly" >&2 + sed -n '1,20p' "$cli_output_root_log" >&2 + exit 1 + fi + LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --all-output-dir "$cli_dir/out" "$cli_manifest" LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh "$cli_manifest" \ >"$cli_dir/linuxcnc_switchkins_remap_table.stdout.inc" diff --git a/generate-linuxcnc-switchkins-remap-table.sh b/generate-linuxcnc-switchkins-remap-table.sh index b9fdc45..130511f 100755 --- a/generate-linuxcnc-switchkins-remap-table.sh +++ b/generate-linuxcnc-switchkins-remap-table.sh @@ -64,6 +64,10 @@ if [[ "$mode" == all && -z "$all_output_dir" ]]; then echo "missing output directory for --all-output-dir" >&2 exit 1 fi +if [[ "$mode" == all && "$all_output_dir" =~ [[:space:]] ]]; then + echo "switchkins remap output directory must not contain whitespace: $all_output_dir" >&2 + exit 1 +fi linuxcnc_root=$(cd "$linuxcnc_root" && pwd) @@ -1244,6 +1248,11 @@ elif [[ "$mode" == all ]]; then exit 1 fi mkdir -p "$all_output_dir" + all_output_dir=$(cd "$all_output_dir" && pwd) + if [[ "$all_output_dir" == "/" ]]; then + echo "switchkins remap output directory must not be the filesystem root" >&2 + exit 1 + fi write_generated_file "$all_output_dir/linuxcnc_switchkins_remap_table.inc" "table" write_table write_generated_file "$all_output_dir/linuxcnc_switchkins_remap_config_cases.inc" "config cases" write_config_cases write_generated_file "$all_output_dir/linuxcnc_switchkins_remap_config_cases.json" "JSON config cases" write_json_cases