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
相关产品推荐
相关产品推荐

