ぬるぽ

C++ においてヌルポインタからメンバ関数を呼出すのは許されるのかということをずいぶん昔に書いた。

メンバ変数にアクセスするのは未定義だろうけども、それさえしなければ大丈夫なのではないかと当時の私は考えていた。

しかし、ちょっとした切っ掛けでこんなコードを clang でコンパイルしようとしたところ、警告が出た。

#include <iostream>

class Test {
public:
  void func(void) const throw();
};

void Test::func(void) const throw() {
  if (this) {
    std::cout << "hello world\n" <<std::endl;
  }
}

int main(void) {
  Test* obj = nullptr;
  obj->func();

  return 0;
}

警告の内容はこのようなものだ。

test.cpp:9:7: warning: 'this' pointer cannot be null in well-defined C++ code;
      pointer may be assumed to always convert to true
      [-Wundefined-bool-conversion]
  if (this) {
  ~~  ^~~~
1 warning generated.

ヌルポインタで呼出すのは未定義であると、まさにそう書いてある。 そして this は常に真であると clang は想定するので、ポインタが有効かどうかをメンバ関数の中でチェックしようとしてもすり抜けてしまう。 COM を使っているとこんなコードは書きたくなってしまうのだが駄目なようだ。

スマートポインタを積極的に使おう。

Document ID: 372bdf0171b5dd8040f7f3166f6af7ce