Project

General

Profile

Actions

Bug #155

closed

Переименование функции clone()

Added by Alexander Kamkin about 14 years ago. Updated over 13 years ago.

Status:
Rejected
Priority:
Normal
Target version:
-
Start date:
02/18/2010
Due date:
% Done:

0%

Estimated time:
Detected in build:
091215
Platform:
Linux x86
Published in build:

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 на что-то более уникальное.

Actions #1

Updated by Alexander Kamkin about 14 years ago

clone.h = object.h

Actions #2

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

Actions

Also available in: Atom PDF