2017-05-26 101 views
0

我用sonar.cxx插件在SonarCube的嵌入式C代碼上運行代碼分析。此函數不能正確處理非NULL終止的字符串

我也解析與sonarcube與Rough Auditing Tool for Security (RATS)生成的XML和我得到這個錯誤:

This function does not properly handle non-NULL terminated strings. This does not result in exploitable code, but can lead to access violations.

這是產生上述錯誤代碼:

if((machineMarket == NULL) || (strlen(machineMarket) > VALUE_MARKET_MAX_LEN)) 

這對最佳實踐處理非NULL終止的字符串?

+0

使用'strnlen()'而不是'strlen()'?儘管我發現很難相信如果有辦法根本就不會得到非NULL終止的字符串,那麼這將徹底解決問題。 –

+1

爲了迂迴,一個非空終止的'char'數組不是空字符串。對於更多的步驟,請注意'NULL'是空指針宏,而空終止符是'\ 0',有時被稱爲'NUL'。 –

+1

@MichaelBurr在給定的最大長度超過可讀內存的情況下,仍然會導致訪問衝突。所以我真的沒有辦法以任何方式避免這種情況,除非正確地終止字符串。但也許它會使安全審計工具 –

回答

1

審計工具警告,致電strlen將保持讀取字節,直到找到零字節。如果machineMarket的內容不包含零,那麼strlen可能會在法律記憶結束時繼續閱讀並導致訪問衝突。

你說你是宣佈類似這樣的
char machineMarket[VALUE_MARKET_MAX_LEN + 1];
變量所以,你既可以使用strnlen功能,保證你從來不看太遠,或使用在最後強行插入0 @Zan山貓的方法。

無論使用哪種方法,您都可能需要處理原始字符串爲/未被終止的情況。

0

如果您擁有的從machineMarket開始的連續內存塊沒有\0那麼您的代碼的行爲未定義。

改爲使用strnlen,將訂單VALUE_MARKET_MAX_LEN的某些作爲參數,然後重構您的>

1

我處理它的方式是每當我從模塊外部獲取一個字符串,從網絡讀取或調用到我的庫中時,我在其末尾設置一個0。現在,無論如何,這是一個有效的C字符串。

所以,如果我的庫函數接受int func(char *output, size_t output_len)然後擺在最前頭之前,我使用它的任何東西我總是if(!output || !output_len) return;驗證,然後output[output_len-1] = 0;

那麼即使他們通過我完全是垃圾,它至少是一個有效的字符串。