我正在重新创建整个标准 C 库,并且正在为strle
n 开发一个实现,我希望它成为我所有其他str
函数的基础。
我目前的实现如下:
int ft_strlen(char const *str)
{
int length;
length = 0;
while(str[length] != '\0' || str[length + 1] == '\0')
length++;
return length;
}
我的问题是,当我通过一个赞时str
:
char str[6] = "hi!";
正如预期的那样,内存读取:
['h']['i']['!']['\0']['\0']['\0']['\0']
如果您查看我的实现,您可以预期我会得到 6 的回报——而不是 3(我以前的方法),这样我就可以检查是否strlen
可能包括额外分配的内存。
这里要注意的是,我必须在初始化内存之外读取 1 个字节才能使最后一个循环条件在最终空终止符处失败——这是我想要的行为。然而,这通常被认为是不好的做法,并且有些自动错误。
即使您非常特别地打算读入垃圾值(以确保它不包含'\ 0'),在初始化值之外读取是否是一个坏主意?
如果是这样,为什么?
我明白那个:
"buffer overruns are a favorite avenue for attacking secure programs"
不过,如果我只是想确保我已经达到了初始化值的结尾,我还是看不到问题......
另外,我意识到这个问题是可以避免的——我已经回避了一个设置为 1 的值,然后只读取初始化值——这不是重点,这更多是关于 C、运行时行为和最佳实践的基本问题;)
[编辑:]
对上一篇文章的评论:
好的。很公平 - 但关于“在初始化值后读取是否总是一个坏主意(故意操纵或运行时稳定性的危险)”这个问题 - 你有答案吗?请阅读已接受的答案,以了解问题性质的示例。我真的不需要修复这段代码,也不需要更好地理解数据类型、POSIX 规范或通用标准。我的问题与为什么可能存在这样的标准有关 - 为什么永远不要读取过去的初始化内存(如果存在这样的原因)可能很重要?在 GENERAL 中读取过去的初始化值的潜在后果是什么?
请大家 - 我试图更好地了解系统如何运作的各个方面,我有一个非常具体的问题。