IOS EXC_BAD_INSTRUCTION, в то время как "int y = 0;" - PullRequest
2 голосов
/ 04 октября 2011

У меня есть этот вызов в контексте класса-наследника UIViewController:

+ (void) smthPressed: (id) caller
{
    // some code here
    // ...

    startTimers();
}

startTimers объявлен как:

inline void startTimers()
{
    NSString * x = @""; // falls here with EXC_BAD_INSTRUCTION

    // some other codes here
}

Что, черт возьми, происходит?

P.S:.

inline void startTimers()
{
    int x = 0;

    int y = 0; // EXC_BAD_INSTRUCTION here. Stack couldn't end there!

    // ...

P.P.S:.

Документация гласит: «Для большинства исключений доступа, не связанных с памятью (например, EXC_BAD_INSTRUCTION ...)», поэтому это НЕ ошибка доступа к памяти.

P.P.P.S .: арка Стандарт (armv6 armv7). Ничего не изменится, если я установлю Оптимизированный (armv7).

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Возможно, вы случайно испортили свой стек.Происходит ли это, когда вы размещаете код startTimers() в другом месте вашей программы?

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

Вы также можете попробовать переключить компиляторы, если эта опция доступна вам, в крайне редком случае, когда вы нажимаетеошибка компилятора.

0 голосов
/ 20 июля 2018

Я думаю, что здесь проблема с компилятором. Теперь, через 6 лет после того, как вы подняли проблему, я не смогу получить ваш исходный код для его компиляции. Это до ключевого слова static. Следующий код компилируется и работает нормально:

#import "ViewController.h"

@interface ViewController () 

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [ViewController smthPressed:self];
}

// Without the "static" keyword compile fails
static inline void fakeStartTimers() {
    int x = 0;
    int y = 0;
    printf("x and y are %d %d", x, y);
}

+ (void)smthPressed:(id) caller
{
    fakeStartTimers();
}

@end

Это с компилятором

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang --version
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...