Clang-Tidy报strncmp比较长度过长警告的原因及参数交换疑问
关于strncmp与Clang-Tidy警告的疑问
我在遍历命令行参数时,用以下代码做匹配判断:
if (!strncmp(argv[i], "-f", 3)) {}
Clang-Tidy警告我传入的比较长度3过大,可能导致缓冲区溢出。但我认为这么处理是合理的:我需要精确匹配-f(对应字节序列['-','f','\0'],共3字节),而非-foo这类更长的参数,因此必须比较到终止符来确保参数长度一致。如果仅用2字节比较就不会触发警告,类似地,用5字节比较-pre时也会触发该警告。
我编写了示例代码复现该问题:
#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的两个参数后,警告会消失,但我不理解这一操作为何会改变代码逻辑——按理解,交换后的比较结果仅为原结果的负值。请问:
- 该警告产生的原因是什么?
- 交换参数能消除警告的原因又是什么?
内容的提问来源于stack exchange,提问作者ZwergofPhoenix
相关产品推荐
相关产品推荐

