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
成功せずに試しました。