1. 程式人生 > 其它 >deSALT——index小bug[錯誤]*** buffer overflow detected ***: deSALT terminated Aborted

deSALT——index小bug[錯誤]*** buffer overflow detected ***: deSALT terminated Aborted

技術標籤:linuxlinux程式語言

直接使用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可以獲取當前程式的絕對路徑

要統一!!!後邊要系統的去學一下這些函式。仍然一知半解,有好的教程歡迎推薦!!!