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);
}
ここでは、例外の代わりに戻りコードが使用されます。