2011-01-07 173 views
0

我正在使用PC-lint來分析我的代碼,這些線路正在產生一些錯誤。這讓我想知道我的編碼實踐是錯誤的嗎?這是不好的編碼習慣嗎?

char *start; 
char *end; 

// Extract the phone number 
start = (char*) (strchr(data, '\"') +1); 
end = (char*) strchr(start, '\"'); 
*end = 0; 
strlcpy((char*)Fp_smsSender, start , start-(end-1)); 

編輯: 你的幫助後,我現在有:

char *start; 
char *end; 

if (data != NULL) 
{ 
    // Extract the phone number 
    start = strchr(data, '\"'); 
    if (start != NULL) 
    { 
    ++start; 
    end = strchr(start, '\"'); 

    if (end != NULL) 
    { 
     *end = 0; 
     strlcpy((char*)Fp_smsSender, start , FP_MAX_PHONE); 
    } 
    } 

那如何看?

+4

和lint說什麼? – 2011-01-07 07:15:40

+3

危險威爾羅賓遜!考慮使用`gcc -Wall -Wextra -pedantic`並更正任何警告。 – EnabrenTane 2011-01-07 07:16:58

+0

不要從函數轉換返回值。如果你有這種功能的警告,你可能忘了包含相關的頭文件。 – 2011-01-07 08:32:35

回答

1

我想lint所抱怨的是strchr()可能會返回一個NULL指針,並且在執行指針運算並對其進行解引用之前,您並未檢查該指針。

你可能想要做這樣的事情:

char *start; 
char *end; 

// Extract the phone number 
start = strchr(data, '\"'); 
if (!start) handle_error(); 

++start; // skip the '\"' 
end = strchr(start, '\"'); 
if (!end) handle_error(); 

*end = 0; 
strlcpy((char*)Fp_smsSender, start, size_of_Fp_smsSender_buffer); 

注意,我改變了最後一個參數strlcpy()呼叫 - 即參數是什麼,是讓你不指定目標緩衝區的大小超過它。你傳遞的價值根本就沒有意義,而lint也可能會抱怨。你可能意思是end-(start-1),這可能更簡單地表述爲strlen(start)+1

無論如何,即使通過strlen(start)+1作爲strlcpy()的最後一個參數違反了參數的意圖,並且刪除了strlcpy()應該提供的安全。你也可以簡單地使用strcpy(Fp_smsSender,start) - 如果你不知道目標緩衝區有多大,你應該完全做到這一點(或者修復一些事情,以便知道緩衝區有多大)。這將更清楚代碼實際上在做什麼。

3

兩件事:首先你不處理NULL從strchr返回。

二(更嚴重的),你傳遞給strlcpy長度是錯誤的:你想end - start或類似的東西(你有反轉),但更根本的是,長度參數strlcpy應該是的大小目的地緩衝區,而不是源字符串。

相關問題