strtrns()函数转换字符串并将其复制到 结果。 旧的中出现的任何字符都将替换为中的字符 新的相同立场。返回新结果。 .........
此功能存在安全风险,因为它可能会溢出 newString缓冲区。如果currentString缓冲区大于 newString buffer,然后会发生溢出。
这是它的原型(或“签名”?“:
char * strtrns(const char *string, const char *old, const char *new, char *result);
我一直在谷歌上搜索无济于事。我感谢任何提示或建议。
答案 0 :(得分:3)
我认为你可以很快写出自己安全的。
它不会直接替代,因为签名略有不同,它将分配调用者必须释放的内存,但它可以主要用于同一工作。
(我也在更改参数名new
,它是C ++中的保留字,参数string
是C ++中非常常见的类型。
这些更改使该函数与C ++代码兼容)
char* alloc_strtrns(const char *srcstr, const char *oldtxt, const char *newtxt)
{
if (strlen(oldtxt) != strlen(newtxt))
{
return NULL; /* Old and New lengths MUST match */
}
char* result = strdup(srcstr); /* TODO: check for NULL */
/* Caller is responsible for freeing! */
return strtrns(srcstr, oldtxt, newtxt, result);
}
答案 1 :(得分:2)
声称此功能不安全是无稽之谈。在C中,只要你有一个接口指向缓冲区并用一些数据填充它,你必须在调用者和被调用者之间有一个关于缓冲区大小的契约。对于调用者无法预先知道被调用者将写入多少数据的某些函数,最合乎逻辑的接口设计(契约)是让调用者将缓冲区大小传递给被调用者并让被调用者返回错误或截断数据。缓冲区太小了。但是对于像strcpy
这样的函数或者在你的情况strtrns
中,输出字节数是输入字节数的一个简单函数(如标识函数),这对于契约来说非常有意义。简单来说,调用者提供的输出缓冲区必须至少与输入缓冲区一样大。
任何对接口合同严格遵守不满意的人都不应该写C.没有办法解决这个问题。添加复杂的边界检查接口当然不能解决问题,只是改变你必须遵循的合同的性质。
顺便说一下,strtrns
无论如何都不是标准功能,所以如果你更喜欢不同的合同,你可能最好还是编写自己的类似功能。这也会增加便携性。
答案 2 :(得分:1)
你在C中没有任何选项。你只需要确保目标缓冲区足够大。