0

让 g++ 编译它不应该的东西通常不是一个好主意(我怀疑一般来说不可能),但在这种情况下,我正在尝试编写静态分析检查以发现违反特定 MISRA 规则的情况,不幸的是 g++ 是太好了:) 我正在尝试检查一条规则,上面写着“指向虚拟基类的指针只能通过 dynamic_cast 强制转换为指向派生类的指针。” 这是一个非常明智的规则,以至于 g++ 会自行检查并无法编译以下代码:

class B
{
public:
        virtual ~B() {}
};

class D : public B {};
class VD : virtual public B {};

int main()
{
        D d;
        VD vd;
        B *pd = &d;
        B *pvd = &vd;
        D *d1 = (D*)(pd); // Fine
        D *d2 = static_cast<D*>(pd); // Fine
        D *d3 = dynamic_cast<D*>(pd); // Fine
        D& d4 = static_cast<D&>(*pd); // Fine
        D& d5 = dynamic_cast<D&>(*pd); // Fine
        VD *vd1 = (VD*)(pvd); // Bad
        VD *vd2 = static_cast<VD*>(pvd); // Bad
        VD *vd3 = dynamic_cast<VD*>(pvd); // Fine
        VD& vd4 = static_cast<VD&>(*pvd); // Bad
        VD& vd5 = dynamic_cast<VD&>(*pvd); // Fine
        return 0;
}

这让我对使用 g++ 作为编译器感到非常积极,但在这种情况下有点问题,因为 (a) 我们必须能够构建代码才能使用我们的工具对其进行分析,并且 (b) 很可能是其他编译器将无助地编译此代码,在这种情况下,我们通常不能将其标记为“编译器检查”。

没有尝试找到另一个编译器来编译它(这是一个选项),有没有办法让 g++ 编译它?我试过-fpermissive没有成功。

4

0 回答 0