按源验证非随机刀表保存边界
源依据: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:
@@ -123,6 +123,47 @@ int main() {
|
|||||||
nonrandom_spindle.offset.tran.z != 4.25) {
|
nonrandom_spindle.offset.tran.z != 4.25) {
|
||||||
return 20;
|
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_init(true);
|
||||||
tooldata_set_db(DB_ACTIVE);
|
tooldata_set_db(DB_ACTIVE);
|
||||||
|
|||||||
Reference in New Issue
Block a user