首页
社区
课程
招聘
[原创]android-ndk-r12版本编译器release优化错误
2016-10-9 19:07 5823

[原创]android-ndk-r12版本编译器release优化错误

2016-10-9 19:07
5823
几个月以前发现的一个bug,然后一直没写出来。今天android studio更新android ndk bundle的时候才想起来,然后用r13版本的ndk测试了一下,已经不存在这个毛病了,至于r12之前的版本,没有挨个测试,r10d版本没有这个问题。
自己的源代码出bug是常事,编译器出问题还是头一次碰到,算是给自己提个醒。
进入正题:
已测试平台:linux,mac
ndk版本:r12
bug描述:release代码优化出错,debug版结果正常
代码见附件:sample.7z

#准备部分代码,如果测试平台为mac,请自行替换为android-ndk-r12-darwin-x86_64.zip
7z x sample.7z && 
wget https://dl.google.com/android/repository/android-ndk-r12-linux-x86_64.zip &&
unzip android-ndk-r12-linux-x86_64.zip

#===================================================
#release版本测试,确保已连上模拟器或者已开启开发者模式的android手机
android-ndk-r12/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_LIBS_OUT=./bin clean > /dev/null && 
android-ndk-r12/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_LIBS_OUT=./bin APP_OPTIM=release APP_ABI=armeabi > /dev/null &&
adb push bin/armeabi/third /data/local/tmp > /dev/null &&
echo -e "\n=========================\nrelease version result:" && 
adb shell su -c "chmod 755 /data/local/tmp/third && /data/local/tmp/third"

#===================================================
#debug版本测试
android-ndk-r12/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_LIBS_OUT=./bin clean > /dev/null && 
android-ndk-r12/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_LIBS_OUT=./bin APP_OPTIM=debug APP_ABI=armeabi > /dev/null &&
adb push bin/armeabi/third /data/local/tmp > /dev/null &&
echo -e "\n=========================\ndebug version result:" && 
adb shell su -c "chmod 755 /data/local/tmp/third && /data/local/tmp/third"

很蛋痛的一个问题,位于代码141行的printf只要打印内容,结果就正常了,所以说一直用输出定位bug在这里面就很让人迷茫了,有输出就正常,没输出就不正常,让我怎么分析嘛。还有就是134行开始的memcpy,用memcpy函数进行赋值也没问题,只有用等号赋值会出现问题

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 110
活跃值: (107)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
Erriy 1 2016-10-9 19:10
2
0
唉?是不是发错版了?发完才发现windows?可这也不算是android安全范畴吧
雪    币: 53
活跃值: (260)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
netsniffer 2016-10-10 12:50
3
0
是gcc编译器优化的问题,它把这两行优化掉了,可以反编译观察
    tc->saddr   = ip->saddr;
    tc->daddr   = ip->daddr;
你要换成memcpy就没问题,可以反编译后对比

用clang没问题,gcc的优化挺坑的
set NDK_TOOLCHAIN_VERSION=clang
call ndk-build.cmd
雪    币: 215
活跃值: (125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
deadlydk 2016-10-17 11:05
4
0
呀,活捉一只毛哥,我上次遇到类似的加了printf之后正常的问题也是改用memcpy才可以的,似乎编译器对于局部变量的优化有一些问题?
游客
登录 | 注册 方可回帖
返回