All streams
Search
Write a publication
Pull to refresh
4
0

Пользователь

Send message
Пример с использованием __attribute__((cleanup (...) )) неправильный. Запуск такого кода завершится падением программы. Будет даже warning: attempt to free a non-heap object

Вот правильный пример:
#include <stdlib.h>

void myfree(void *ptr)
{
  free(*(void **)ptr);
}

int main(void)
{
  __attribute__((cleanup(myfree))) char *s = malloc(sizeof(*s));
  return 0;
}


Почему так — это описано в документации GCC: gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html см. cleanup (cleanup_function)
> Думаю, это состояние знакомо многим и не зависит от языка.

На самом деле очень даже зависит. Я, например, пишу в основном на Си, и не могу себе представить ситуацию вида
Кто я такой? Я программист на плюсах. Я пишу код на плюсах две трети жизни. Это действительно стало огромной частью моей самоидентификации. Почему я претендую на синиора? Потому что я успел отстрелить себе миллион ног и натаскать свою нейросеть в черепушке определять, какая нога отстрелена на этот раз, по отсвету дульной вспышки.

В Си нет ничего такого, чтоб там тратить две трети жизни на изучение, а потом еще рефлексировать в духе «ах как много времени ушло на изучения, и как все хреново». Нет, там конечно есть всякие приколы с UB, стрикт-алиасингом и прочим, но это всё меркнет на фоне того, что нагородили стандартизаторы крестов, особенно в последнем стандарте.
А что насчет Return-oriented Programming without Returns cseweb.ucsd.edu/~hovav/dist/noret.pdf? И как насчет setjmp/longjmp, будет ли это вообще работать при таком подходе? Придется вручную по-честному раскручивать стек вызовов вместо того, чтобы мгновенно перепрыгнуть?

Information

Rating
Does not participate
Registered
Activity