看一道大華的面試題,題目并不難。
問(wèn)strcat strncat strcmp strcpy哪些函數(shù)會(huì)導(dǎo)致內(nèi)存溢出?如何改進(jìn)?
這幾個(gè)函數(shù),要說(shuō)跟內(nèi)存溢出沒(méi)有關(guān)系的,只有strcmp。
它的功能只是比較兩個(gè)字符串是否相等,給定地址,然后從地址開(kāi)始逐個(gè)向后比較,并不涉及寫內(nèi)存,所以也不存在溢出的說(shuō)法。
剩下的三個(gè)函數(shù)都有可能導(dǎo)致內(nèi)存溢出。
就拿strcpy來(lái)說(shuō),作用就是把源字符串拷貝到目的內(nèi)存中,實(shí)現(xiàn)的方法就是循環(huán)逐個(gè)賦值,如果源字符串過(guò)長(zhǎng),strcpy也不好把控,這樣就會(huì)導(dǎo)致一些未知的情況發(fā)生。
那么有人可能會(huì)問(wèn),strcpy里面為什么不做個(gè)判斷,如果目的內(nèi)存不夠,就停止賦值。
我們來(lái)看下strcpy的參數(shù)。
char *strcpy(char *dest, const char *src);
只有兩個(gè)地址,在C語(yǔ)言中,只給你一個(gè)地址,是不好知道從這個(gè)地址開(kāi)始,向后多少個(gè)字節(jié)是能用的。
于是在某些平臺(tái)上,就出現(xiàn)了strcpy_s這樣的函數(shù)。
strcpy_s(char *dest, int size, const char *src);
功能和strcpy差不多,就是多了個(gè)參數(shù),第二個(gè)參數(shù)表示目的內(nèi)存的大小,這樣在拷貝的時(shí)候,就能精確的判斷出內(nèi)存是否越界。
當(dāng)然了,如果你傳參的時(shí)候瞎寫了一個(gè)長(zhǎng)度,這就不是函數(shù)的問(wèn)題了,是你的問(wèn)題。
strcat也是用樣的問(wèn)題,把一個(gè)字符串接在另一個(gè)字符串的后面,這個(gè)過(guò)程也沒(méi)有考慮內(nèi)存越界的問(wèn)題。
strncat雖然可以指定連接的字符個(gè)數(shù),但是函數(shù)內(nèi)部在使用內(nèi)存的時(shí)候,也沒(méi)有做內(nèi)存越界的判斷,越不越界只能靠用戶自己把握。
審核編輯:劉清
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7628瀏覽量
139758 -
內(nèi)存溢出
+關(guān)注
關(guān)注
0文章
10瀏覽量
1306
原文標(biāo)題:C語(yǔ)言的哪些函數(shù)不安全
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
C語(yǔ)言函數(shù)調(diào)用過(guò)程中的內(nèi)存變化解析
C語(yǔ)言使用函數(shù)調(diào)用的知識(shí)點(diǎn)
C語(yǔ)言內(nèi)存知識(shí)總結(jié):memset函數(shù)和calloc函數(shù)
詳解C語(yǔ)言中整形溢出問(wèn)題

CodeVisionAVR C語(yǔ)言庫(kù)函數(shù)介紹
MicroBlaze:malloc 函數(shù)動(dòng)態(tài)分配內(nèi)存溢出

C語(yǔ)言使用函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么?
如何解決內(nèi)存溢出

java內(nèi)存溢出排查方法
c語(yǔ)言整型數(shù)據(jù)的溢出計(jì)算
c語(yǔ)言中數(shù)據(jù)溢出是歸0還是歸1
jvm內(nèi)存溢出該如何定位解決
內(nèi)存溢出與內(nèi)存泄漏:定義、區(qū)別與解決方案
C語(yǔ)言內(nèi)存泄漏問(wèn)題原理

評(píng)論