読者です 読者をやめる 読者になる 読者になる

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

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

今日の仕組まれたバグ

プログラム C++

配列 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