在内核空间中使用strsep来分隔字符串

时间:2015-05-17 17:02:01

标签: c string linux-kernel kernel

我正在尝试根据内核模块中的某个分隔符分隔字符串。

我正在尝试使用http://ionicframework.com/docs/cli/sass.html函数,但当我尝试使用它时,我的内核崩溃了。

有人可以识别下面代码中的错误吗?

char *test = "test1:test2:test3";
char *token = test;
char *end = test;
while (token != NULL) {
    strsep(&end, ":");
    token = end;
}
kfree(test);

1 个答案:

答案 0 :(得分:1)

您正在传递一个字符串文字并且strsep()修改它,它是未定义的行为,请尝试这样

char test[] = "A:B:C:D";

你不应该free(test),而不是这个建议中的那个,也不应该是代码中的那个。

你是free() test,这是最糟糕的,你应该在尝试编写c代码之前了解指针和动态内存,特别是如果它是一个内核模块。

如果你愿意,编译器可能会警告你,但你应该通过声明任何指向字符串文字的指针来帮助编译器,例如const,例如在你的情况下

const char *test = "Whatever";

然后编译器会说像第一个参数strsep()丢弃const限定符,这可能不会阻止它编译,但会让你看到你做了出了点问题。