freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

cc語言安全編程規(guī)范v10(編輯修改稿)

2025-05-11 10:44 本頁面
 

【文章內容簡介】 something... */ printf(Error (type %s)\n, error_msg)。 //【修改】使格式化參數(shù)個數(shù)匹配}:禁止以用戶輸入來構造格式化字符串說明:調用格式化I/O函數(shù)時,不要直接或者間接將用戶輸入作為格式化字符串的一部分或者全部。如果攻擊者對一個格式化字符串可以部分或完全控制,將導致進程崩潰、查看棧的內容、改寫內存、甚至執(zhí)行任意代碼等風險。錯誤示例:下列代碼直接將用戶輸入作為格式字符串輸出。void Nonpliant(char *user, char *password) { char input[1000]。 if (fgets(input, sizeof(input) 1, stdin) == NULL) { /* handle error */ } input[sizeof(input)1] = ’\0’。 printf(input)。 //【錯誤】不允許將用戶輸入直接作為格式字符串}示例代碼的input直接來自用戶輸入,并作為格式化字符串直接傳遞給printf()。當用戶輸入的是“%s%s%s%s%s%s%s%s%s%s%s%s”,就可能觸發(fā)無效指針或未映射的地址讀取。格式字符%s顯示棧上相應參數(shù)所指定的地址的內存。這里input被當成格式化字符串,而沒有提供參數(shù),因此printf()讀取棧中任意內存位置,直到格式字符耗盡或者遇到一個無效指針或未映射地址為止。推薦做法:通過顯式參數(shù)”%s”將 printf()的格式化字符串確定下來。void Compliant(char *user, char *password) { char input[1000]。 if (fgets(input, sizeof(input)1, stdin) == NULL) { /* handle error */ } input[sizeof(input)1] = ’\0’。 printf(“%s”, input)。 //【修改】通過%s將格式字符串確定下來}:使用格式化函數(shù)時推薦使用精度說明符說明:使用格式化函數(shù)時(例如sprintf(),scanf_s()等),可能會含有字符串參數(shù),應盡量為格式化指示符加上精度說明符以限制拷貝字符串的長度,防止緩沖區(qū)溢出漏洞。錯誤示例:使用格式化函數(shù)sprintf,沒有添加精度說明符,可能會導致緩沖區(qū)溢出。define BUF_SIZE 128void NoCompliant(){ char buffer[BUF_SIZE + 1]。 sprintf( buffer, Usage: %s argument\n, argv[0] )。 /* ...do something... */}推薦做法:優(yōu)先采用snprintf替代sprintf來防止緩沖區(qū)溢出。若沒有帶n版本的snprintf函數(shù),可參考如下示例,使用sprintf,在接收字符串時,加上精度說明符,確定接收的長度,以免造成緩沖區(qū)溢出。define BUF_SIZE 128void Compliant(){ char buffer[BUF_SIZE + 1]。 sprintf(buffer, Usage: %.100s argument\n, argv[0])。 /*【修改】字符串加上精度說明符 */ /* ...do something... */}通過精度限制從argv[0] 中只能拷貝 100 個字節(jié)。4 整數(shù)安全C99標準定義了整型提升(integer promotions)、整型轉換級別(integer conversion rank)以及普通算術轉換(usual arithmetic conversions)的整型操作。不過這些操作實際上也帶來了安全風險。:確保無符號整數(shù)運算時不會出現(xiàn)反轉說明:反轉是指無法用無符號整數(shù)表示的運算結果將會根據(jù)該類型可以表示的最大值加1執(zhí)行求模操作。將運算結果用于以下之一的用途,應防止反轉:l 作為數(shù)組索引l 指針運算l 作為對象的長度或者大小l 作為數(shù)組的邊界l 作為內存分配函數(shù)的實參錯誤示例:下列代碼可能導致相加操作產生無符號數(shù)反轉現(xiàn)象。INT32 NoCompliant(UINT32 ui1, UINT32 ui2, UINT32 * ret){ if( NULL == ret ) { return ERROR。 } *ret = ui1 + ui2。 /*上面的代碼可能會導致ui1加ui2產生無符號數(shù)反轉現(xiàn)象,譬如ui1 = UINT_MAX且ui2 = 2。這可能會導致后面的內存分配數(shù)量不足或者產生易被利用的潛在風險;*/ return (OK)。}推薦做法:INT32 Compliant(UINT32 ui1, UINT32 ui2, UINT32 * ret){ if( NULL == ret ) { return ERROR。 } if((UINT_MAX ui1) ui2) //【修改】確保無符號整數(shù)運算時不會出現(xiàn)反轉 { return ERROR。 } else { *ret = ui1+ ui2。 } return OK。}延伸閱讀材料:漏洞VU551436就是因為反轉問題,導致分配內存空間不足,引發(fā)堆溢出。:確保有符號整數(shù)運算時不會出現(xiàn)溢出說明:整數(shù)溢出是是一種未定義的行為,意味著編譯器在處理有符號整數(shù)溢出時具有很多選擇。將運算結果用于以下之一的用途,應防止溢出:l 作為數(shù)組索引l 指針運算l 作為對象的長度或者大小l 作為數(shù)組的邊界l 作為內存分配函數(shù)的實參錯誤示例:下列代碼中兩個有符號整數(shù)相乘可能會產生溢出。INT32 NoCompliant(INT32 si1, INT32 si2, INT32 *ret){ if ( NULL == ret ) { return ERROR。 } *ret = si1 * si2。 /* 上面的代碼可能會產生兩個有符號整數(shù)相乘可能會產生溢出,譬如si1 = INT_MAX且si2 非0。*/ return OK。}推薦做法:INT32 Compliant(INT32 si1, INT32 si2, INT32 *ret){ if ( NULL == ret ) { return ERROR。 } INT64 tmp = (INT64)si1 *(INT64)si2。 /*【修改】確保有符號整數(shù)運算時不會出現(xiàn)溢出 */ if((INT_MAX tmp) || (INT_MIN tmp)) { return ERROR。 } *ret = si1 * si2。 return OK。}延伸閱讀材料:整數(shù)溢出可能導致緩沖區(qū)溢出以及任意代碼執(zhí)行。Apple Mac OS X ,存在整數(shù)溢出漏洞,可被利用執(zhí)行任意代碼。攻擊者可以將特定的GIF文件放在Web頁面或者郵件附件中,誘使目標打開此文件從而觸發(fā)利用。具體可參考USCERT披露的漏洞VU559444。:確保整型轉換時不會出現(xiàn)截斷錯誤說明: 將一個較大整型轉換為較小整型,并且該數(shù)的原值超出較小類型的表示范圍,就會發(fā)生截斷錯誤,原值的低位被保留而高位被丟棄。截斷錯誤會引起數(shù)據(jù)丟失,甚至可能引發(fā)安全問題。特別是將運算結果用于以下用途:l 作為數(shù)組索引l 指針運算l 作為對象的長度或者大小l 作為數(shù)組的邊界(如作為循環(huán)計數(shù)器)錯誤示例:數(shù)據(jù)類型強制轉化導致數(shù)據(jù)被截斷。INT32 NoCompliant(UINT32 ui, INT8 *ret){ if( NULL == ret ) { return ERROR。 } *ret = (INT8)ui。 /*上面的代碼會導致數(shù)據(jù)被截斷,譬如ui = UINT_MAX場景下*/ return (OK)。 }推薦做法:INT32 Compliant(UINT32 ui, INT8 *ret){ if(NULL == ret) { return ERROR。 } if(SCHAR_MAX = ui) //【修改】確保整型轉換時不會出現(xiàn)截斷 { *ret = (INT8)ui。 } else { return ERROR。 } return OK。 }:確保整型轉換時不會出現(xiàn)符號錯誤說明: 有時從帶符號整型轉換到無符號整型會發(fā)生符號錯誤,符號錯誤并不丟失數(shù)據(jù),但數(shù)據(jù)失去了原來的含義。帶符號整型轉換到無符號整型,最高位(highorder bit)會喪失其作為符號位的功能。如果該帶符號整數(shù)的值非負,那么轉換后值不變;如果該帶符號整數(shù)的值為負,那么轉換后的結果通常是一個非常大的正數(shù)。錯誤示例:符號錯誤繞過長度檢查define BUF_SIZE 10int main(int argc, char* argv[]){ int length。 char buf[BUF_SIZE]。 if (argc != 3) { return 1。 } length = atoi(argv[1])。 //【錯誤】atoi返回值可能為負數(shù) if (length BUF_SIZE) // len為負數(shù),長度檢查無效 { memcpy(buf, argv[2], length)。 /* 帶符號的len被轉換為size_t類型的無符號整數(shù),負值被解釋為一個極大的正整數(shù)。memcpy()調用時引發(fā)buf緩沖區(qū)溢出*/ printf(Data copied\n)。 } else { printf(Too many data\n)。 }}推薦做法1:將length聲明為無符號整型,這樣符號錯誤后產生的極大正整數(shù)可以在與BUF_SIZE比較時檢查出來;推薦做法2:在長度檢查時,除了要保證長度小于BUF_SIZE,還要保證長度大于0。:把整型表達式比較或賦值為一種更大類型之前必須用這種更大類型對它進行求值說明:若一個整型表達式與一個很大長度的整數(shù)類型進行比較或者賦值為這種類型的變量,需要對該整型表達式的其中一個操作數(shù)類型顯示轉換為更大長度的整數(shù)類型,用這種更大的進行求值。這里所說的更大整數(shù)類型是相對整型表達式的操作數(shù)類型而言,譬如整型表達式的操作數(shù)類型是unsigned int ,則該規(guī)則所說的更大類型是指 unsigned long long。錯誤示例:數(shù)據(jù)類型不一致導致整型表達式賦值錯誤。void *NoCompliant(UINT32 blockNum){ if(0 == blockNum ) { return NULL。 } UINT64 alloc = blockNum * 16。 /*blockNum為32位的無符號數(shù),兩個32位的數(shù)相乘仍為32位的數(shù),這會導致 alloc = UNIT_MAX始終為TRUE.*/ return (alloc = UINT_MAX)?malloc(blockNum*16):NULL。} /*...申請的內存使用后free...*/ 推薦做法:void *Compliant(UINT32 blockNum){ if(0 == blockNum ) { return NULL。 } UINT64 alloc = (UINT64)blockNum * 16。 /*【修改】確保整型表達式轉換時不出現(xiàn)數(shù)值錯誤 */ return (alloc = UINT_MAX)?malloc(blockNum*16):NULL。} /*...申請的內存使用后free...*/ :避免對有符號整數(shù)進行位操作符運算說明:位操作符(~、amp。、^、|)應該只用于無符號整型操作數(shù),因為有符號整數(shù)上的有些位操作的結果是由編譯器所決定的,可能會出現(xiàn)出乎意料的行為或編譯器定義的行為。 錯誤示例:對有符號數(shù)作位操作運算。define BUF_LEN (4)INT32 NoCompliant(void){ INT32 ret = 0。 INT32 i = 0x8000000。 //【不推薦】避免使用有符號數(shù)作位操作符運算 INT8 buf[BUF_LEN]。 memset(buf,0,BUF_LEN)。 ret = snprintf(buf, BUF_LEN, %u, i 24)。 /* i 24的結果是0xFFFFFFF8(10進制4294967288),導致轉換為 一個字符串時,長度超過BUF_LEN,無法存儲在buf中,因此被snprintf截 斷;若是采用sprintf, 這個例子就會產生緩沖區(qū)溢出*/ if(1 == ret || BUF_LEN = ret) { return ERROR。 } return OK。} 推薦做法:define BUF_LEN (4)INT32 Compliant(void){ INT32 ret = 0。 UINT32 i = 0x8000000。//【修改】使用無符號代替有符號數(shù)作位操作符運算 INT8 buf[BUF_LEN]。 memset(buf, 0, BUF_LEN)。 ret = snprintf(buf, 4, %u, i 24)。 if(1 == ret || BUF_LEN = re
點擊復制文檔內容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1