В проекте C (OpenVPN является рассматриваемым проектом, commit 4029971240b6274b9b30e76ff74c7f689d7d9750), у нас была эмуляция bool
typedef int bool;
#define false 0
#define true 1
и теперь переключитесь на C99 bool
#include <stdbool.h>
Но в проекте есть где-то плохое использование bool. Я знаю, что std bool ведет себя по-другому. Например.
bool t;
t=2;
if ( t == true)
printf("True!\n");
else
printf("False!\n");
Вернется True! с stdbool.h
и False! с эмуляцией #define
.
Мой вопрос Есть ли способ найти эти части кода, которые ведут себя по-разному с stdbool и emulated bool? Возможно, какой-то флаг компилятора я пропустил или хороший промежуточный формат llvm или gcc, который можно отличить?
Это не так просто, как в приведенном выше примере, но должно быть то, что не так просто видеть. Определенно не == true.
UPDATE: Мы обнаружили проблему (у mbuf_set есть int member len). Это глупо, но вопрос все еще остается, как поймать их. Я удивлен, что целые проверки переполнения не улавливают такие вещи:
static inline bool
mbuf_len (const struct mbuf_set *ms)
{
return ms->len;
}