Почему gcov не покрывает логический оператор &&?

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

     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.

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

1 ответ

Решение

Вы - "жертва" ленивых оценок.

Глава 6.5.14 "Логический оператор ИЛИ":

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

Все три части множественного И являются true, и поэтому не равно 0.

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

Другие вопросы по тегам