好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

今日の仕組まれたバグ

配列 new なんて自分では使わないから、しばらく何が間違ってるのか考え込んでしまった(苦笑)。

#include <cstdio>

class A {
  int a;
public:
  virtual void Print() const {printf("a:%d\n", a);}
};

class AA : public A{
  int aa[5];
public:
  virtual void Print() const {printf("aa:%d\n", aa[0]);}
};

int main() {
  int num = 2;
  A* ary = new AA[num];
  for (int i = 0; i < num; ++i) {
    ary[i].Print();
  }
  delete[] ary;
  return 0;
}

$ g++ -Wall -Wextra -Wcast-align a.cpp
$ ./a.out
aa:0
Segmentation fault

num が 1 の状態でしか確認されてなくて、いざ使うことになって2以上にした途端に Segmentation fault するとか嫌がらせだろw ただの凡ミスなんだろうけど、なんかテストに出そうな問題だなーとか思ったのでネタにしてみた。

これ、ほぼバグになるんだから警告ぐらい出てくれてもいいのに、と思わなくもない。配列 new とアップキャスト。こんなにシンプルなアップキャストでメモリを壊そうとできる言語ってそうは無いよなーw これだから C++ 大好きだwww