- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
#include <stdio.h>
#include <stdint.h>
int main(void)
{
bool a = 0;
*((uint8_t*)&a) = 2;
if(!a)
printf("a false\n");
else
printf("a true\n");
return 0;
}
------
.LC1:
.string "a true"
main:
push rax
mov edi, OFFSET FLAT:.LC1
call puts
xor eax, eax
pop rdx
ret
Можно поинтересоваться, откуда такие ожидания?
UB на самом деле, эта хуйня с мусором в булеане на практике может настолько снести крышу, что у тебя true && true == false получится.
Ибо конпеляторы обычно генерят битовый & вместо булевого &&. Засунул туда через жопу что-то кроме 0 или 1 -- ССЗБ.
Удивительный случай случился со мной: я
вдруг забыл, что идет раньше — 7 или 8.
Я отправился к соседям и спросил их, что
они думают по этому поводу.
Каково же было их и мое удивление, когда
они вдруг обнаружили, что тоже не могут
вспомнить порядок счета. 1,2,3,4,5 и 6 по-
мнят, а дальше забыли.
Мы все пошли в комерческий магазин «Гас-
троном», что на углу Знаменской и Бассейной
улицы, и спросили кассиршу о нашем недоуме-
нии. Кассирша грустно улыбнулась, вынула изо
рта маленький молоточек и, слегка подвигав
носом, сказала:
— По-моему, семь идет после восьми в том
случае, когда восемь идет после семи.
Мы поблагодарили кассиршу и с радостью
выбежали из магазина. Но тут, вдумываясь в
слова кассирши, мы опять приуныли, так как
ее слова показались нам лишенными всякого
смысла.
Что нам было делать? Мы пошли в Летний
сад и стали там считать деревья. Но дойдя в
счете до 6-ти, мы остановились и начали спо-
рить: по мнению одних дальше следовало 7, по
мнению других — 8.
Мы спорили бы очень долго, но, по сча-
стию, тут со скамейки свалился какой-то ребе-
нок и сломал себе обе челюсти. Это отвлекло
нас от нашего спора.
А потом мы разошлись по домам.
12 нояб<ря> 1935.
скочил из окошка на улицу и напугал всех,
кто проходил в это время по улице. Крестья-
нин Харитон остановился, поднял камень и пу-
стил им в Тимофея. Тимофей куда-то исчез.
«Вот ловкач!» — закричало человеческое
стадо, и некто Зубов разбежался и со всего
маху двинулся головой о стенку.
«Эх!» — вскрикнула баба с флюсом. Но Ко-
маров сделал этой бабе тепель-тапель, и баба
с воем убежала в подворотню.
Мимо шел Фетелюшин и посмеивался. К нему
подошел Комаров и сказал: «Эй ты, сало!» —
и ударил Фетелюшина по животу. Фетелюшин
прислонился к стене и начал икать.
Ромашкин плевался сверху из окна, стара-
ясь попасть в Фетелюшина. Тут же невдалеке
носатая баба била корытом своего ребенка. А
молодая толстенькая мать терла хорошенькую
девочку лицом о кирпичную стенку.
Маленькая собачка, сломав тоненькую нож-
ку, валялась на панели.
Маленький мальчик ел из плевательницы
какую-то гадость.
У бакалейного магазина стояла очередь за
сахаром. Бабы громко ругались и толкали друг
друга кошелками.
Крестьянин Харитон, напившись денатурата,
стоял перед бабами с растегнутыми штанами и
произносил нехорошие слова.
Таким образом начинался хороший летний день.
Вижуалбарсик и Дотнет в качестве true используют минус единицу (все биты установлены), причём значение может занимать два или четыре байта.
Об этом нужно помнить при реализации протоколов обмена информацией: сырые булевы значения никуда не отправлять и ни откуда не принимать, а конвертировать в байтики явно.
Вспоминается история про mysql и проверку пароля, когда любой пароль подходил с вероятностью 1/256.
https://thehackernews.com/2012/06/cve-2012-2122-serious-mysql.html
По стандарту memcmp возвращает int. Обычно она возвращает разность между первой парой байтов, которые не совпали. Как именно её считать, нигде не документируется. Просто не ноль означает, что данные не совпали.
Даже в теории эта разность может быть в диапазоне от -255 до +255, если её считать как алгебраическую, что не влезает в диапазон signed char.
Видимо, у авторов MySQL эта разность считалась как XOR, поэтому всегда влезала в 8 бит.
Если брать алгебраическую разность первых несовпавших байтов, то можно придумать такие примеры:
1. В одной из строк есть символы за пределами ASCII.
2. Строки не текстовые, а из двоичных данных. Например, сравниваются двоичные представления хэш-сумм.
Если первые несовпавшие байты равны 0x21 (восклицательный знак) и 0xa1, то разность второго с первым будет 0x80=128.
> 128
128 != 0, проверка не пройдена. Покажи реальный пример различных байтов на которых получится 0.
лол, чтобы так обосраца, надо быть.. ... ... мускулевцем
Обосрались они только в том, что результат memcmp() кастанули в BOOL (байт) и он обрезался. Нули стали получаться не только когда хеши реально совпали, а тупо с вероятностью 1/256.
они результат сравнения кастанули в бул?
Не в bool а в BOOL. С крестовым bool всё ок было бы. Да и с ! было бы всё норм.
> плейнтекстовый
Не знаю. Хеш скорее всего.
сишный BOOL это алиас для целого обычный, и потому по сути они сравнивали типа if (some_int) ?
if ((bool)some_int) - норм
if ((BOOL)some_int) - не норм
Вклинилась потеря информации посредине.
З.Ы. Это условный пример. Конечно там был более сложный код. Но суть та же.
А можно чисто static_castнуть в BOOL безопасно, или нескомпилица?
тут же по сути получился reinterpreter?
какой багор
Разве в дотнете принято маршалить сырые данные?
На некоторых ARM'овских контроллерах есть окно в адресном пространстве, через которое видно кусок оперативки растянутый в 8 раз (каждый бит видно как байт). Вот в нём можно брать указатели на "биты".
Правда х.з. зачем всё это.
[quote]
гда непонятно, как адрес брать. Или bool* будет занимать больше места, чем обычный указатель
[/quote]
Чем меньше сущностей -- тем лучше же
На х64 ты всё адресное пространство не используешь. Три бита для адресации индивидуальных битов в байте отжать можно.
именно поэтому я против «зумерского идиотобесия», понапридумывали лишних типов и сидят систему типов дрочат - вместо того чтобы программы писать
https://postimg.cc/rR9gcYCP
https://postimg.cc/cK8pZ0Kk
Должно быть:
Так намного веселее
http://coliru.stacked-crooked.com/a/ae6506c90f86b938
Fuck the logic.
true2 && true2 и true4 && true4 истинны, но true2 && true4 ложно.
Волновая функция коллапсирует. И если мы измерили x как истинное, то !x будет ложным и наоборот. Вроде всё ок.
Хотел получить хуйню - предсказуемо получил.
http://coliru.stacked-crooked.com/a/d989d30ddb1cdd1b