资讯动态

小恶意代码识别器(3)

发布时间:2026/10/14 17:15:50 来源:尧图企业网站定制
数据校验把坏数据挡在门外上一篇写完读取函数这篇写第二个函数validate_dataset。为什么需要单独一个校验函数读取函数里其实已经挡了两类问题拆不出六个数的行会被跳过超过数组上限会停下来。但数值本身合不合格读取时是不知道的比如标签写成了 2、比例写成了 1.3、熵超过了 8这些行格式是对的能被正常解析只是内容不合法。所以两个函数的分工是读取函数负责搬进来校验函数负责检查已经在架子上的货。检查哪些项说明文档里写清了每个字段的合法范围对照着写就行数据集不能为空标签只能是 0 或 1文件大小和字符串数量不能为负信息熵在 0 到 8 之间两个比例在 0 到 1 之间。函数结构是先查空再用一个循环遍历所有样本每轮做六项检查。staticintvalidate_dataset(constDataset*data){if(data-count0){printf(Dataset is empty\n);return1;}for(inti0;idata-count;i){if(data-samples[i].label!0data-samples[i].label!1){printf(Sample %d: bad label %d\n,i,data-samples[i].label);return1;}if(data-samples[i].features[2]0||data-samples[i].features[2]8){printf(Sample %d: entropy out of range\n,i);return1;}...}printf(All %d samples valid\n,data-count);return0;}参数带了const意思是这个函数只读取数据不修改校验本来就不该改动数据。条件要写不合法这是写的时候最容易搞反的地方。判断的目的是发现不合格的就打回所以 if 里应该写不合法的条件而不是合法的条件。我第一版把文件大小那条写成了features[0] 0意思是只要大小是正数就打回结果正常数据全被拒了。合法的条件是不为负反过来就是小于 0 才报错。if(data-samples[i].features[0]0){printf(Sample %d: negative file_size\n,i);return1;}比例那两项是范围检查写法是小于下界或者大于上界if(data-samples[i].features[3]0||data-samples[i].features[3]1){printf(Sample %d: byte_00_ratio out of range\n,i);return1;}返回值是给调用者的信号约定是 0 表示通过1 表示有问题。空数据集要单独提前返回不然循环转零圈走到结尾会打印全部合格等于把空数据判成了有效。调用方可以这么用if(validate_dataset(data)!0){...}任务书里有一项要求是数据为空时拒绝训练靠的就是这个返回值。测试老师给的data/invalid目录里有十几份故意做坏的文件正好拿来测。读非法标签的文件校验报 bad label读熵超 8 的文件报 entropy out of range读比例越界的文件报 byte_00_ratio out of range读合法边界的文件全部通过。流程是先选读取再选校验。两个操作分开才能看出是读取的问题还是校验的问题。一点体会条件写反这种错误编译器查不出来程序照常运行只是结果全错。写完一个函数就立刻拿不同的输入测一遍比攒到最后一起调试省事得多。下一篇写归一化和逻辑回归预测。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑