Lyz09 @ 2025-10-23 16:41:17
使用 cin 读入一个 int 类型的变量,但输入数据实际在 long long 范围内会导致这个变量定义位置的下一个变量被篡改。
这是一个合理的行为/UB 吗?
by GWBailang @ 2025-10-23 16:45:39
属于未定义行为
by gdz0214_and_zxb0214 @ 2025-10-23 16:46:05
问了下豆包,回答是:
根据 C++ 标准,若输入的数值无法用目标整数类型(如int)表示,将设置流的failbit,且目标变量的值未定义。
不保证对。
by Lyz09 @ 2025-10-23 16:48:04
补充:定义的下一个变量是紧接着这个变量读入的
by ARIS1_25 @ 2025-10-23 16:50:06
@Lyz09
那就是缓冲区污染咯
by Zhangxm2012 @ 2025-10-23 16:51:57
@Lyz09好像真是,本地跑出来是0
by LuoFeng_Nanami @ 2025-10-23 17:00:30
:::info[提示]{open} 本文由豆包 AI 深度研究生成。 :::
在 C++ 编程实践中,当使用cin读取一个int类型变量时,如果输入数据实际在long long范围内,可能导致该变量定义位置的下一个变量被篡改。这种现象的出现并非偶然,而是涉及到 C++ 语言规范、内存管理机制以及编译器实现等多个层面的复杂问题。本研究将从技术原理、标准规范、实际表现和防护策略等维度,深入剖析这一现象的本质,并为安全的 C++ 编程提供指导。
要理解为何输入溢出会导致变量篡改,首先需要明确不同数据类型的内存占用情况。在现代 C++ 实现中,int类型通常占用 4 个字节,而 **long long类型占用 8 个字节 **(56)。这种内存占用的差异是问题产生的根本原因。
具体而言,在 32 位平台下,int型和long型都是占用 4 个字节,而long long是 8 个字节;在 64 位平台下,int型占用 4 个字节,而long和long long都是占用 8 个字节(56)。这种跨平台的一致性为我们理解问题提供了基础。
C++ 程序在执行时,将内存划分为四个主要区域:全局区、栈区、堆区和代码区(43)。其中,栈区由编译器自动分配释放,存放函数的参数值、局部变量等(43)。栈的内存分配方向是从高地址向低地址,变量的声明顺序决定了它们的内存地址 —— 先声明的变量分配到更高的地址,后声明的变量分配到更低的地址。
考虑以下简单的代码示例:
int a;
int b;
int c;
在栈中,这些变量会依次从高地址向低地址排列:
a作为第一个声明的变量,分配在栈的最顶部(最高地址)
接着声明的b会分配在比a略低的地址
最后声明的c分配在栈中最底部(最低地址)
这种内存布局为后续的溢出问题埋下了隐患。
当使用cin读取一个int类型变量时,如果输入的数据超出了int的表示范围(例如在 32 位系统中超过 2147483647 或小于 - 2147483648),会发生什么?
根据 C++ 标准,有符号整数溢出是未定义行为(3)。具体到输入操作,当给有符号类型(如int)赋超出范围的值时,结果是未定义的,可能产生垃圾数据或崩溃(22)。更严重的是,当输入数据与变量类型不匹配时(如向int输入字母),会触发failbit,后续输入被阻塞(109)。
关键的问题在于,当输入数据的长度超过目标变量的内存大小时,多余的数据会覆盖相邻的内存空间。由于栈是向下增长的,后面声明的变量(地址较低)会被先覆盖。这就是为什么输入溢出会导致下一个变量被篡改的根本原因。
让我们通过一个具体的例子来理解这种现象。考虑以下代码:
\#include \<iostream>
int main() {
  int num1;
  int num2;
  int num3;
   
  std::cout << "请输入一个整数:";
  std::cin >> num1;
   
  std::cout << "num1 = " << num1 << std::endl;
  std::cout << "num2 = " << num2 << std::endl;
  std::cout << "num3 = " << num3 << std::endl;
   
  return 0;
}
如果我们输入一个非常大的数(例如 9223372036854775807,这是long long的最大值),会发生什么?在实际运行中,我们可能观察到:
num1的值被截断为某个不确定的值
num2的值被篡改为输入数据的一部分
num3的值也可能受到影响
这种现象的本质是栈缓冲区溢出—— 当写入缓冲区的内容超过其容量时,会占用其他变量的空间。在这个例子中,输入的 8 字节数据无法完全存储在 4 字节的num1中,多余的 4 字节会覆盖栈中紧邻的下一个变量num2。
根据 C++ 标准,未定义行为是指语言标准未做规定的行为,无法预估运行时会发生什么,可能出现正常执行、崩溃或产生错误结果等不可预测的情况。常见的未定义行为包括数据竞争、数组越界访问、有符号整数溢出、空指针解引用等(3)。
具体到我们的问题,C++17 标准第 8 节表达式([expr])第 4 段明确规定:如果在表达式求值过程中,结果在数学上未定义或不在其类型的可表示值范围内,则行为未定义。这一条款直接适用于cin读取超出int范围的数据的情况。
istream输入操作符的规范istream类重载了抽取操作符>>,能够识别基本数据类型,包括int类型,其声明为istream & operator>> (int &),参数和返回值都是引用(13)。然而,标准并未对输入溢出时的具体行为进行详细定义。
更值得注意的是,cin作为 C++ 类型对象,其类型是basic_istream,它重载了>>运算符使输入更简单。然而,cin并不能完全避免内存溢出问题(111)。这与一些开发者的直觉相反,说明我们需要更深入地理解输入机制。
C++ 标准对数值类型转换有明确规定:如果值可以由新类型表示,则保持不变;否则,如果新类型是无符号的,通过反复加减最大值加一来转换;如果新类型是有符号的且无法表示,则行为未定义(97)。
这意味着,当我们将一个long long范围内的数转换为int时,如果该数超出了int的范围,结果是未定义的。编译器可以选择任何方式处理,包括截断、饱和或其他行为。
C++ 标准虽然定义了未定义行为,但并未规定具体的实现方式。这给编译器厂商留下了巨大的自由空间。例如,当cin读取溢出数据时,不同的实现可能有不同的处理方式:
某些实现可能简单地截断高位
某些实现可能设置错误标志并停止输入
某些实现可能产生不可预测的内存访问
这种实现的多样性正是问题复杂性的根源。
不同编译器对输入溢出的处理存在显著差异,这直接影响了程序的行为。GCC 和 Clang 能够诊断INT_MAX + 1和-INT_MIN具有未定义行为,而 MSVC 只能诊断INT_MAX + 1。这种诊断能力的差异反映了各编译器对标准的不同理解和实现。
更有趣的是,MSVC 实际上拒绝编译-UINT_MAX,但 GCC 和 Clang 允许它。这种差异不仅体现在编译期诊断上,也体现在运行时行为上。
在整数溢出的默认处理方式上,GCC 的 g++ 编译器采用截断方式(80)。而对于无符号整数,当发生溢出时,编译器默认处理为截断,即舍弃高位的溢出部分(80)。
编译器优化对溢出行为有重要影响。在优化模式下,编译器可能做出激进的假设。例如,考虑以下代码:
int foo(int x) {
  return x + 1 > x;
}
在启用优化的情况下,编译器可能将其编译为直接返回 1,因为它假设x + 1 > x总是成立(忽略了溢出的可能性)。这种优化基于 **"程序中不存在未定义行为"** 的假设,一旦出现溢出,结果将是不可预测的。
现代编译器提供了多种运行时检查机制来检测溢出:
-ftrapv选项(GCC):强制触发运行时陷阱,当有符号整数溢出时程序会终止(83)
/d2UndefIntOverflow选项(MSVC):使有符号整数溢出行为定义明确
-fsanitize=signed-integer-overflow(UBsan):提供更高效的代码、更好的覆盖率和更大的灵活性
这些选项的存在说明,编译器厂商意识到了溢出问题的严重性,并提供了相应的防护措施。
在不同平台上,输入溢出的表现可能不同。例如,在 Turbo C 编译器中,整形数据占用 2 个字节,当超出表达上限时,编译器会截断高位,将低位赋给变量。而在 Visual C++ 中,整数占用 4 个字节,同样的输入可能不会产生溢出(78)。
这种平台差异提醒我们,在编写跨平台代码时必须格外小心,不能依赖特定平台的行为。
理解栈帧结构对于分析溢出机制至关重要。在 x86_64 架构下,栈帧的典型布局如下(63):
+---------------------+
\| 参数传递区 | ← 高地址
+---------------------+
\| 返回地址 (RIP) |
+---------------------+
\| 旧栈基址 (RBP) |
+---------------------+
\| 局部变量区 |
\| - 缓冲区 |
\| - 其他局部变量 |
+---------------------+ ← 当前 RSP(栈指针)
在这个结构中,局部变量位于栈帧底部(低地址方向)。当我们声明多个变量时,它们在栈中的顺序直接影响了溢出的影响范围。
内存对齐对溢出行为有重要影响。数据结构(尤其是栈)应该尽可能在自然边界上对齐,因为访问未对齐的内存需要处理器进行两次访问,而对齐的内存访问仅需一次(61)。
编译器会自动添加填充字节以确保变量尺寸与栈尺寸对齐。例如,如果一个 12 字节的数组在 16 字节对齐的栈上分配,编译器会添加 4 字节填充(70)。这些填充字节可能成为溢出路径中的 "跳板",一个仅溢出几个字节的漏洞可能先破坏填充区,再逐步侵蚀关键数据。
当输入溢出发生时,数据会按照以下路径传播:
初始溢出:输入数据超出目标变量的容量
直接覆盖:溢出的数据覆盖紧邻的低地址内存
级联效应:如果溢出足够大,会继续覆盖更多变量
控制流破坏:当溢出覆盖到返回地址或函数指针时,可能导致程序执行路径改变
一个具体的栈溢出示例显示,当char buffer[32]溢出时,会越界波及干扰到ret、type、id等int类型变量,这些变量均为 4 字节。溢出后的值通常是写入缓冲区越界后的数据,例如id溢出后的值可能是0x646c726f(对应字符 "orld")。
使用调试工具可以直观地观察溢出过程。GDB 提供了丰富的内存查看命令,例如:
x/10x $sp:查看栈内存内容(sp是栈指针寄存器)(84)
backtrace:显示从当前执行点到main的所有栈帧
通过调试,我们可以观察到:
输入前各变量的初始值
输入时内存的变化过程
溢出后变量值的改变
这种可视化的方式有助于我们理解溢出的具体机制。
一个真实的案例展示了cin溢出导致变量出现奇怪值的现象。在这个案例中,当cin读取溢出数据时,第一个变量被赋予最近的值,而后续变量(如nrows和ncols)处于未定义状态,其中ncols被赋值为 32767(短整型的最大值)。
问题的根本原因是:由于值溢出,第一个溢出设置了故障位,随后的读数不执行,后续变量处于未定义状态。如果这些变量未被初始化,它们的值就是不确定的。
另一个常见的现象是输入无效数据(如字符)时,变量被赋予特定的错误值。例如,输入字母时,变量可能被赋予-858993460,同时触发failbit(cin.fail()=1)(121)。
这个特定的值-858993460实际上是未初始化内存的常见表现,它对应于 0xCCCCCCCC(在某些调试堆实现中表示未初始化的内存)。
一个更复杂的案例展示了连续cin调用导致的溢出问题。在这个例子中,第一个cin读取的数据溢出会影响后续cin读取的变量(123)。具体表现为:
第一个cin读取a(char[10])
第二个cin读取b(char[20])
如果第一个输入过长,会覆盖b的内存空间
这种现象的本质是栈上变量的连续存储,溢出的数据会按照内存地址顺序覆盖后续变量。
通过内存转储分析,我们可以看到溢出后的数据模式。例如,在一个栈溢出示例中,内存转储显示:
0x000000000022FE20: 68 65 6c 6c 6f 77 6f 72 6c 64 20 74 79 70 65 3a helloworld type:
0x000000000022FE30: 20 31 30 20 69 64 3a 20 30 20 68 65 6c 6c 6f 77 10 id: 0 hellow
0x000000000022FE40: 70 72 6c 64 21 74 79 70 7f 3a 20 31 32 20 69 64 prld!typ.: 12 id
0x000000000022FE50: 3a 20 31 20 00 00 00 00 c7 13 40 00 : 1 ......@.
观察发现:
id(地址 0x22FE40)的值为0x646c726f(对应字符 "orld")
type(地址 0x22FE44)的值为0x70797420(对应字符 "ytp")
ret(地址 0x22FE48)的值为0x31203a7f
这些值正是溢出的字符串 "helloworld type: 10 id: 0 helloworld type: 12 id: 1" 的部分内容。
永远不要信任外部输入,这是安全编程的第一原则。对所有用户输入进行验证和过滤,包括命令行参数、环境变量、文件和网络输入等(125)。
具体的验证策略包括(127):
类型检查:验证输入匹配期望的数据类型(整数、字符串等)
范围验证:确保输入落在可接受的范围内(如 0-100)
格式验证:检查输入匹配特定模式(如邮箱、电话号码)
在 C++ 中,可以使用std::cin.fail()检查输入是否失败,使用std::cin.ignore()忽略非法输入,使用std::cin.clear()清除输入缓冲区中的错误标志(130)。
避免溢出的最直接方法是使用足够大的数据类型。如果输入可能在long long范围内,直接使用long long类型,而不是int。
建议的类型选择策略:
对于计数和索引,使用size_t(无符号类型,适合非负计数)
对于可能为负的大整数,使用long long
对于货币等需要精确计算的场景,考虑使用定点数或专用的数值库
一个安全的输入验证循环应该包括以下要素(126):
int get\_user\_input() {
  int input;
  while (true) {
  std::cin >> input;
  if (std::cin.fail()) {
  // 处理输入失败
  std::cin.clear(); // 清除错误标志
  std::cin.ignore(std::numeric\_limits\<std::streamsize>::max(), '\n'); // 忽略剩余输入
  std::cout << "输入无效,请重新输入:";
  } else if (input < 0) {
  // 处理负数输入
  std::cout << "输入不能为负数,请重新输入:";
  } else {
  return input;
  }
  }
}
这个模式的关键是:
使用cin.fail()检测输入错误
使用cin.clear()重置错误状态
使用cin.ignore()清除缓冲区中的无效输入
进行范围检查
预防缓冲区溢出需要多方面的措施(136):
char input\[10];
std::cin.getline(input, sizeof(input)); // 读取不超过9个字符(加上空终止符)
使用strncpy代替strcpy
使用snprintf代替sprintf
确保目标缓冲区以\0结尾
使用std::string代替char[]
使用std::vector代替动态数组
使用std::array代替固定大小数组(支持边界检查)
在写入缓冲区前检查数组边界
使用at()方法进行边界检查(会抛出异常)
现代编译器提供了多种安全选项来帮助检测和防止溢出:
-fstack-protector:插入栈保护代码
-fstack-protector-all:对所有函数启用保护
-fstack-protector-strong:对易受攻击的函数启用保护
内置的地址安全检查器(AddressSanitizer)
整数溢出检测
/GS:启用缓冲区安全检查
/guard:cf:启用控制流防护(Control Flow Guard)
除了编译期保护,运行时防护也很重要:
数据执行预防(DEP):使栈不可执行
地址空间布局随机化(ASLR):随机化内存地址
栈金丝雀(Stack Canary):检测栈溢出
try {
  // 可能溢出的操作
} catch (std::out\_of\_range& e) {
  // 处理越界错误
} catch (std::overflow\_error& e) {
  // 处理溢出错误
}
struct InputError : public std::exception {
  const char\* what() const noexcept override {
  return "输入超出范围";
  }
};
int safe\_stoi(const std::string& s) {
  try {
  return std::stoi(s);
  } catch (const std::out\_of\_range&) {
  throw InputError();
  }
}
基于以上分析,我们可以总结出以下最佳实践:
使用足够大的数据类型存储输入
优先使用无符号类型进行计数
避免使用int存储可能很大的值
总是验证输入的有效性
进行范围和格式检查
清理无效输入
使用标准库容器自动管理内存
避免手动内存操作
进行边界检查
启用编译器安全选项
使用静态分析工具
使用调试器检测问题
保持代码简洁
避免复杂的内存操作
编写清晰的错误处理代码
虽然本文重点讨论了int到long long的溢出,但类似的问题存在于所有数值类型:
当输入超出float或double范围时
可能导致正无穷或负无穷
需要使用std::numeric_limits进行范围检查
当输入字符串超出数组长度时
可能覆盖栈上的其他变量
使用getline和std::string避免
当输入数据与自定义类型不匹配时
需要重载>>操作符并实现验证逻辑
缓冲区溢出不仅是技术问题,更是严重的安全漏洞。历史上许多重大安全事件都与缓冲区溢出有关。攻击者可以利用溢出:
执行任意代码:通过覆盖返回地址,跳转到攻击者提供的代码
修改关键数据:如密码、权限等
造成拒绝服务:通过破坏程序结构导致崩溃
现代防护技术包括:
控制流防护(CFG)
地址空间布局随机化(ASLR)
数据执行预防(DEP)
结构化异常处理覆盖保护(SEHOP)
C++ 标准的演进带来了更多安全特性:
std::optional:避免未初始化变量
std::variant:类型安全的联合
范围for循环:避免越界访问
std::span:安全的数组视图
这些特性都有助于减少常见的编程错误。
除了运行时防护,静态分析工具也能帮助发现潜在问题:
Clang Static Analyzer
Coverity
PVS-Studio
Valgrind(Linux)
AddressSanitizer(GCC/Clang)
内存诊断工具(Visual Studio)
使用随机输入测试程序
发现未处理的边界情况
通过深入研究,我们可以明确地回答最初的问题:当使用cin读取超出int范围的数据导致下一个变量被篡改时,这是典型的未定义行为,而非合理行为。
这种现象的本质是栈缓冲区溢出,涉及多个技术层面:
C++ 标准将有符号整数溢出定义为未定义行为
不同数据类型的内存占用差异是问题根源
栈的向下增长特性使溢出数据覆盖后续变量
编译器实现的差异导致行为的不可预测性
为了编写安全可靠的 C++ 代码,我们必须:
永远不要信任外部输入,进行严格的验证
使用合适的数据类型,避免溢出的可能性
遵循安全的编程实践,如使用标准库容器
启用编译器安全选项,利用现代防护技术
使用静态分析和动态检测工具发现问题
在实际开发中,我们应该将安全性视为首要考虑因素。虽然 C++ 的灵活性为我们提供了强大的能力,但这种灵活性也带来了责任。只有深入理解语言机制,严格遵循安全规范,才能编写出既高效又安全的代码。
最后,我们必须认识到,未定义行为是 C++ 程序中最危险的 "定时炸弹"。它们可能在开发环境中表现正常,但在生产环境中造成灾难性后果。因此,避免未定义行为应该成为每个 C++ 程序员的基本准则。
参考资料
[1] 输入/赋值超int上限但未超同类型的u_int上限,两者是否一致?如果有区别,区别是?_C++无符号整数溢出规则_ - CSDN文库 https://wenku.csdn.net/answer/74f0fg77q1
[2] Document:\nAuthor:P1998R0\nRya(pdf) https://www.open-std.org/JTC1/sc22/WG21/docs/papers/2019/p1998r0.pdf
[3] Undefined behavior https://www.docs4dev.com/docs/en/cpp/latest/language/ub.html
[4] Understanding Integer Overflow in C/C++1(pdf) http://www.cs.utah.edu/\~regehr/papers/tosem15.pdf
[5] WG 14, N2428Towards Integer Sa(pdf) https://open-std.org/JTC1/sc22/wg14/www/docs/n2428.pdf
[6] c++输入runtime - CSDN文库 https://wenku.csdn.net/answer/fokpb0j6ts
[7] c++ 未定义行为 - CSDN文库 https://wenku.csdn.net/answer/3ad4avf3bb
[8] C++未定义行为 - wenli7363 - 博客园 https://www.cnblogs.com/jye159X/p/18132536
[9] c++ 文件读写_c++写入和读取字节流-CSDN博客 https://blog.csdn.net/Anurmy/article/details/111396878
[10] cin输入的缓冲区 - CSDN文库 https://wenku.csdn.net/answer/22wd3pn2j6
[11] 在c++编程中输入时出错。 - 腾讯云开发者社区 - 腾讯云 https://cloud.tencent.cn/developer/information/%E5%9C%A8c++%E7%BC%96%E7%A8%8B%E4%B8%AD%E8%BE%93%E5%85%A5%E6%97%B6%E5%87%BA%E9%94%99%E3%80%82-article
[12] C 风格文件输入/输出---有格式输入/输出--(std::scanf, std::fscanf, std::sscanf)-CSDN博客 https://blog.csdn.net/qq_40788199/article/details/132795424
[13] istream类方法 重载的抽取操作符 和 cin输入_istream载入char*-CSDN博客 https://blog.csdn.net/typecool/article/details/5862607
[14] C Istream Operator Decoding th(pdf) https://globaldatabase.ecpat.org/files/textbook-solutions/Citations/N0C7/filedownload.ashx/C-Istream-Operator.pdf
[15] [gcc/devel/c++-coroutines] libstdc++: Adjust overflow prevention to operator>> https://gcc.gnu.org/pipermail/libstdc++-cvs/2020q3/032955.html
[16] [committed] libstdc++: Replace operator>>(istream&, char*) [LWG 2499] https://gcc.gnu.org/pipermail/libstdc++/2020-August/050707.html
[17] 《 C++ 点滴漫谈: 二十七 》告别低效!C++ 输入输出操作你真的会用吗?_c++格式化输出-CSDN博客 https://blog.csdn.net/mmlhbjk/article/details/145677121
[18] istream::gcount() can overflow https://wg21.cmeerw.net/lwg/issue3464
[19] Streams
IO Streams
Executing
P(pdf) https://cse.msu.edu/\~cse232/us22/slides/cse232_streams.pdf
[20] Fixing operator>>(basic_istream&, CharT*) (LWG 2499) https://isocpp.org/files/papers/p0487r0.html
[21] [gcc(refs/users/guojiufu/heads/personal-branch)] libstdc++: Do not set eofbit eagerly in operator>>(istream&, char(&)[N]) https://gcc.gnu.org/pipermail/libstdc++-cvs/2020q3/033096.html
[22] 输入/赋值超int上限但未超同类型的u_int上限,两者是否一致?如果有区别,区别是?_C++无符号整数溢出规则_ - CSDN文库 https://wenku.csdn.net/answer/74f0fg77q1
[23] Reduce undefined behavior of signed integer literal arithmetic operations https://lists.isocpp.org/std-proposals/att-6440/attachment
[24] Arithmetic Expressions Can Yield Incorrect Results https://www.boost.io/doc/libs/1_69_0/libs/safe_numerics/doc/html/tutorial/1.html
[25] integral overflow and integral conversions https://gcc.gnu.org/legacy-ml/gcc/2010-11/msg00153.html
[26] numeric_cast https://www.boost.io/doc/libs/1_76_0/libs/numeric/conversion/doc/html/boost_numericconversion/improved_numeric_cast__.html
[27] CTR55-CPP. Do not use an additive operator on an iterator if the result would overflow https://wiki.sei.cmu.edu/confluence/display/cplusplus/CTR55-CPP.+Do+not+use+an+additive+operator+on+an+iterator+if+the+result+would+overflow
[28] Tell Programmers About Signed Integer Overflow Behavior(pdf) https://isocpp.org/files/papers/p1407r1.pdf
[29] Iterator Difference Type and Integer Overflow(pdf) https://rap.no/JTC1/SC22/WG21/docs/papers/2019/p1522r0.pdf
[30] [Bug c/108128] New: missing -Wshift-overflow warning https://gcc.gnu.org/pipermail/gcc-bugs/2022-December/806661.html
[31] cin不明确 - CSDN文库 https://wenku.csdn.net/answer/7cfwore6r9
[32] How to control user input robustly in C https://labex.io/tutorials/c-how-to-control-user-input-robustly-in-c-431249
[33] 7.11. Arrays And Security https://icarus.cs.weber.edu/\~dab/cs1410/textbook/7.Arrays/security.html
[34] Handling Unexpected Input in C Programming https://moldstud.com/articles/p-handling-unexpected-input-in-c-programming
[35] INTREPAIR: Informed Fixing of Integer Overflows(pdf) https://arxiv.org/pdf/1807.05092v1
[36] 使用C++ std::cin时溢出错误,变量内有奇怪的值(C++11)-腾讯云开发者社区-腾讯云 https://cloud.tencent.com/developer/ask/sof/107863470/answer/118266441
[37] -858993460,内存溢出,内存泄露 https://bbs.csdn.net/topics/390718008
[38] cin 到不同变量后变量意外变为0 https://m.jb51.cc/faq/1942829.html
[39] cin记忆安全-腾讯云开发者社区-腾讯云 https://cloud.tencent.com/developer/ask/sof/108548076
[40] 什么是缓冲区溢出漏洞?缓冲区溢出漏洞是一种常见的安全漏洞,发生在程序尝试向预分配内存空间填充数据时,超出其预定大小,进而 - 掘金 https://juejin.cn/post/7431743236535009330
[41] c++异常 超长字符串 读取 输入流 溢出 _c++怎么防止cin输入溢出-CSDN博客 https://blog.csdn.net/z3134908478/article/details/145528078
[42] 在c++中读取字符串时内存覆盖 - 腾讯云开发者社区 - 腾讯云 https://cloud.tencent.cn/developer/information/%E5%9C%A8c++%E4%B8%AD%E8%AF%BB%E5%8F%96%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%97%B6%E5%86%85%E5%AD%98%E8%A6%86%E7%9B%96
[43] C++第二周笔记-CSDN博客 https://blog.csdn.net/CYQ_CHO/article/details/135178956
[44] Homework 2: Stack Diagrams and Debugging (100 pts, due Wednesday, February 4th) http://www.cis.upenn.edu/\~cis1900/spring2015/hw/hw2.html
[45] Stack and Heap Memory https://courses.grainger.illinois.edu/cs225/sp2024/resources/stack-heap/
[46] Dynamic Memory Management\nDyn(pdf) https://cppreference.db.in.tum.de/teaching/ss21/c++praktikum/slides/lecture-05.pdf
[47] 4.6. Memory Management: The Stack And The Heap https://icarus.cs.weber.edu/\~dab/cs1410/textbook/4.Pointers/memory.html
[48] 深入探索C/C++程序的内存世界:从代码区到堆栈_wx60dad723a4281的技术博客_51CTO博客 https://blog.51cto.com/u_15288375/14009706
[49] 【C++】深入理解字符变量取地址的特殊性与内存管理机制详解_c++ char 取地址符-CSDN博客 https://blog.csdn.net/2201_75539691/article/details/144232823
[50] 解密程序的内存基石:C/C++栈的生长方向与内存布局_wx60dad723a4281的技术博客_51CTO博客 https://blog.51cto.com/u_15288375/14092519
[51] C++内存管理:栈与堆的深度解析-CSDN博客 https://blog.csdn.net/2401_82978699/article/details/152324762
[52] C++语法深度剖析与面试核心详解 - 面包板社区 https://mbb.eet-china.com/tech/t9/181876.html
[53] C++ 栈帧与局部变量的管理全解析:从内存布局到性能优化的实战要点-猿码集 https://www.yingnd.com/c/265063.html
[54] C/C++内存分布_c++的内存分布-CSDN博客 https://blog.csdn.net/2302_80871796/article/details/149982421
[55] C/C++语言堆栈工作机制-电子工程专辑 https://www.eet-china.com/mp/a234356.html
[56] int、long、long int、long long、uint64_t字节长度-CSDN博客 https://blog.csdn.net/u012351051/article/details/122031100
[57] What is long long in C/C++? https://www.tutorialspoint.com.cach3.com/what-is-long-long-in-c-cplusplus.html
[58] Memory Consumption in long long vs int? https://discuss.codechef.com/t/memory-consumption-in-long-long-vs-int/76522
[59] Size of 'long integer' data type (C++) on various architectures and OS https://www.intel.cn/content/www/cn/zh/developer/articles/technical/size-of-long-integer-type-on-different-architecture-and-os.html
[60] Difference between Long int and Long Long int in CPP or C https://discuss.codechef.com/t/difference-between-long-int-and-long-long-int-in-cpp-or-c/69799
[61] 开发日记:结构体内存不对齐引发的数据覆盖、栈溢出的原理(魔数)_结构体大小不对导致的踩内存-CSDN博客 https://blog.csdn.net/2301_77112634/article/details/149749388
[62] Memory Tagging:how it improves(pdf) https://llvm.org/devmtg/2018-10/slides/Serebryany-Stepanov-Tsyrklevich-Memory-Tagging-Slides-LLVM-2018.pdf
[63] 内存管理生死线:堆栈溢出检测、SRAM布局规划与调试技巧全公开 - CSDN文库 https://wenku.csdn.net/column/58rmpig98b
[64] Exploiting stack-based buffer overflow using modern-day techniques(pdf) https://www.dbjournal.ro/archive/31/31_14.pdf
[65] 内存管理难题破解:堆栈溢出检测与静态分配优化的7种实战策略 https://wenku.csdn.net/column/7hwrmwvu18
[66] C/C++ 基础栈溢出及保护机制-CSDN博客 https://blog.csdn.net/weixin_41055260/article/details/110459355
[67] 内存使用深度剖析:栈溢出检测3大手段+动态分配效率提升80%的优化策略 - CSDN文库 https://wenku.csdn.net/column/2fmwtr5t97
[68] 全面介绍windows内存管理机制及c++内存分配实例(六):堆栈 https://blog.csdn.net/swartz_lubel/article/details/73879079
[69] 一个栈溢出C++示例_c 栈溢出 示例-CSDN博客 https://blog.csdn.net/subfate/article/details/125134597
[70] Buffer Overflows 缓冲区溢出 - 羽弥YUMI - 博客园 https://www.cnblogs.com/yumi0721/p/19150887
[71] [gcc/devel/c++-modules] libstdc++: Avoid overflow in istream::get(streambuf&) [LWG 3464] https://gcc.gnu.org/pipermail/libstdc++-cvs/2020q3/032670.html
[72] [committed] libstdc++: Replace operator>>(istream&, char*) [LWG 2499] https://gcc.gnu.org/pipermail/gcc-patches/2020-August/551451.html
[73] [llvm-dev] [RFC] Stack overflow and optimizations https://lists.llvm.org/pipermail/llvm-dev/2019-August/134317.html
[74] 3464. istream::gcount() can overflow https://www.open-std.org/JTC1/SC22/WG21/docs/issue3464.html
[75] GCC vs MSVC compiler issues in a port https://gcc.gnu.org/pipermail/gcc-help/2012-December/109498.html
[76] [gcc/devel/c++-modules] [Ada] Overflow in string streaming https://gcc.gnu.org/pipermail/gcc-cvs/2020-July/314297.html
[77] 有关cin.sync的用法及解释和如何清除缓冲区-CSDN博客 https://blog.csdn.net/m0_50619645/article/details/108571802
[78] 数据溢出_数据溢出会怎样-CSDN博客 https://blog.csdn.net/LJH_Gemini/article/details/83274063
[79] cin不明确 - CSDN文库 https://wenku.csdn.net/answer/7cfwore6r9
[80] C++编译器对溢出的默认处理 - HL棣 - 博客园 https://www.cnblogs.com/HuangLiDi/p/18131445
[81] 一个关于cin的基础问题 https://bbs.csdn.net/topics/190053618
[82] Visual Studio 2019无法运行C程序?-ZOL问答 https://wap.zol.com.cn/ask/x_30186523.html
[83] 整型超上限后的处理 - CSDN文库 https://wenku.csdn.net/answer/2z5emgcahi
[84] Linux应用程序 栈溢出 内存踩踏 问题 排查学习_终端命令栈溢出-CSDN博客 https://blog.csdn.net/weixin_45842280/article/details/148211544
[85] CAP6135: Malware and Software Vulnerability Analysis(pdf) https://cs.ucf.edu/\~czou/CAP6135-16/programAssignment-1.pdf
[86] CAP6135: Malware and Software Vulnerability AnalysisCAP6135: Malware and Software Vulnerability Analysis (Spring 2011)(pdf) https://cs.ucf.edu/\~czou/CAP6135-11/project-1.pdf
[87] Attack on Stack [Part 4]; Smash the Stack Visualization: Prologue to Exploitation Chronicles, GDB on the Battlefield. https://null-byte.wonderhowto.com/how-to/attack-stack-part-4-smash-stack-visualization-prologue-exploitation-chronicles-gdb-battlefield-0161699/
[88] Section 3: StackSmash https://cs61.seas.harvard.edu/wiki/2018/Section3
[89] c++内存问题排查攻略 https://cloud.tencent.com/developer/article/2444468
[90] 从根因到解决:C++ 中的栈溢出运行时错误排查与修复实用指南-猿码集 https://www.yingnd.com/c/265977.html
[91] 怎样测量c++程序的内存占用使用工具分析堆栈使用情况 https://m.php.cn/faq/1413667.html
[92] 如何诊断C++程序的内存错误 使用AddressSanitizer工具实践-C++-PHP中文网 https://m.php.cn/faq/1397316.html
[93] C++内存调试项目实战教程-原创手记-慕课网 https://m.imooc.com/article/364281
[94] 【C++】 解决 C++ 语言报错:Stack Overflow_c++栈溢出的原因及解决办法-CSDN博客 https://blog.csdn.net/Easonmax/article/details/140166223
[95] 怎么看堆栈有没有溢出 https://wenku.csdn.net/answer/4bfx8d1a3x
[96] Reduce undefined behavior of signed integer literal arithmetic operations https://lists.isocpp.org/std-proposals/att-6440/attachment
[97] integral overflow and integral conversions https://gcc.gnu.org/pipermail/gcc/2010-November/195471.html
[98] Safe integer overflows in C++ https://gcc.gnu.org/pipermail/gcc-help/2011-April/103104.html
[99] #include #include int main() { int i = 123456789; int a = 1<< i; printf("%d",a); return 0; }这句话什么意思 - CSDN文库 https://wenku.csdn.net/answer/3uyd6iaoyg
[100] Bug 109107 - [10/11/12/13 Regression] UBsan since GCC-8 misses an integer-overflow https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109107
[101] zju pat1065. A+B and C (64bit)-CSDN博客 https://blog.csdn.net/weixin_30410119/article/details/96711636
[102] 问答:Visual C++是否考虑未定义的有符号整数溢出? - 问答 - 第一PHP社区 php1.cn https://www.php1.cn/ask/question_VisualC--_ShiFou_c9e8aa35.html
[103] 在对构造函数的调用中没有报告整数溢出警告-腾讯云开发者社区-腾讯云 https://cloud.tencent.com/developer/ask/sof/107343849
[104] 对C++中有符号整数溢出仍不确定-腾讯云开发者社区-腾讯云 https://cloud.tencent.com/developer/ask/sof/107001298/answer/132232667
[105] Integer Overflow_integer overfow-CSDN博客 https://blog.csdn.net/gogdizzy/article/details/9379741
[106] [gcc/devel/c++-modules] libstdc++: Avoid overflow in istream::get(streambuf&) [LWG 3464] https://gcc.gnu.org/pipermail/libstdc++-cvs/2020q3/032670.html
[107] integral overflow and integral conversions https://gcc.gnu.org/legacy-ml/gcc/2010-11/msg00153.html
[108] [committed] libstdc++: Replace operator>>(istream&, char*) [LWG 2499] https://gcc.gnu.org/pipermail/gcc-patches/2020-August/551451.html
[109] cin不明确 - CSDN文库 https://wenku.csdn.net/answer/7cfwore6r9
[110] c输入数据溢出和c++输入数据溢出的区别_51CTO博客_c语言数据溢出 https://blog.51cto.com/u_14195159/5687774
[111] cin与scanf_cin和scanf-CSDN博客 https://blog.csdn.net/must_5/article/details/90378947
[112] cin Segmentation fault - CSDN文库 https://wenku.csdn.net/answer/3recbsv6mo
[113] 用cin把字符输入给size_t类型变量会怎么样 - CSDN文库 https://wenku.csdn.net/answer/jzqz0q73bu
[114] C++ 输入(cin等)_std::cin 不读取上次内容-CSDN博客 https://blog.csdn.net/thinking2013/article/details/12242001
[115] 问题:为什么在C++中使用scanf会导致输入错误?_编程语言-CSDN问答 https://ask.csdn.net/questions/8578764
[116] Coverity and Integer Overflows1Coverity and Integer Overflows(pdf) https://www.swatips.com/articles/20210628.pdf
[117] Integer Overflow in C++ https://www.studyplan.dev/intro-to-programming/numbers/q/integer-overflow
[118] 使用C++ std::cin时溢出错误,变量内有奇怪的值(C++11)-腾讯云开发者社区-腾讯云 https://cloud.tencent.com/developer/ask/sof/107863470/answer/118266441
[119] 解决 stack around the variable " " was corrupted 问题_stack around the variable was corrupted-CSDN博客 https://blog.csdn.net/u012839256/article/details/104754514
[120] 【C++】std::cin.clear() 消除错误-CSDN博客 https://blog.csdn.net/NICK_pei/article/details/117993550
[121] -858993460,内存溢出,内存泄露 https://bbs.csdn.net/topics/390718008
[122] c++疑惑,大家讨论下这段程序为什么越过条件判断,直接执行最后的输出? https://bbs.csdn.net/topics/370242209
[123] 求救:连续两次cin导致溢出,前次输入被覆盖 https://bbs.csdn.net/topics/120109521
[124] C++小问题,大家帮忙 https://bbs.csdn.net/topics/330197328
[125] C++与安全编程:编写安全的C++代码,预防常见的安全漏洞_c++服务端开发若是支持匿名访问的话会不会不安全?-CSDN博客 https://blog.csdn.net/q7w8e9r4/article/details/134798944
[126] Best Practices: Secure Coding https://app.studyraid.com/en/read/1708/24115/best-practices-secure-coding
[127] How to prevent unexpected input behavior https://labex.io/tutorials/cpp-how-to-prevent-unexpected-input-behavior-427256
[128] Improving Input Validation for Card Values in C++ Program https://codereviewbot.ai/code-review-tool/FRUXSqxe/improving-input-validation-for-card-values-in-c-program
[129] 46、C++安全编程-CSDN博客 https://blog.csdn.net/garlic/article/details/148718341
[130] 掌握C++,守护代码安全:揭秘安全编程的实用技巧与案例分析 - 云原生实践 https://www.oryoy.com/news/zhang-wo-c-shou-hu-dai-ma-an-quan-jie-mi-an-quan-bian-cheng-de-shi-yong-ji-qiao-yu-an-li-fen-xi.html
[131] C++ 框架安全配置的最佳实践全解析:从认证到日志审计的实战要点-猿码集 https://www.yingnd.com/c/265610.html
[132] C++如何有效处理用户输入错误数据的最佳实践-猿码集 https://www.yingnd.com/c/205347.html
[133] 怎样在C++中进行安全测试?-C++-PHP中文网 https://m.php.cn/faq/1286977.html
[134] C++代码数据校验方法详解:从基础到高级实现-插件窝 https://chajianwo.com/blog-49766.html
[135] 【C++实战(75)】筑牢安全防线,攻克漏洞难题-CSDN博客 https://blog.csdn.net/u012069313/article/details/152613688
[136] 【C++实战(75)】筑牢安全防线,攻克漏洞难题-CSDN博客 https://blog.csdn.net/u012069313/article/details/152613688
[137] How to solve C++ runtime error: 'buffer overflow'? https://m.php.cn/faq/597591.html
[138] C,C++语言缓冲区溢出的产生和预防_c++ 造缓冲区溢出bug-CSDN博客 https://blog.csdn.net/chengoodflower/article/details/146988307
[139] C/C++缓冲区溢出防范教程及源代码解析 - CSDN文库 https://wenku.csdn.net/doc/9sko8jrqux
[140] C++代码安全:防范漏洞,守护程序稳定-腾讯云开发者社区-腾讯云 https://cloud.tencent.com.cn/developer/article/2475363?frompage=seopage\&policyId=20240001\&traceId=01jtj1sk9d1g4wq97pwsw30p1z
[141] c++怎么防止缓冲区溢出攻击_c++缓冲区溢出防护方法-C++-PHP中文网 https://m.php.cn/faq/1604408.html
[142] cs架构如何加密传输数据 如何增强cs架构的安全性_boyboy的技术博客_51CTO博客 https://blog.51cto.com/u_13019/8314864
[143] C++ 框架中的缓冲区溢出 (buffer overflow) 如何预防和处理?-C++-PHP中文网 https://m.php.cn/faq/851206.html
[144] 什么是缓冲区溢出漏洞?缓冲区溢出漏洞是一种常见的安全漏洞,发生在程序尝试向预分配内存空间填充数据时,超出其预定大小,进而 - 掘金 https://juejin.cn/post/7431743236535009330
(注:文档部分内容可能由 AI 生成)
by fkxr @ 2025-10-23 17:01:32
怎么都用豆包啊
by ___zjy___ @ 2025-10-23 17:03:24
应该qp吗
by lingfunny @ 2025-10-23 17:21:24
@Lyz09会被篡改?我怎么复现不了这个 BUG?本机上会被赋值为 INT_MAX / INT_MIN。
版本:
gcc version 15.1.0 (MinGW-W64 x86_64-ucrt-posix-seh, built by Brecht Sanders, r4)
编译选项:-std=c++26 -O2。
总之 signed overflow 就是 UB。但是这个问题可能和 cin 有关了。cin 本身是不会有 UB 的,但是会报错。
In C++98 the variable was unchanged when input failed. This was a disadvantage if you try to input to an uninitialized variable.
For example:
int a; cin >> a; cout << a; // UB if input failed!In later standards the variable will be set to the largest or smallest value possible when the input is outside of that range.
source: https://stackoverflow.com/questions/35898958/unexpected-behavior-from-cin-when-overflowing-int
by Argon_Cube @ 2025-10-23 18:59:00
@Lyz09 这个应该不是 Undefined Behavior。
13) Extracts an
intvalue potentially skipping preceding whitespace. The value is stored to a given reference value. This function behaves as a FormattedInputFunction. After constructing and checking the sentry object, which may skip leading whitespace, extracts alongvaluelvalby callingstd::num_get::get(). After that:
- If
lval < std::numeric_limits<int>::min(), setsfailbitand storesstd::numeric_limits<int>::min()toval.- Otherwise, if
std::numeric_limits<int>::max() < lval, setsfailbitand storesstd::numeric_limits<int>::max()to val.- Otherwise, stores
static_cast<int>(lval)to val.Source: https://cppreference.net/cpp/io/basic_istream/operator_gtgt.html