Почему 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.
Поэтому, когда я проверяю свой отчет о модульном тестировании, он дает следующий результат:Мой вопрос в том, почему он не покрывает условие для TCPIP_IPADDR_STATE_UNASSIGNED, поскольку значение для состояния, которое я передаю, равно 0xFF, что является недопустимым значением.
1 ответ
Вы - "жертва" ленивых оценок.
Глава 6.5.14 "Логический оператор ИЛИ":
Если первый операнд не равен 0, второй операнд не оценивается.
Все три части множественного И являются true
, и поэтому не равно 0.
Оба логичных &&
покрыты, но вы не видите его из-за ||
в той же строке выполняется не полностью.