0

以下のコードを見ると、fun 関数は C のオブジェクトを B のオブジェクトに変換し、B 自身の関数を呼び出します。それはどのようにセグメント障害を与えませんか。これはクラッシュにつながると思います。私のプログラムはクラッシュしていません。なぜそれがうまく機能しているのか誰でも説明できますか?

#include<iostream>
using namespace std;
class A{
public:
   A() {cout<<"A's Con\n"; }
   ~A() {cout<<"A's De\n"; }
};
class B :public A
{
public:
   B() {cout<<"B's Con\n"; }
   ~B() {cout<<"B's De\n"; }
   void printb(){cout<<"B print function\n";}
   void printb2(){cout<<"B print2 function\n";}
};
class C :public A
{
public:
   C() {cout<<"C's Con\n"; }
   ~C() {cout<<"C's De\n"; }
   void printc(){cout<<"C print function\n";}
};
void fun(A *ap)
{
   B *bp = (B*) ap;
   bp->printb2();
}

int main()
{
   C c;
   fun(&c);
   return 0;
}
4

1 に答える 1

2

未定義の動作を呼び出しています。未定義の動作に関する最初のルールは、何でも起こり得るということです。プログラムがクラッシュするか、正常に動作する可能性があります。正常に動作しているように見えても、数時間後に「不可能な」方法でクラッシュする場合があります。上司に不適切なメールを送信したり、ハード ドライブを消去したりすることさえあります。ランダムで無害なエラーの場合は確かにありそうにありませんが、プログラムがたとえば Web ブラウザーである場合、攻撃者が望むことは何でも実行するために悪用される可能性があります。

未定義の動作に依存しないでください。根底にある問題は常に修正してください。ValgrindApplication Verifierなどのツールを使用して、常にクラッシュにつながるとは限らない微妙なエラーを検出します。長期的には、ソフトウェアの信頼性が大幅に向上します。

于 2012-09-25T17:13:13.920 に答える