我在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),则没有任何变化。
答案 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