[問題] 傳入函式的buffer長度判斷問題

作者: petercoin (彼得幣)   2016-03-22 10:09:13
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
None
問題(Question):
現在正在開發一個函式,
目的是要提供一個介面讓使用者傳送資料,
介面定義如下:
SendVendorCmd(short cmd, char *data, int dataLength)
我目前知道的是如果進來的資料是用malloc配置記憶體的話,
可以用_msize來查看大小,
如果是null-terminated的字串的話,
可以用strlen來查看大小,
但是不確定使用者會用哪種配置方式,
而且這筆資料也不一定會是null-terminated,
所以我加了一個dataLength的參數。
又考慮到假如使用者丟的dataLength大小超過實際上data的長度,
可能會產生問題,
所以想請教有辦法判斷使用者傳進來的data真正的長度嗎?
還是有其他更適合的參數宣告嗎?
餵入的資料(Input):
None
預期的正確結果(Expected Output):
None
錯誤結果(Wrong Output):
None
程式碼(Code):(請善用置底文網頁, 記得排版)
補充說明(Supplement):
作者: EdisonX (卡卡獸)   2016-03-24 10:01:00
硬體收發資料實際上是用 unsigned char 較佳。
作者: Caesar08 (Caesar)   2016-03-22 10:21:00
dataLength超過實際大小是使用者的問題吧,應該不用管
作者: Clangpp (Clang++)   2016-03-22 12:09:00
char *可以改用string就好了?? 這就不用擔心了??不然就是用vector<char>
作者: Caesar08 (Caesar)   2016-03-22 12:32:00
我猜他可能只能用C
作者: CaptainH (Cannon)   2016-03-22 14:08:00
應該只能這樣
作者: noodleT (麵T)   2016-03-23 07:11:00
你的data 會不會有0x00的資料?有的話就只能用datalength
作者: Clangpp (Clang++)   2016-03-23 09:55:00
有0x00的話喔 你還是用vector<byte>吧 為什麼一定要用char呢??然後建議你可以去看 effecitve STL有教你如何用vector跟C的API來接
作者: firejox (Tangent)   2016-03-24 23:06:00
要不然你就自己封裝一個資料結構 讓使用者用這個來傳
作者: noodleT (麵T)   2016-03-26 23:09:00
有一些標準函式也會要求使用者輸入資料長度,或像 printf他也是信賴你輸入的引數夠給 format 使用。看你是想採取怎樣的設計你的 data 有固定格式嗎?例如結尾固定是兩個0x00,0x00?這樣的話就可以自己去掃陣列獲得長度。題外話,你的引數 char *data 建議改成 const char *data
作者: Clangpp (Clang++)   2016-03-27 22:17:00
加const 是為了保護你傳進來的資料不會被變動
作者: noodleT (麵T)   2016-03-27 23:22:00
const 也是讓使用者能夠信賴你不會去改我的值

Links booklink

Contact Us: admin [ a t ] ucptt.com