deSALT——index小bug[錯誤]*** buffer overflow detected ***: deSALT terminated Aborted
直接使用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()的所有操作。
執行成功則返回ssize_t
函式中:
/proc/self/exe是一個符號連結,代表當前程式的絕對路徑
用readlink讀取/proc/self/exe可以獲取當前程式的絕對路徑
要統一!!!後邊要系統的去學一下這些函式。仍然一知半解,有好的教程歡迎推薦!!!