кстати, ещё о си, крестах и безопасном коде |
[Jan. 17th, 2017|01:01 pm] |
у меня есть подозрение, что оперный «баг», из‐за которого надо вставлять «-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: пардон, не там скобки нарисовал. спасибо tzirechnoy |
|
|
Comments: |
Можэт, просто потому, что delete smth.fuck[]; // с квадратными скобками в концэ -- некорректно само по себе?
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | January 17th, 2017 - 05:49 pm |
---|
| | | (Link) |
|
ну да, не там ебучие скобки поставил. не то, чтобы никогда не мог запомнить, куда их пихать — а даже и не старался. оперовцы тоже: они это в макрос завернули. а я по памяти хуйни написал. пардон. | |