Bug #155
closedПереименование функции clone()
0%
Description
Если тестовую систему, разработанную с помощью CTESK, скомпилировать под Linux как разделяемую библиотеку (.so), то при запуске теста возникает Segmentation fault.
Анализ проблемы показал, что дело в следующем.
В CTESK для клонирования объектов спецификационных типов используется функция clone (object.h). Проблема в том, что в Linux есть системный вызов clone, используемый для создания потоков:
#include <sched.h>
int clone (int (*fn) (void *), void *child_stack, int flags, void *arg);
Если тестовая система компилируется как динамическая библиотека, линкер сопоставляет символу clone адрес системного вызова, то есть при клонировании объекта вызывается функция создания нового потока, которая завершается с ошибкой, возвращая -1, который потом присваивается указателю на копию объекта. Дальнейшее понятно.
Не знаю, можно ли эту проблему решить флажками линковки. Мне было проще написать в файле object.h:
#define clone myClone
Предлагается изменить название функции clone на что-то более уникальное.
Updated by Alexey Demakov about 14 years ago
- Status changed from New to Rejected
- Assignee set to Alexey Demakov
В object.h эта проблема уже решена:
Object* clone_Object( Object* ref );
#ifndef ATL_CLONE_DISABLE
Object* clone( Object* ref );
#endif
Правильно использовать clone_Object, clone оставлен для обратной совместимости. В случае возникновения конфликтов необходимо убрать декларацию clone с помощью макроса ATL_CLONE_DISABLE