strncmp()Clang Tidy:比较长度过长,可能导致缓冲区溢出



我正在迭代我的命令行参数,并检查是否与匹配

if (!strncmp(argv[i], "-f", 3)) {}

Clang Tidy警告我,3的比较长度太大,可能会导致缓冲区溢出。根据我的理解,这应该很好,因为我正在将['-','f',''](即3个字节(与我得到的任何输入进行比较。我特别想只匹配-f,而不是像-foo这样的东西(应该是['-','f','o','o',''](,因此我认为有必要比较两个字符串是否以相同的长度终止(这是我在Uni中学习的方式(。只有2个字节的比较不会给出此警告,当比较5个(或分别为4个(字节时,另一个参数也是如此。在两个参数上都看到了这个警告,这让我相信问题出在字符串文字上,而不是传递的参数,它可能会更短,并以我可以理解的方式发出这个警告。以下示例应重现此行为:

#include <cstring>
int main(int argc, char** argv) {
for (int i = 1; i < argc; ++i) {
if (!strncmp(argv[i], "-f", 3)) {
}
if (!strncmp(argv[i], "-pre", 5)) {
}
}
}

交换strncmp()的参数确实修复了警告,但我不明白这是如何改变代码的逻辑的,因为结果应该只是原始代码的负值。有人能比我更了解这种行为是怎么发生的吗?我在strncmp手册页中找不到任何引用类似内容的内容。

strncmp的输入可能为null终止。因此,退出搜索的逻辑不能依赖于命中一个空字符,这意味着如果你告诉函数它比实际长度长,它可以在其中一个输入的末尾运行

最新更新