NULL ポインタ参照とか検出してくれて非常にありがたいのですが、
こちらのコードでも警告が出てしまいます。
#include <gtest/gtest.h> TEST(NullCheck, Sample) { int* p = (int*)malloc(4); ASSERT_TRUE(p != NULL); *p = 1; ASSERT_EQ(1, *p); }
p が NULL の場合、ASSERT_TRUE(p != NULL) に失敗し return します。
従って以降の処理が走る場合、p が NULL でないことは決定しています。
こんなことも分からないとは・・・
NULL でないことを教える
C6011 の対処をするために __analysis_assume を使います。これはコード分析ツールのためのコードの追加情報を与えます。
上記コードはこのようになります。
#include <gtest/gtest.h> TEST(NullCheck, Sample) { int* p = (int*)malloc(4); ASSERT_TRUE(p != NULL); __analysis_assume(p != NULL); *p = 1; ASSERT_EQ(1, *p); }
結果
警告消えました!
あーでも、ASSERT_TRUE(p != NULL); で分かりきってることを、もう一度書くのはダサいですよね・・・
ASSERT_TRUE にやらせる
#undef ASSERT_TRUE #define ASSERT_TRUE(condition) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if( bool b = true ) { \ __analysis_assume(condition); \ goto GTEST_CONCAT_TOKEN_(gtest_label_analysis_assume, __LINE__); \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_analysis_assume, __LINE__): \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_FATAL_FAILURE_)
ちょっと変わった書き方ですが、Google Test の機能である
if( int x = 1 ) // { 省略しても OK ASSERT_TRUE(x==1) << "message"; // << で失敗時のメッセージを追加できる
これを使って最初のコードを分析させます。
結果
うまくいきました。
コード分析、便利なんで積極的に使いたいですね。
(あれ?でも解放してないのは警告されないのか。。。)
0 件のコメント:
コメントを投稿