# DayOff v33
Starting at 20:00 PM (GMT+3)
Video:
- https://www.mixcloud.com/live/skotopes/
Audio:
- http://myau.su:8000/mp3_high.m3u
- http://myau.su:8000/mp3_low.m3u
Lineup:
- Cherneen
- Zlo
- CAT
Starting at 20:00 PM (GMT+3)
Video:
- https://www.mixcloud.com/live/skotopes/
Audio:
- http://myau.su:8000/mp3_high.m3u
- http://myau.su:8000/mp3_low.m3u
Lineup:
- Cherneen
- Zlo
- CAT
Mixcloud
Aku on Mixcloud Live
Broadcast live to your community of fans and tune in direct to creators from every genre
🔥2
Как обмануть и унизить компилятор.
На заре прошивки Flipper Zero нам понадобилось перенести функцию strdup (выделение места и копирование в него строки) в наш код, чтобы эффективнее использовать heap операционной системы.
На днях я решил что неплохо бы добавить рантайм-проверку на разыменование NULL, через MPU и столкнулся с тем что при передаче в strdup NULL - ловится разыменование в strlen. Вот это поворот подумал я, давайте посмотрим на исходник функции.
Теперь я сделал ассерт в этом месте, и пофиксил места где была возможная протечка NULL в strdup, надеюсь больше с подобными странностями у нас не будет проблем.
А вот вам ссылка на поиграться: https://godbolt.org/z/PqeEcqKax
На заре прошивки Flipper Zero нам понадобилось перенести функцию strdup (выделение места и копирование в него строки) в наш код, чтобы эффективнее использовать heap операционной системы.
На днях я решил что неплохо бы добавить рантайм-проверку на разыменование NULL, через MPU и столкнулся с тем что при передаче в strdup NULL - ловится разыменование в strlen. Вот это поворот подумал я, давайте посмотрим на исходник функции.
char* strdup(const char* s) {
const char* s_null = s;
if(s_null == NULL) {
return NULL;
}
size_t siz = strlen(s) + 1;
char* y = pvPortMalloc(siz);
memcpy(y, s, siz);
return y;
}
Как видно, в начале странным образом (напомню, это код написанный нами) производится проверка на NULL и выполнение дальше идти не должно. Еще одна зацепка к происходящему получилась когда я попробовал явно передать NULL в strdup: error: null argument where non-null requiredОкей, давайте обманывать компилятор.
void* absolutely_not_null(){ return NULL; }
strdup(absolutely_not_null());
Компилятор теперь не ругается, но выполнение опять падает на strlen с ошибкой разыменования NULL. Проверка явно есть в коде но не производится. Кстати, почему она так странно реализована? Давайте напрямую проверим аргумент. if(s == NULL) return NULL;Ага, вот почему оно было так странно написано, и вот ответ на наши странности. Аргумент функции в недрах stdlib помечен как nonnull (не может быть NULL), так что компилятор выкидывает ненужную по его мнению проверку. Но мы же его уже обманывали, давайте обманем еще раз:
error: 'nonnull' argument 's' compared to NULL
void* absolutely_not_null(){ return NULL; }
if(s == absolutely_not_null()) return NULL;
К сожалению компилятор и это детектит как ненужную проверку. Что мы еще можем сделать? if(1 / ((uint32_t)s + 1) == 1) {
return NULL;
}
И это тоже детектируется как проверка на NULL.if(((uint32_t)s << 1) == 0) {
return NULL;
}
А вот сдвиг оказался более странной для компилятора операцией, и эта проверка не была выкинута. Теперь я сделал ассерт в этом месте, и пофиксил места где была возможная протечка NULL в strdup, надеюсь больше с подобными странностями у нас не будет проблем.
А вот вам ссылка на поиграться: https://godbolt.org/z/PqeEcqKax
godbolt.org
Compiler Explorer - C (ARM GCC 10.3.1 (2021.10 none))
char* strdup(const char* s) {
const char* s_null = s;
if(s_null == NULL) return "NULL";
size_t size = strlen(s) + 1;
char* y = malloc(size);
memcpy(y, s, size);
return y;
}
void* absolutely_not_null(){
void* a = NULL;
if((rand()…
const char* s_null = s;
if(s_null == NULL) return "NULL";
size_t size = strlen(s) + 1;
char* y = malloc(size);
memcpy(y, s, size);
return y;
}
void* absolutely_not_null(){
void* a = NULL;
if((rand()…
🔥40
This media is not supported in your browser
VIEW IN TELEGRAM
Modern machine learning python application:
Гонять кур с газона.
Гонять кур с газона.
🔥43💩1
Forwarded from Меня заставили создать канал
Дельфин унижает робо-собаку без регистрации и смс:
https://twitter.com/d0tslash/status/1555326302462394370
https://twitter.com/d0tslash/status/1555326302462394370
X (formerly Twitter)
KF (@d0tslash) on X
Good news! Remember that robot dog you saw with a gun!? It was made by @UnitreeRobotics. Seems all you need to dump it in the dirt is @flipper_zero. The PDB has a 433mhz backdoor. No need for @gnuradio! https://t.co/xjDepcGYe2 cc/ @UnitreeRobot007 @IrvingRobotics…
🔥6
Forwarded from Бодя в Проде | Геймификация и спецпроекты
This media is not supported in your browser
VIEW IN TELEGRAM
Неочевидных игровых механик пост
Взрыв эмоций каждый раз, когда натыкаюсь на гениальные и простые игровые механики, переосмысляющие привычные нам вещи.
Пример — вот вроде бы клавиатура, используется для управления в играх, wasd и все дела. А что если изменить привычный UX и сделать клавиатуру частью геймплея? — БУМ, магия 🧚♀️
Поиграться можно тут
Увидел тут
За наводку спасибо Витале Веберу 😘
Взрыв эмоций каждый раз, когда натыкаюсь на гениальные и простые игровые механики, переосмысляющие привычные нам вещи.
Пример — вот вроде бы клавиатура, используется для управления в играх, wasd и все дела. А что если изменить привычный UX и сделать клавиатуру частью геймплея? — БУМ, магия 🧚♀️
Поиграться можно тут
Увидел тут
За наводку спасибо Витале Веберу 😘
🔥45
Forwarded from Иван
Чилийский художник PEPEGR∆PHIX - большой любитель ретро игр. Он придумал своего персонажа и таким образом пародирует рекламу со старых японских журналов 80-х. Выглядит очень атмосферно. 🔥🧡
🔥38