我在弄清楚下面的代码出了什么问题时遇到了问题。我运行完整的代码,我做了很多输入测试,错误正在按照我想要的方式处理。我还使用valgrind,cppchecker之类的东西来检查我修复的错误。然后我决定使用 afl-fuzzer 对我的代码进行高级错误检测,然后由于下面的代码行,我遇到了很多崩溃。但是,大多数崩溃是由于分段错误造成的。但我似乎看不出代码有什么问题。任何帮助将不胜感激。下面是不断给出错误的函数。我认为这与sscanf
有关:
Tree* insert(char* command, Tree* tree) {
int age;
char* name = malloc(sizeof(char) * 20);
if (2 != sscanf(command, "i %d %20s", &age, name)){
fprintf(stderr, "Failed to parse insert command: not enough parameters filledn");
// return NULL;
}
if (tree == NULL){
tree = tree_create();
}
tree_insert(tree, age, name);
return tree;
}
tree_create功能
Tree* tree_create(){
Tree *tree = malloc(sizeof(Tree));
tree->root = NULL;
return tree;
}
tree_insert
void tree_insert(Tree* tree, int age, char* name) {
if (tree->root == NULL) {
Node *node = calloc(1, sizeof(Node));
node->name = name;
node->age = age;
node->isRoot = true;
node->right = NULL;
node->left = NULL;
tree->root = node;
} else {
node_insert(tree->root, age, name, 1);
}
}
主要问题在于以下行:
char* name = malloc(sizeof(char) * 20);
if (2 != sscanf(command, "i %d %20s", &age, name)){
您的转换规范%20s
说sscanf()
可以存储 20 个字符加上一个空name
字节,但您只为 19 个字符加上一个空字节分配了足够的空间。scanf()
函数族和大多数其他函数之间的这种"逐一"会导致问题,模糊器应该找到它们。
解决方法很简单:将前 20 更改为 21,或将后 20 更改为 19。 哪个更好是你的判断电话。 我们没有足够的信息来选择哪个(如果有的话(是更好的选择。