是否有可能从演员表中发生缓冲区溢出?
如果是,请解释如何。
感谢。
答案 0 :(得分:4)
也许:
char p[1];
int *b = static_cast<int *>(p);
*b = 1;
Voila,缓冲区溢出!但只有写入才会超限,而演员本身并不会超支。
答案 1 :(得分:3)
仅间接 - 例如,如果您有一个char缓冲区,并决定使用Unicode,那么您将缓冲区的地址从char *
转换为wchar_t *
,但忘记调整该空格中“项目”的数量,以补偿wchar_t
(通常)大于char
...
答案 2 :(得分:3)
不是真的。缓冲区溢出是由写入在缓冲区边界外引起的。所以,除非你做这样的蠢事:
struct overrun
{
explicit overrun(size_t pX)
{
char buffer[1];
for (size_t i = 0; i < pX; ++i)
buffer[i] = 5;
}
};
int main()
{
static_cast<overrun>(100); // oops
}
强制转换通常不会超出缓冲区。 (甚至在这里,人们可能会争辩说,不是因为它的构造而导致超限的演员)。如果你遇到了真正的问题,请问。
答案 3 :(得分:3)
排序,我想...说你有这样的事情:
class A
{
};
class B
{
public:
operator A()
{
char buffer[5];
strcpy(buffer, "1234512345"); // buffer overrun here
A a;
return a;
}
};
// later...
B b;
A a = static_cast<A>(b); // triggers buffer overrun above
从技术上讲,演员表不是必需的(因为它是隐含的),但这是你可以说它是可能的一个例子。当然,这是一个愚蠢的例子: - )
答案 4 :(得分:1)
不确定您的分析工具究竟是如何报告罪魁祸首的,但是这个呢?
char ra[] = "hi";
char &ref = ra[3];
std::cout << static_cast<int>(ref);
当然,它正在评估实际超支的演员的论点,而不是转换本身。
GMan说读取超限不算数,但你也可以将演员表的结果分配到越界位置,而某些工具似乎会将演员报告为有罪。