В следующем коде я memset()
a stdbool.h
bool
значение переменной 123
. (Возможно, это поведение undefined?) Затем я передаю указатель на эту переменную функции-жертвы, которая пытается защитить от неожиданных значений с помощью условной операции. Однако GCC по какой-то причине, по-видимому, вообще исключает условную операцию.
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
void victim(bool* foo)
{
int bar = *foo ? 1 : 0;
printf("%d\n", bar);
}
int main()
{
bool x;
bool *foo = &x;
memset(foo, 123, sizeof(bool));
victim(foo);
return 0;
}
[email protected]:~$ gcc -Wall -O0 test.c [email protected]:~$ ./a.out 123
Что особенно неприятно, так это то, что функция victim()
фактически находится внутри библиотеки и сработает, если значение больше 1.
Воспроизводится в версиях GCC 4.8.2-19ubuntu1 и 4.7.2-5. Не воспроизводится на clang.