按源验证非随机刀表保存边界

源依据:LinuxCNC src/emc/tooldata/tooldata_common.cc 的 tooldata_save() 在 DB_NOTUSED 下按 is_random_toolchanger 选择起始 pocket;非随机换刀器从 pocket 1 开始写出,跳过 spindle pocket 0。

结论:wasm-safe tooldata_common standalone probe 增加非随机保存断言,确认 pocket 0 的 spindle-only 数据不会写入普通刀表,同时 pocket 1 的真实刀具仍会保存,减少 tooldata_common/mmap 后端替换风险。

检查:./test-linuxcnc-wasm-tooldata-common-link.sh;./test-native.sh;./test-linuxcnc-source-link.sh。
This commit is contained in:
cnc
2026-06-06 12:58:57 +08:00
parent 42e5b0784d
commit 23e67bb6cd

View File

@@ -123,6 +123,47 @@ int main() {
nonrandom_spindle.offset.tran.z != 4.25) {
return 20;
}
CANON_TOOL_TABLE spindle_only = tooldata_entry_init();
spindle_only.toolno = 99;
spindle_only.pocketno = 0;
spindle_only.offset.tran.z = 9.0;
if (tooldata_put(spindle_only, 0) != IDX_OK) {
return 21;
}
CANON_TOOL_TABLE saved_nonspindle = tooldata_entry_init();
saved_nonspindle.toolno = 7;
saved_nonspindle.pocketno = 5;
saved_nonspindle.offset.tran.z = 4.25;
if (tooldata_put(saved_nonspindle, 1) == IDX_FAIL) {
return 26;
}
std::string nonrandom_save_template = make_temp_template("cnc_tooldata_common_nonrandom_save_XXXXXX");
std::vector<char> nonrandom_save_path(nonrandom_save_template.begin(), nonrandom_save_template.end());
nonrandom_save_path.push_back('\0');
const int nonrandom_save_fd = mkstemp(nonrandom_save_path.data());
if (nonrandom_save_fd < 0) {
return 22;
}
close(nonrandom_save_fd);
// LinuxCNC source basis: src/emc/tooldata/tooldata_common.cc saves
// nonrandom tool tables starting at pocket 1, so spindle pocket 0 is not
// emitted unless DB_ACTIVE selects the one-entry spindle save path.
if (tooldata_save(nonrandom_save_path.data()) != 0) {
std::remove(nonrandom_save_path.data());
return 23;
}
FILE *nonrandom_save_fp = std::fopen(nonrandom_save_path.data(), "r");
if (!nonrandom_save_fp) {
std::remove(nonrandom_save_path.data());
return 24;
}
char nonrandom_saved[CANON_TOOL_ENTRY_LEN * 2] = {};
std::fread(nonrandom_saved, 1, sizeof(nonrandom_saved) - 1, nonrandom_save_fp);
std::fclose(nonrandom_save_fp);
std::remove(nonrandom_save_path.data());
if (std::strstr(nonrandom_saved, "T99") || !std::strstr(nonrandom_saved, "T7")) {
return 25;
}
tooldata_init(true);
tooldata_set_db(DB_ACTIVE);