crypt of decay - кстати, ещё о си, крестах и безопасном коде [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

кстати, ещё о си, крестах и безопасном коде [Jan. 17th, 2017|01:01 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
у меня есть подозрение, что оперный «баг», из‐за которого надо вставлять «-fno-delete-null-pointer-checks» — на самом деле снова проявление шибко глубокого компиляторного интеллекта.

падает оно внутри delete, куда попадает с NULL. а не должно. почему же компилятор мог убрать проверку на NULL? а потому что прямо перед этим там… ну, вот такое примерно:
for (int n = 0; n < smth.fuck.count; ++n) smth.fuck[n].fuckme();
delete smth.fuck[];
delete[] smth.fuck;

жопа в том, что цикл без охраны. а компилятор уверен, что программ с UB на свете не бывает. соответственно, программер гарантирует этим циклом, что `smth.fuck` ни перед, ни после цикла нулом быть не может. и проверка в заинлайненом delete идёт по пизде.

скорее всего, чтобы триггернуть эту «оптимизацию», нужны ещё какие‐то условия. а может это действительно просто баг в самом оптимизаторе. но может я и прав. но мне лень ставить туда охрану, я лучше флаг заебошу, мне так спокойней. мало ли, где ещё может подобный код быть.

да и флаг очень намекает на то, что я прав.


upd: пардон, не там скобки нарисовал. спасибо [info]tzirechnoy
Linkmeow!

Comments:
[User Picture]
From:[info]tzirechnoy
Date:January 17th, 2017 - 05:39 pm
(Link)
Можэт, просто потому, что delete smth.fuck[]; // с квадратными скобками в концэ -- некорректно само по себе?
[User Picture]
From:[info]ketmar
Date:January 17th, 2017 - 05:49 pm
(Link)
ну да, не там ебучие скобки поставил. не то, чтобы никогда не мог запомнить, куда их пихать — а даже и не старался. оперовцы тоже: они это в макрос завернули. а я по памяти хуйни написал. пардон.