IOS EXC_BAD_INSTRUCTION而“int y = 0;”

时间:2011-10-04 08:29:28

标签: objective-c exception

我在UIViewController-inheritor类上下文中有这个调用:

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

    startTimers();
}

startTimers声明为:

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

    // some other codes here
}

HELL正在进行什么?

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。:arch是Standart(armv6 armv7)。如果我设置优化(armv7),则没有任何变化。

2 个答案:

答案 0 :(得分:1)

也许你不小心弄坏了你的筹码。当您将startTimers()代码放在程序的其他位置时会发生吗?

尝试使用NSZombieEnabled和静态分析器查找代码中的其他位置,您可能会产生内存管理错误,这可能导致写入堆栈变量无效(堆栈上的数据溢出,指针错误等)

如果您可以使用该选项,您也可以尝试切换编译器,在极少数情况下您会遇到编译器错误。

答案 1 :(得分:0)

我认为这里存在编译器问题。现在,距您提出问题已有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