2015-10-02 7 views
-1

Позвольте мне сначала сказать, что у меня очень ограниченные знания в программировании Objective C.Безопасная обработка кода пользователя Objective C с кодовой базы C

У меня есть C исполняемый файл, который вызывает в определяемой пользователем функции, написанные на Objective C.

при условии, что ничего может произойти в пользовательском коде, что бы быть лучшим способом, чтобы безопасно обернуть код так, чтобы функция C возвращает изящно?

В оболочке C++ я бы написал функцию try-catch для всех исключений, чтобы исключение C++ не распространялось на C-код, где поведение не определено стандартом C.

Я полагаю, что я должен сначала предотвратить исключение ObjC от пересечения границы языка (т.е. распространяться в код C), так что я бы написать обертку, как:

void objc_wrap(void) { 
    @try { 
     obj_entry(); 
    } 
    @catch (NSException *ex) { 
     // handle NSException 
    } 
    @catch (...) { 
     // handle the rest 
    } 
} 

Однако, мое ограниченное знание Язык не говорит мне, есть ли другие механизмы, которые бы заставили код пользователя пересечь границу модуля и вызвать неопределенное исключение.

Кроме того, любая инициализация/очистка среды выполнения Objective C, необходимая до вызова пользовательской функции, при условии, что точка входа является чистой C?

Примечание: Сигналы и выход() не должны обрабатываться, поскольку обертка выполняется в разветвленном процессе.

+0

Что вы подразумеваете под * кодом пользователя, пересекающим границу модуля *? – Caleb

+0

@Caleb Я имею в виду, что единственный разрешенный способ вернуться к базе кода C - 'return'; например, необработанные исключения будут эффективно пересекать границу и вызывать неопределенное поведение, потому что в стандарте C нигде не указано, что произойдет. Другим примером может быть «panic!()» В функции ржавчины, вызванной C. – Snaipe

+0

@zaph отредактировал вопрос для ясности. Является ли проблема более понятной? – Snaipe

ответ

1

Кажется, что на самом деле, @ try/catching user function - лучший способ предотвратить переход от языковых границ. В качестве бонуса любые исключения C++ также попадают в предложение @catch (...), поэтому не должно быть никаких проблем, если код Objective-C вызывает функции C++.