Почему gcov не покрывает логический оператор &&? - PullRequest
0 голосов
/ 07 апреля 2020

Мой фрагмент кода, на котором я выполняю модульное тестирование, выглядит примерно так:

     if(((State !=TCPIP_IPADDR_STATE_ASSIGNED)&& (State !=TCPIP_IPADDR_STATE_ONHOLD) && (State !=TCPIP_IPADDR_STATE_UNASSIGNED)) ||(SoConId==DOIP_INVALID_16))
       {
        }

И мой тестовый блок включает в себя следующее:

`DoIP_LocalIpAddrAssignmentChg(12,0xFF);`

Где DoIP_LocalIpAddrAssignmentChg - это функция имя, в котором находится if и 0xFF для недопустимого состояния, которое явно не равно всем 3: TCPIP_IPADDR_STATE_ASSIGNED , TCPIP_IPADDR_STATE_ONHOLD , TCPIP_IPADDR_STATE_UNASSIGNED . Значение SoConId равно 12 . Значение DOIP_INVALID_16 = 0xFF .

Поэтому, когда я проверяю свой отчет о модульном тестировании, он дает такой результат: code coverage for if condition Мой вопрос - почему он не покрывает условие для TCPIP_IPADDR_STATE_UNASSIGNED в качестве значения для состояния, которое я передаю, составляет 0xFF , что является недопустимым значением.

1 Ответ

1 голос
/ 07 апреля 2020

Вы - «жертва» ленивых вычислений.

Глава 6.5.14 «Оператор логического ИЛИ»:

Если первый операнд сравнивается с 0, второй операнд не вычисляется.

Все три части кратного И равны true и поэтому не равны 0.

Обе логические && покрыты, но вы можете не вижу этого из-за того, что || в той же строке не выполняется полностью.

...