【发布时间】:2013-07-12 07:49:37
【问题描述】:
以下代码在 linux-x86、darwin-x86 上运行良好,但不适用于 ios-armv7。
正确的输出应该是:
m[0]:0.500000,v:0.500000
m[1]:0.500000,v:0.500000
m[2]:0.500000,v:0.500000
m[3]:0.500000,v:0.500000
m[4]:0.500000,v:0.500000
但我发现错误的输出:
m[0]:0.500000,v:0.500000
m[1]:0.500000,v:0.000000
m[2]:0.500000,v:0.000000
m[3]:0.500000,v:0.000000
m[4]:0.500000,v:0.000000
当它为 ios-armv7 构建时,我也发现了它的缺点:
[a] 删除函数'func',将函数体移动到'main'函数,它工作正常
[b] 将数组 'm[5]' 声明为 'double m[5]',它工作正常
[c] 将变量 'v' 设置为 'v = 0.5 或 v = sqrt(2.0f/8)',它工作正常
[d] 如果 gcc 优化选项是 '-O0',它可以正常工作,但是当它是 '-O1 或 -O2' 时,会出现错误输出
我的 iPad1 被破解了,所以我可以在我的 MacBook Air 上交叉编译一个可执行文件,然后将可执行文件“scp”到 iPad1 并运行它。以下是详细信息:
1. 在 Mac 上交叉编译一个可执行文件:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc -O1 -Wall -arch armv7 -mcpu=cortex-a8 -isysroot /Applications/Xcode.app/Contents/ Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include - D__IPHONE_OS__ -miphoneos-version-min=4.0 foo.c
2. 'scp' 可执行文件到 iPad
scp a.out mobile@192.168.1.106:~
3. 'ssh' 到 iPad
ssh mobile@192.168.1.106 #默认密码是'alpine'
4. 在 iPad 上运行 a.out
./a.out
#include <stdio.h>
#include <math.h>
int
func(int n) /* [a] */
{
int i;
float m[5]; /* [b] */
double v;
v = sqrt(2.0f/n); /* [c] */
for(i=0;i<5;++i) {
m[i]=v;
printf("m[%d]: %f, v: %f\n", i, m[i], v);
}
return 0;
}
int
main(int argc, char **argv)
{
return func(8);
}
你也可以在https://gist.github.com/ashun/5992120找到完整的代码
以下是程序集。你可以在命令'vim -d'的帮助下找到区别
- 前面代码的汇编,将数组'm[5]'声明为'double m[5]'
- 前面代码的汇编,将数组'm[5]'声明为'double m[5]'
【问题讨论】:
-
这看起来确实像编译器中的一个错误。也许您可以为
-O1案例添加func的生成程序集。循环可能会展开,在这种情况下,将5替换为2可能更合适,如果这样仍然会重现错误。 -
谢谢,我添加了示例代码的汇编。