2016-10-28 2 views
1

Может кто-нибудь объяснить мне, почему следующий код для модульного теста дает ошибку unreadVariable для n и k в cppcheck? Комбинации - это шаблонный класс, который вычисляет все комбинации n, выбирает k, но это не имеет значения здесь.cppcheck жалуется на unreadVariable при использовании в шаблоне

TEST(Combinations, ChooseOne) 
{ 
    const UINT8 n = 3; 
    const UINT8 k = 1; 

    Combinations<n, k> comb; 
    comb.calc(); 
    std::vector< std::vector<UINT8> > _vui8Expect = { { 2 }, { 1 }, { 0 } }; 
    EXPECT_THAT(comb.result, ::testing::ContainerEq(_vui8Expect)); 
} 

Я могу изменить код на следующее и не получить ошибку cppcheck. Но мне это не нравится, потому что он делает код менее подробным. n, k - четко определенные величины в статистике, и они делают более понятным в вызове то, что происходит.

TEST(Combinations, ChooseOne) 
{ 
    Combinations<3, 1> comb; 
    comb.calc(); 
    std::vector< std::vector<UINT8> > _vui8Expect = { { 2 }, { 1 }, { 0 } }; 
    EXPECT_THAT(comb.result, ::testing::ContainerEq(_vui8Expect)); 
} 

ответ

2

Это известная проблема: http://trac.cppcheck.net/ticket/7542

Так что, если это не будет исправлено, то cppcheck сообщит об этом ложноположительном ,

+1

Благодарим вас за ссылку. Я не стал подвергать сомнению полномочия cppcheck. ;-) – Nikolai

1

Я попытался вставить это в комментарий, но вот мысль.

Насколько я помню Google Тесты используют положение TEST в следующем порядке:

TEST(test_case_name, test_name) { 
... test body ... 
} 

я лично не сталкивался что-то подобное, но в вашем случае у вас есть то же имя для теста имя и фактический класс, который вы тестируете. Мне кажется, что-то вроде столкновения имен.

Вы пробовали переименование

TEST(Combinations, ChooseOne) 
{ 
    const UINT8 n = 3; 
    const UINT8 k = 1; 

    Combinations<n, k> comb; 
    comb.calc(); 
    std::vector< std::vector<UINT8> > _vui8Expect = { { 2 }, { 1 }, { 0 } }; 
    EXPECT_THAT(comb.result, ::testing::ContainerEq(_vui8Expect)); 
} 

к:

TEST(CombinationsTest, ChooseOne) 
{ 
    const UINT8 n = 3; 
    const UINT8 k = 1; 

    Combinations<n, k> comb; 
    comb.calc(); 
    std::vector< std::vector<UINT8> > _vui8Expect = { { 2 }, { 1 }, { 0 } }; 
    EXPECT_THAT(comb.result, ::testing::ContainerEq(_vui8Expect)); 
} 
Смежные вопросы