cvp*_*cvp 5 c buffer-overflow strcmp strncmp
根据我的理解,strcmp()(没有'n'),在任一参数中看到空字符时,立即停止处理并返回结果.
因此,如果其中一个参数已被100%确定地知道为空终止(例如,它是一个字符串文字),那么使用strncmp()(带有'n')调用strlen()作为第三个的一部分没有任何安全性好处将比较限制为已知字符串长度的参数,因为strcmp()它将永远不会读取比已知终止字符串中更多的字符.
事实上,在我看来,调用strncmp()其长度参数是strlen()前两个参数中的一个是唯一的strcmp(),因为它通过评估strlen()表达式来浪费时间线性的已知终止字符串的大小.
考虑:
示例代码A:
if (strcmp(user_input, "status") == 0)
reply_with_status();
Run Code Online (Sandbox Code Playgroud)
示例代码B:
if (strncmp(user_input, "status", strlen("status")+1) == 0)
reply_with_status();
Run Code Online (Sandbox Code Playgroud)
前者对后者有什么好处?因为我在其他人的代码中看到了很多.
我对这些功能的工作原理有缺陷吗?
在您的特定示例中,我会说strncmp因为以下原因而使用它是有害的:
strlen无论如何,使用扫描"status"所有这些都会增加混乱,user_input如果它确实短于6个字符且包含与测试字符串相同的字符,则在任何情况下都不会溢出.
那将是例外.如果您知道输入字符串的内存总是超过测试字符串中的字符数,那么请不要担心.否则,您可能需要担心,或至少考虑它. strncmp对于测试大缓冲区内的东西很有用.
我更喜欢代码可读性.