2012-02-13 50 views
1

strtrns具有以下描述:desc-1desc-2在C中,使用比strtrns更安全的函數是什麼?

()函數轉換字符串並把它複製到 結果的strtrns。 任何出現在舊的字符被 中的字符替換爲新的相同位置。新的結果被返回。 .........

此功能存在安全風險,因爲可能會溢出 newString緩衝區。如果currentString緩衝區大於newString緩衝區,則會發生溢出。

這是它的原型(或「簽名」「:?

char * strtrns(const char *string, const char *old, const char *new, char *result); 

我一直在google搜索無果我明白任何提示或建議

+1

不要太迂腐,但爲什麼你的描述不符合簽名(oldsegment/newsegment/newString/currentString不匹配任何東西) – KevinDTimm 2012-02-13 17:28:26

+0

你不能太迂腐!我必須學習這一點!謝謝, – Coffee 2012-02-13 17:30:16

回答

3

我覺得你可以很快編寫自己的安全可靠。

它不會是一個直接的替代品,因爲簽名稍有不同,它會分配主叫方必須釋放的內存,但它可以用於大部分相同的工作。

(我也改變參數名稱new,這是C++的保留字,並且參數string這是一個非常普遍的類型在C++中。
這些變化使得與C++代碼兼容的功能以及)

char* alloc_strtrns(const char *srcstr, const char *oldtxt, const char *newtxt) 
{ 
    if (strlen(oldtxt) != strlen(newtxt)) 
    { 
     return NULL; /* Old and New lengths MUST match */ 
    } 

    char* result = strdup(srcstr); /* TODO: check for NULL */ 
    /* Caller is responsible for freeing! */ 

    return strtrns(srcstr, oldtxt, newtxt, result); 
} 
+0

這真的很有幫助 - 非常感謝您!] – Coffee 2012-02-13 17:39:18

+0

您確定strtrns的結果字符串的長度可能與輸入不同嗎?根據手冊頁,它只是一個直接逐個字符的替換,這意味着結果將與原始字符串的長度完全相同。此外,由於新字符串長度爲零,因此第一次調用strtrns可能會崩潰。我看過的strtrns的一個實現假定新舊緩衝區長度相同。另一個潛在的問題是,這不能直接替代,因爲調用者必須在此版本中釋放結果。 – 2012-02-13 17:47:14

+1

@MarkWilkins:有趣的是,我的確發現了strtrns的衝突文檔,有人說它做了1對1的字符替換,有人說它做了一個基於字符串的「搜索替換」。我想我不能確定OP Adel的實現。 – abelenky 2012-02-13 17:56:04

1

你不知道。真有C.你的任何選項只需要確保目標緩衝區足夠大。

+0

呃......沒有選擇?在C中,重寫這個小函數有多難?就我個人而言,有時候我不得不寫snprintf(),所以我認爲它可以完成。 – 2012-02-13 18:30:58

+0

當然可以重寫,但我解釋了這個問題,因爲OP想知道替代函數。 – Tobias 2012-02-13 18:33:01

+1

你一定要小心,不要打開C抨擊的大門。正如你所看到的,我已經來到這裏一段時間了,所以我從謹慎轉向偏執。 :) – 2012-02-13 19:25:44

2

聲稱這個函數是不安全的是無稽之談。在C語言中,只要有一個接口指向緩衝區並用一定數量的數據填充它,就必須在調用者和被調用者之間就緩衝區大小簽訂一份協議。對於某些函數,調用者無法預先知道被調用者將寫入多少數據,最合理的接口設計(合約)是讓調用者將緩衝區大小傳遞給被調用者,並讓被調用者返回錯誤或截斷數據緩衝區太小。但對於像strcpy或您的情況strtrns這樣的函數,其中輸出字節數是輸入字節數的一個簡單函數(如標識函數),這對合約來說簡直就是由輸出緩衝區提供的輸出緩衝區調用者必須至少與輸入緩衝區一樣大。

任何不熟悉嚴格遵守接口契約的人都不應該寫C語言。真的沒有辦法解決這個問題。增加複雜的邊界檢查界面當然不能解決問題,而只是改變你必須遵循的合同的性質。

順便說一下,strtrns不是一個標準的函數,所以如果你更喜歡不同的合同無論如何,你可能會更好地編寫自己的類似功能。這也會增加便攜性。

+0

R - - 感謝這一點 - 這是人們看起來忘記C - 你認爲有足夠的繩子讓你自己(或不是)按照你認爲合適的方式(並且有能力) - 沒有「入門級」C這樣的事情 – KevinDTimm 2012-02-13 20:45:28

相關問題