Почему часть моего кода пропускается? - PullRequest
2 голосов
/ 23 ноября 2010

Моя программа демонстрирует странное поведение, когда я выполняю ее в отладчике.В следующем фрагменте он проверяет pktNum != ~invPktNum, а затем непосредственно переходит ко второму оператору return 1;.

Отладчик показывает, что pktNum это неподписанный символ 0x01, а invPktNum это неподписанный символ 0xFE.

/* Verify message integrity. */
if (pktNum != ~invPktNum) {
    return 1;
}
ccrc = crc16_ccitt(msg, XModem_Block_Size);
if ( (((ccrc>>8) & 0xFF) != crcBuf[0]) 
    || ((ccrc & 0xFF) != crcBuf[1]) ) {
    return 1;
}

Ответы [ 5 ]

7 голосов
/ 23 ноября 2010

Компилятор сложил два return 1 случая в один и тот же код. Оба теста if переходят к одной и той же инструкции по сборке. Каждая команда может быть помечена только одним номером строки для отладчика, так что вы видите это странное поведение. Если вы компилируете с -g и без -O (или даже более явно используете -O0), это приведет к разным случаям, и все станет более понятным.

3 голосов
/ 23 ноября 2010

Unary ! - логическое НЕ.Если операндом является 0, результатом является 1, в противном случае - 0.Это означает, что !invPktNum равно 0, поэтому выражение if истинно.

Вы, вероятно, ищете унарный ~, который поразрядно-НЕ.


Кстати, в отладчике это может выглядеть так, как будто выполняется второй return 1;, а не первый, потому что компилятор мог переупорядочить код и объединить эти два оператора return 1; (особенно, если включена оптимизация).

2 голосов
/ 23 ноября 2010

!(0xFE) - это 0.Может быть, вы хотели ~(0xFE)?

0 голосов
/ 23 ноября 2010

Проверьте, что оптимизация компилятора определенно отключена для режима отладки.(Просто чтобы отличаться от всех остальных)

0 голосов
/ 23 ноября 2010

Вы сравниваете int с bool.Это плохой стиль для начала, и некоторые компиляторы будут жаловаться.

Может быть, вы перепутали ! и ~?!invPktNum вернет false, если invPktNum не ложно, и true, если false.Я почти уверен, что вы имели в виду ~invPktNum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...