NULL ポインタ参照とか検出してくれて非常にありがたいのですが、
こちらのコードでも警告が出てしまいます。
1 2 3 4 5 6 7 8 9 |
#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 を使います。これはコード分析ツールのためのコードの追加情報を与えます。
上記コードはこのようになります。
1 2 3 4 5 6 7 8 9 10 |
#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 にやらせる
1 2 3 4 5 6 7 8 9 10 |
#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 の機能である
1 2 |
if ( int x = 1 ) // { 省略しても OK ASSERT_TRUE(x==1) << "message" ; // << で失敗時のメッセージを追加できる |
これを使って最初のコードを分析させます。
結果

うまくいきました。
コード分析、便利なんで積極的に使いたいですね。
(あれ?でも解放してないのは警告されないのか。。。)
0 件のコメント:
コメントを投稿