You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现的三字符串反转程序存在哪些潜在代码漏洞?

问题说明

正在完成课程编程作业,作业要求编写一个基础程序,接收三个用户输入的字符串并完成字符串反转操作,同时需要找出代码中存在的潜在漏洞。目前未排查出代码问题,需要相关提示与建议,程序实现代码如下:

#include <iostream>
#include <string>

using namespace std;

string reverse(string s) {
string result;
for (int i = 0; i < s.length(); ++i) {
result += s[s.length() - i - 1];
}
return result;
}

int main() {
string s;
cout << "Welcome to the String Reversal Program\n";
cout << "Enter First Word: ";
getline(cin, s);
cout << "Reverse of \"" << s << "\" is \"" << reverse(s) << "\"" << endl;

cout << "\nEnter Second Word: ";
getline(cin, s);
cout << "Reverse of \"" << s << "\" is \"" << reverse(s) << "\"" << endl;

cout << "\nEnter Third Word: ";
getline(cin, s);
cout << "Reverse of \"" << s << "\" is \"" << reverse(s) << "\"" << endl;
return 0;
}
代码潜在问题提示
  • 命名冲突风险:代码全局使用using namespace std;导入标准命名空间,同时自定义了名为reverse的函数。C++标准库<algorithm>中存在同名的std::reverse函数,一旦其他引入的头文件间接包含了<algorithm>的内容,会直接触发函数重定义、调用歧义的编译错误,甚至出现非预期的函数调用。建议将自定义反转函数重命名为如str_reverse这类不与标准库冲突的名称,日常编码也尽量避免全局导入整个标准命名空间。
  • 有符号/无符号类型隐式转换隐患:循环中使用int类型的计数器i和s.length()做比较,而s.length()的返回值是size_t类型(无符号整数)。如果输入的字符串长度超过当前环境下int可表示的最大值(如32位int环境下长度超过2147483647的超长字符串),计数器i会溢出为负数,和无符号值比较时会被隐式转换为极大的无符号正整数,最终导致字符串越界访问,触发未定义行为。建议将计数器类型改为size_t匹配字符串长度的返回类型。
  • 性能可优化点:自定义反转函数中,result字符串初始化时没有预分配和原字符串等长的内存空间,每次通过+=拼接字符时,可能多次触发内存重分配、旧数据拷贝操作,短字符串场景下无感知,但属于不必要的性能损耗。可以在初始化result时直接调用string result(s.length(), '\0');提前申请好对应长度的内存,再按下标填充反转后的字符即可。
  • 输入异常未做处理:代码全程没有校验getline的输入流状态,如果用户输入过程中触发流错误(比如输入时触发EOF、输入流被意外中断),后续的getline会直接读取到空内容,程序不会给出任何错误提示,鲁棒性不足。可以在每次读取输入后判断cin的流状态,出现异常时直接输出提示并终止程序即可。

内容的提问来源于stack exchange,提问作者Jace Clark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.16 16:15:41