Boost.勉強会 #21 札幌でLTとして話をしてきました。Visual C++のSAL (source code annotation language)についてです。

このスライドはCreative Commons — 表示 – 継承 4.0 国際 — CC BY-SA 4.0です。ダウンロードはこちらです。

その後、尋ねられた質問の回答を以下書いておきます。

こういう低水準な処理はラップして隠蔽するものでは?

はい、そう思います。実際、C++プログラムにおいて、SALを適用する箇所は少ない実感があります。

Visual C++以外でも使用する予定のコードがある。空に置き換えるマクロ定義が用意されていないか?

無さそうです。実際、C++ REST SDKでは、cpprest/details/nosal.hにて自前で作っています。このように自身で作るしかないと思います。

_In_reads_(n)など配列の場合で、要素数が変数であるのにコンパイル時に範囲外アクセスを検出できるのか?

はい、可能なものもあると思います。MSDNライブラリのSAL についてというページには、こういう例があります。

wchar_t * wmemcpy(
  _Out_writes_all_(count) wchar_t *dest, 
  _In_reads_(count) const wchar_t *src, 
  size_t count)
{
  size_t i;
  for (i = 0; i <= count; i++) { // BUG: off-by-one error
    dest[i] = src[i];
  }
  return dest;
}

src[count - 1]までしか読み取れないはずなのに、iは最大countに達する可能性があります。

機械的に検出できそうな感じがするでしょう。でもこれ、Visual C++の/analyzeでは何も言われないという残念なオチでした: c++ – How Microsoft SAL can prevent off-by-one error – Stack Overflow。すみません、私もこれを書いているたった今知りました。


そんなわけで、抜けもありますが、自分はこれでバグを見つけてもらったことが何度かあるので、SALを自分の書くコードにも使っています。ここ最近このブログに載せているコードも全部そうです。今回紹介しきれなかったものも、今後紹介していきたいと思っています。

スポンサード リンク

この記事のカテゴリ

  • ⇒ Visual C++コード分析を支えるSALという題で話をしてきました