修复以下覆盖率错误。这里我应该使用第二个参数大小 sizeof(empID)-1或sizeof(empID)?我应该减1来删除空字符吗? 例如:
char empID[8] ;
snprintf(empID,sizeof(empID)-1, "S%05d", (char)pManager -> GetEmpID( groupID, levelID ) ) ;
Coverity输出:
调用有风险的功能(SECURE_CODING)[非常危险]。使用“sprintf” 错误地导致缓冲区溢出。因为sprintf() 假设一个任意长的字符串,来电者必须小心不要 溢出目的地的实际空间。改用snprintf(), 或者更正精确说明符。
答案 0 :(得分:1)
函数 snprintf ()和 vsnprintf ()最多写入 size 字节(包括终止空字节('\ 0')) )到 str 。
http://linux.die.net/man/3/snprintf
所以不需要减去1,大小已经包含空终止符。
答案 1 :(得分:1)
不要认为你必须减去1.我只是用这个
进行测试 void main(){
char ch_1[5];
strcpy(ch_1, "1234");
snprintf(ch_1, sizeof(ch_1), "abcdefg");
printf("ch_1=%s\n", ch_1);
}
sizeof(ch_1)
在此处返回5
。 snprintf
自动减去一个,即它将其解释为“复制5-1=4
个字符,并在第5个位置放置空终结符”。
结果是ch_1 = abcd