2015-03-30 4 views
0

libmemcached documentation имеет эту заметку:Распределение на основе стека не рекомендуется?

вы можете избежать использования memcached_create (3) или memcached_clone (3) с выделением стека на основе. Наиболее распространенными проблемами, связанными с безопасностью ABI , являются структуры, выделенные кучами.

Как мне его понять? Стенды в этом случае ABI для Application Binary Interface? Я хотел бы предоставить указатель на структуру для memcached_clone() из переменной в области локальных функций. Это безопасно?

Пример - это код ОК?

foo() 
{ 
    memcached_st clone_memc; 

    memcached_clone(&clone_memc, master_memc); 

    // some memcache function calls (get/set) 
    ... 

    memcached_free(&clone_memc); 
} 

ответ

0

Да, ABI означает application binary interface.
Я могу думать о трех причинах, чтобы избежать распределения стека. В порядке возрастания актуальности:

Stack smashing при переполнении может быть более простым в использовании, чем переполнение кучи.
Срок службы распределения заканчивается, когда объем создаваемой функции оставлен, не учитывая этого, это довольно распространенная ошибка для начинающих C.
Ограничения на размер стека, как правило, довольно малы (~ 8kb), выделение значительных объемов хранилища в стеке может переполнить его.

+0

Это далеко не влияет на меня. Этот вопрос был задан, потому что я использую memcached в MySQL UDF, и как только вы привыкаете к C++, больно писать в чистом C –