C++ wcslen或strlen应防止无限循环?

C++ wcslen或strlen应防止无限循环?,c++,string,string-length,C++,String,String Length,此函数用于计算从请求字符串到终止空字符之间的字符数 size_t wcslen(const wchar_t* sz) { size_t l = 0; while (*sz++) ++l; return l; } 现在,如果没有终止的空字符,这个函数应该检测到还是没有?他们是如何发现的?循环是否有限制,并且它实际上不是无限的?如果字符串没有空终止符,则行为未定义。你不知道你会得到什么。好吧,合同是你提供一个以NUL结尾的字符串。如果不这样做,则所有下注都将关闭,并且函数的

此函数用于计算从请求字符串到终止空字符之间的字符数

size_t wcslen(const wchar_t* sz)
{
    size_t l = 0;
    while (*sz++) ++l;
    return l;
}

现在,如果没有终止的空字符,这个函数应该检测到还是没有?他们是如何发现的?循环是否有限制,并且它实际上不是无限的?

如果字符串没有空终止符,则行为未定义。你不知道你会得到什么。

好吧,合同是你提供一个以NUL结尾的字符串。如果不这样做,则所有下注都将关闭,并且函数的行为未定义。

此函数在第一个0值处停止,如果sz参数末尾没有带0的wchar\t,它将在内存的其余部分继续,直到达到0值为止。

如果没有空终止符(虽然我很难想象内存空间充满了没有任何零的垃圾),但最终
sz
将溢出,之后您将尝试取消对NULL的引用,这将导致异常。

函数如何做到这一点?函数的定义 长度为“直到终止nul字符”。为“更安全” 函数的版本可能需要额外的最大长度, 这将对应于 数据被保留。但是nul终止字符串的使用是无效的 C语言中的通用,大多数情况下,如果你称之为 函数,这是因为调用你的函数只给了你一个 指针,而您不知道缓冲区的实际长度

实际上,如果输入没有终止nul 字符,则会出现缓冲区溢出,读取的内存超过 缓冲区的结尾。执行此操作时,迟早会 要么遇到包含0的字节,然后考虑 字符串的结尾,否则您将得到一个
未映射到您的进程,您将崩溃。

或直到(引用@Joker_vD)“最终sz将溢出,之后您将尝试取消对NULL的引用,这将导致异常”,不是吗?正如James Kanze所说:如果未达到0字节,则将达到一个未映射到进程的地址,并将在系统上崩溃。更有可能的情况是,您将在地址换行之前访问未映射的内存。(而且不能保证取消对空指针的引用会导致崩溃,或者递增最终会导致空指针。在较旧的INTEL上,他的函数很可能会导致无止境的循环。)