WedX - журнал о программировании и компьютерных науках

alloca внутри составного оператора

можно ли использовать alloca внутри составного оператора? Пример:

typedef struct
{
    size_t len;
    char* data;
} string_t;

#define str_to_cstr(str) \
({ \
    char* v = alloca(str.len + 1); \
    v[len] = 0; \
    memcpy(v, str.data, str.len); \
})

// ... and somewhere in deep space
int main()
{
    string_t s = {4, "test"};
    printf("%s\n", str_to_cstr(s));
    return 0;
}

По моему опыту, это работает хорошо, но я не уверен, что это безопасно. Кстати, он скомпилирован с помощью gcc 4.8.4.

11.07.2015

  • ... либо так, либо, memcpy(v, str.data, str.len+1); 11.07.2015
  • Хотя то, что вы предлагаете, должно работать, почему бы просто не сохранить нулевой символ в конце .data и использовать его (возможно, привести к const char *)? 11.07.2015
  • Хотя это нормально, вам следует подумать об использовании массив переменной длины (VLA). Они были представлены с C99. 11.07.2015
  • Почему вы используете макрос вместо функции inline? Макрос ломает ваш код и без необходимости использует расширение gcc. 11.07.2015
  • Да, я знаю о VLA, но я пытался найти однолинейное решение. Inline здесь не подходит, так как alloca использует стек функции, из которой была вызвана alloca 11.07.2015

Ответы:


1

Небезопасно в вашем примере здесь:

 printf("%s\n", str_to_cstr(s));

Из документации glibc. аллока:

Не используйте alloca внутри аргументов вызова функции — вы получите непредсказуемые результаты, потому что пространство стека для alloca окажется в стеке посреди пространства для аргументов функции. Примером того, чего следует избегать, является foo (x, alloca (4), y).

Обратите внимание, что ({}) — это не составной оператор, а GNU C выражение оператора.

11.07.2015
  • Хм, я нашел довольно слабое место в man alloca: On many systems alloca() cannot be used inside the list of arguments of a function call, because the stack space reserved by alloca() would appear on the stack in the middle of the space for the function arguments Значит ли это, что некоторые системы позволяют использовать alloca внутри аргументов? 11.07.2015
  • @ user939407 это означает, что вы не должны этого делать. 12.07.2015
  • Новые материалы

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]