Warning: mkdir(): No space left on device in /var/www/tgoop/post.php on line 37

Warning: file_put_contents(aCache/aDaily/post/misha_writes_code/--): Failed to open stream: No such file or directory in /var/www/tgoop/post.php on line 50
Миша пишет код@misha_writes_code P.92
MISHA_WRITES_CODE Telegram 92
Миша пишет код
Что выведел код выше?
Правильный ответ: UB
(А значит может вывестись что угодно, даже "you stink" из ответа)

Причем не просто какое-то тайное неопределенное поведение, а переполнение signed int, будь он неладен.

Но в чем же дело? У нас же тут даже нет нигде интов

Весь прикол заключается в integer promotion. При операциях с типами, которые меньше инта и значения которых могут быть представлены интом, происходит promotion типа до int и операция выполняется в целых знаковых числах. А после этого происходит coercion обратно в исходный тип.

В нашем случае unsigned short - 2 байта, int - 4 байта. И значения [0, 65535] спокойно помещаются в int. Поэтому происходит promotion и данное умножение происходит в целых знаковых числах.

А 45'000 * 50'000 = 2'250'000'000 > INT_MAX = 2'147'483'647, поэтому происходит переполнения знакового числа, что является неопределенным поведением или UB.

Как не ошибиться?

В данном случае нам может помочь UB санитайзер:

clang -fsanitize=undefined code.c && ./a.out

Выдаст ошибку при запуске:
runtime error: signed integer overflow: 45000 * 50000 cannot be represented in type 'int'.

Больше по теме в статье
👍4🔥1



tgoop.com/misha_writes_code/92
Create:
Last Update:

Правильный ответ: UB
(А значит может вывестись что угодно, даже "you stink" из ответа)

Причем не просто какое-то тайное неопределенное поведение, а переполнение signed int, будь он неладен.

Но в чем же дело? У нас же тут даже нет нигде интов

Весь прикол заключается в integer promotion. При операциях с типами, которые меньше инта и значения которых могут быть представлены интом, происходит promotion типа до int и операция выполняется в целых знаковых числах. А после этого происходит coercion обратно в исходный тип.

В нашем случае unsigned short - 2 байта, int - 4 байта. И значения [0, 65535] спокойно помещаются в int. Поэтому происходит promotion и данное умножение происходит в целых знаковых числах.

А 45'000 * 50'000 = 2'250'000'000 > INT_MAX = 2'147'483'647, поэтому происходит переполнения знакового числа, что является неопределенным поведением или UB.

Как не ошибиться?

В данном случае нам может помочь UB санитайзер:

clang -fsanitize=undefined code.c && ./a.out

Выдаст ошибку при запуске:
runtime error: signed integer overflow: 45000 * 50000 cannot be represented in type 'int'.

Больше по теме в статье

BY Миша пишет код




Share with your friend now:
tgoop.com/misha_writes_code/92

View MORE
Open in Telegram


Telegram News

Date: |

3How to create a Telegram channel? Telegram Channels requirements & features With the sharp downturn in the crypto market, yelling has become a coping mechanism for many crypto traders. This screaming therapy became popular after the surge of Goblintown Ethereum NFTs at the end of May or early June. Here, holders made incoherent groaning sounds in late-night Twitter spaces. They also role-played as urine-loving Goblin creatures. With the administration mulling over limiting access to doxxing groups, a prominent Telegram doxxing group apparently went on a "revenge spree."
from us


Telegram Миша пишет код
FROM American