直接使用deSALT建立索引的小bug
错误描述:在这里插入代码片
*** buffer overflow detected ***: deSALT terminated
Aborted
一直没有去读deSALT的论文,临近开题前夕想要测试一下这个工具,结果上来索引第一步就卡住了,自身对于Linux下写C经验较少,又不太懂,最后都没有测试这个工具。今天终于index成功了。但是在比对阶段也有个问题,等我解决了后续再更新。
一开始以为是我的文件名太长的问题或者路径名问题,改来改去还是有问题,崩溃==
而且,我单独去使用了deBG,是可以index成功的,所以感觉代码有个小地方错了。
今天仔细读了一下代码,一行一行查了每个代码的用法,最终改成功了!
话不多说,上代码:
/src/desalt_index.c
int desalt_index(int argc, char *argv[])
{
// clock_t t = clock();
char *ref_fa = 0;
char *index_route = 0;
char dir[1024]; //将1024改为2048
char desalt_path[1024];
int r;
if(optind + 3 > argc) return desalt_index_usage();
ref_fa = strdup(argv[optind+1]);
index_route = strdup(argv[optind+2]);
r = readlink("/proc/self/exe", dir, 2048);//出错地方
.......
}
记录一下readlink的相关信息:
相关函数: stat, lstat, symlink
表头文件: #include <unistd.h>
定义函数:ssize_t readlink(const char *path, char *buf, size_t bufsiz);
函数说明:readlink()会将参数path的 符号链接内容存储到参数buf所指的内存空间,返回的内容不是以\000作字符串结尾,但会将字符串的字符数返回,这使得添加\000变得简单。若参数bufsiz小于符号连接的内容长度,过长的内容会被截断,如果 readlink 第一个参数指向一个文件而不是 符号链接时,readlink 设 置errno 为 EINVAL 并返回 -1。 readlink()函数组合了open()、read()和close()的所有操作。
返回值 :执行成功则返回字符串的字符数,失败返回-1, 错误代码存于errno
执行成功则返回ssize_t
函数中:
/proc/self/exe是一个符号链接,代表当前程序的绝对路径
用readlink读取/proc/self/exe可以获取当前程序的绝对路径
要统一!!!后边要系统的去学一下这些函数。仍然一知半解,有好的教程欢迎推荐!!!