封面问题+ C ++中的snprintf用法

时间:2012-02-01 12:07:44

标签: c++

修复以下覆盖率错误。这里我应该使用第二个参数大小 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(),   或者更正精确说明符。

2 个答案:

答案 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)在此处返回5snprintf自动减去一个,即它将其解释为“复制5-1=4个字符,并在第5个位置放置空终结符”。

结果是ch_1 = abcd