我正在维护一段C代码,其中char数组经常通过将它们传递给函数并将结果用作写入输出的字符串来填充.然而,在函数处理后,阵列上没有检查完成,我想知道最好的方法是什么?
一种方法是在返回后将数组中的最后一个元素设置为\ 0,但我怀疑可能有更好的元素.
void Unpack(char* inbuf, char* outbuf);
int main(int argc, char* argv[])
{
char* inData = "abc";
char outData[4];
char result[14];
Unpack(inData, outData);
outData[3] = '\0'; // Insert this to safeguard array before using as string.
_snprintf(result, sizeof(result), "blah %0s blah", outData);
printf(result);
return 0;
}
void Unpack(char* inbuf, char* outbuf) {
for(int index=0; index<3; index++) {
*outbuf++ = *inbuf++;
}
}
Run Code Online (Sandbox Code Playgroud)
你解决这个问题的方法有很多,但遗憾的是还有许多其他问题没有解决.
如果你担心输出数组中甚至可能没有有效的'\ 0'终止的C字符串,那么你通过强力插入'\ 0'来解决这个问题.此外,您已经选择了最佳位置,如果数组应该包含'\ 0'终止字符串,则数组的最后一个字节不能用于其他任何内容.
不幸的是,你没有做任何事情来阻止被调用的函数践踏内存超出你为它分配的数组.这是我担心的第一件事.
避免内存踩踏(又称缓冲区溢出)并不是火箭科学,但它确实需要纪律和一致性.通常,所涉及的基本思想是从不简单地传递要填充的某个存储器的地址,而是始终伴随该存储块的可用长度.当然,被叫代码必须遵守由此施加的限制.看起来你知道基本的想法,因为你提到了snprintf(),这是这种方法的经典例子.