让g ++编译它不应该是一个好主意(我怀疑一般不可能),但在这种情况下,我试图编写静态分析检查来查找违规具体的MISRA规则,不幸的是g ++相当好:)我试图检查一个规则,说明"指向虚拟基类的指针只能通过以下方式转换为指向派生类的指针的dynamic_cast&#34。这是一个明智的规则,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)可能还有其他编译器无法编译这些代码,在这种情况下,我们不能将其标记为&#34;编译器检查&#34;总的来说。
如果没有尝试找到另一个编译它的编译器(这是一个选项),有没有办法让g ++编译它?我试了-fpermissive
没有成功。