我有一個函數,它接受包含敏感數據(在char
數組中)作爲參數(排序的小型庫)的struct *
指針。 兩個struct
型號如下:防止結構中的字符指針溢出
struct struct1 {
char str[1024]; /* maybe even 4096 or 10KB+ */
size_t str_length;
}
struct struct2 {
char *str;
size_t str_length;
}
的測試功能是:
/* Read str_length bytes from the char array. */
void foo(struct struct1/struct2 *s) {
int i;
for (i = 0; i < s->str_length; i++) {
printf("%c\n", s->str[i]);
}
}
我擔心的是,由於str_length參數爲任意值,我們可以故意把它設置爲導致緩衝區溢出(實際上有人愚蠢到有意在自己的程序中創建安全漏洞,但我覺得我必須考慮這些情況)。通過使用struct1模型,但是,我可以簡單地通過只使用檢查一個可能的緩衝區溢出:
if (s->str_length > sizeof(s->str)) {
/* ERROR */
}
的問題是,長度數組實際上未知是在編譯時。所以我不知道是否使用char *
指針(struct2風格,所以沒有溢出檢查)或定義一個非常大的數組(struct1),這將限制最大長度(我想避免的東西)和大部分時間都會分配不必要的空間(這在嵌入式系統中可能存在問題,我猜想)。我知道我必須作出妥協,我個人使用struct2模型,但我不確定這是否是一個安全明智的選擇。
如果你想有一個填充階段教練與全功能的範圍檢查,你應該明確不使用C.如果用戶改變了實例的指針? – Olaf
習慣於此在結構的最後定義一個絕對巨大的數組以供您的lib使用,並讓用戶管理它的實際分配並傳遞一個指針和「實際」大小。您保持靈活性,不會浪費實際空間。當然,你不能直接拷貝結構體! –
安全?這是C - 你已經沒有安全:) –