演员表是否会导致缓冲区溢出?

时间:2010-09-14 01:40:16

标签: c++

是否有可能从演员表中发生缓冲区溢出?

如果是,请解释如何。

感谢。

5 个答案:

答案 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说读取超限不算数,但你也可以将演员表的结果分配到越界位置,而某些工具似乎会将演员报告为有罪。