n0p*_*0pe -3 c++ integer overflow
我有一个非常简单的程序:
int main()
{
char* num = new char[5];
sprintf(num, "65536");
std::cout << "atoi(num): " << atoi(num) << "\n";
}
Run Code Online (Sandbox Code Playgroud)
无符号INT的最大大小为65535.为什么运行时该程序不会溢出atoi(65536)?
在当前的PC系统中,a int通常是32位甚至64位(除了一些较小的平台,如Arduino).
因此,可能在您的系统上,int(或unsigned int)大于16位,65536不应溢出.您可以通过以下方式轻松检查:
std::cout << sizeof(int) << "\n";
Run Code Online (Sandbox Code Playgroud)
此外,numnull终止符没有空格:
char* num = new char[5];
sprintf(num, "65536");
Run Code Online (Sandbox Code Playgroud)
因此sprintf()会\0在缓冲区之外写一个终止的,导致未定义的行为:
没有办法限制写入的字符数,这意味着使用的代码
sprintf容易受到缓冲区溢出的影响.
这应该改为:
char* num = new char[6];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
326 次 |
| 最近记录: |