2015-07-11 2 views
1

Можно ли использовать 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

+0

'v [len]' typo .. – BLUEPIXY

+0

... либо это, либо, 'memcpy (v, str.data, str.len + 1);' –

+0

Хотя то, что вы предлагаете, должно работать, почему бы просто не поддерживать null char в конце '.data' и использовать его (возможно, для' const char * ')? – Dmitri

ответ

3

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

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

От Glibc documentation из ALLOCA:

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

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

+0

Хмм, я нашел довольно слабую точку в «man alloca»: 'На многих системах alloca() не может использоваться внутри списка аргументов of a потому что пространство стека, зарезервированное alloca() , появится в стеке в середине пространства для функции arguments' Итак, что означает, что некоторые системы позволяют использовать alloca внутри аргументов? – user939407

+0

@ user939407 Слабая точка не на странице руководства, а на ваших навыках владения английским языком. –

+0

@ user939407 это означает, что вы не должны этого делать. – ouah

Смежные вопросы