CERT.EXCEPTION.OVER.BOUNDARY

実行境界を越えて例外がスローされました

実行境界を越えて (C と C++ 間、異なるコンパイラ間、または同じコンパイラの異なるバージョン間で) 例外がスローされた場合に、チェッカーが呼び出しを特定します。

脆弱性とリスク

実行境界を越えて例外をスローすることは、定義されていない動作です。使用されるコンパイラの組み合わせによっては、キャッチされない例外やクラッシュが発生する可能性があります。

制限事項

チェッカーは、呼び出された関数によって例外が直接スローされた場合にのみチェックします。実行境界を越えて直接呼び出されない他の関数からスローされる間接的な例外は検出しません。

脆弱コード例

コピー
// library.h
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
void library_foo(int i);
#ifdef __cplusplus
}
#endif

// library.cpp
#include "library.h"

extern "C" void library_foo(int i)
{
  if (i > 1) {
    throw 42;
  }
}

// app.c
#include "library.h"

int main() {
  library_foo(1);  // CERT.EXCEPTION.OVER.BOUNDARY
  return 0;
}

キャッチされない例外やクラッシュにつながる可能性があるため、以下のように、欠陥 CERT.EXCEPTION.OVER.BOUNDARY が Klocwork で報告されます。

app.c:5 CERT.EXCEPTION.OVER.BOUNDARY
Function 'main' calling throwing function 'library_foo' over execution boundary
* library.cpp:3: 'library_foo' defined here

修正コード例

コピー
// library.h
#pragma once
#ifdef __cplusplus
extern "C" {
#endif

int library_foo(int i);
#ifdef __cplusplus
}
#endif

// library.cpp
#include "library.h"

extern "C" int library_foo(int i)
{
  return i > 1 ? 42 : 0;
}

// app.c
#include "library.h"

int main() {
  return library_foo(1);
}

ここでは、例外の代わりに戻りコードが使用されます。