繁体   English   中英

c ++如果用sprintf打印的字符多于char指针分配的字符会怎么样?

[英]c++ what happens if you print more characters with sprintf, than the char pointer has allocated?

我认为这是使用sprintf的常用方法:

char pText[x];
sprintf(pText, "helloworld %d", Count );

但是,如果char指针分配的内存少于打印到的内容,究竟会发生什么?

即如果x小于sprintf的第二个参数的长度怎么办?

我问,因为我在sprintf语句后面的代码中得到了一些奇怪的行为。

一般来说,“确切地”回答将会发生什么是不可能的。 这样做会调用所谓的未定义行为 ,这基本上意味着可能发生任何事情。

简单地避免这种情况是个好主意,并在可用的地方使用安全功能:

char pText[12];
snprintf(pText, sizeof pText, "helloworld %d", count);

请注意snprintf()如何获取一个额外的参数,该参数是缓冲区大小,并且写入的空间不会超过。

这是一个常见错误,并在覆盖char数组后导致内存。 因此,例如,在char数组之后的内存中可能会有一些int或另一个数组,并且这些数组会被文本覆盖。

看到整个问题(缓冲区溢出)一个不错的详细描述在这里 还有一个注释,一些架构提供了一个snprintf例程,它具有第四个参数,用于定义最大长度(在您的情况下为x)。 如果你的编译器不知道它,你也可以自己编写它以确保你不会得到这样的错误(或者只是检查你是否总是分配了足够的空间)。

请注意,此类错误后的行为未定义,可能导致非常奇怪的错误。 变量通常在可被4整除的内存位置对齐,因此在大多数情况下,如果你写了一个或两个字节太多(即忘记为NUL定位),你有时不会注意到错误,但在其他情况下会出现奇怪的错误案例。 这些错误很难调试,因为其他变量会发生变化,错误通常会发生在代码的完全不同的部分。

这称为缓冲区溢出

sprintf将覆盖恰好跟随pText地址的内存。 由于pText在堆栈上, sprintf可以覆盖局部变量,函数参数和返回地址,从而导致各种错误。 这种代码会导致许多安全漏洞 - 例如,攻击者使用缓冲区溢出来写入指向自己代码的新返回地址。

这种情况下的行为是不确定的。 通常情况下,你会崩溃,但你也可能看到没有不良影响,奇怪的值出现在无关的变量和那种事情。 您的代码也可能调用错误的函数,格式化您的硬盘驱动器并杀死其他正在运行的程序。 最好通过为缓冲区分配更多内存来解决此问题。

我这么做了很多次,你会收到内存损坏错误。 AFAIK,我记得我做过这样的事情: -

vector<char> vecMyObj(10);
vecMyObj.resize(10);
sprintf(&vecMyObj[0],"helloworld %d", count); 

但是当调用vector的析构函数时,我的程序会收到内存损坏错误,如果size小于10,它将成功运行。

你能拼写Buffer Overflow吗? 一个可能的结果是堆栈损坏,并使您的应用程序易受基于堆栈的利用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM