a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

簡單分析針對ARM平臺的C語言程序的編譯問題

2020-01-26 14:47:53
字體:
來源:轉載
供稿:網友

  我們知道在C語言編譯時,有那么幾個常用的優化編譯選項,分別是-O0,-O1,-O2,-O3以及-Os。之前一直覺得既然是優化選項,頂多是優化一下邏輯,提高一些效率或者減少一下程序大小而已。很少會覺得它們會影響程序的最終結果。直到最近在ARM平臺上發現一個程序里的一個bug,才覺得這些優化選項有時候也沒那么智能。或者說針對ARM平臺,還沒有那么智能。
      首先看這么一段程序,此程序是我將問題簡單化的程序:

#include<stdio.h>#include<string.h>int main(){ char buffer[1024] = {0,1,2,3,4,5,6,7}; int iTest = 0x12345678; int *p = (int *)(buffer + 7); memcpy(p, &iTest, sizeof(iTest)); printf("%x/n", buffer[6]);  printf("%x/n", buffer[9]);  return 0;}

乍看之下,覺得這個程序沒啥問題。然后我們將此程序文件名稱叫point.c。然后分別用交叉編譯鏈進行如下編譯:

 arm-xxx-linux-gcc point.c -o point0 -O0 arm-xxx-linux-gcc point.c -o point1 -O1 arm-xxx-linux-gcc point.c -o point2 -O2

    最終再分別執行三個程序,結果卻有點出人意料:

 ./point0 6 34 ./point1 34 0 ./point2 6 0

    只有在-O0,也就是沒有優化的情況下,結果才和假想的一致。但是同樣的問題在x86平臺上卻沒有問題。
    于是我通過用以下命令,分別來生成不同優化選項下的匯編代碼,來確定在ARM平臺上編譯到底出了什么問題。

 arm-xxx-linux-gcc point.c -o point0.s -O0 -S arm-xxx-linux-gcc point.c -o point1.s -O1 -S arm-xxx-linux-gcc point.c -o point2.s -O2 -S

    然后對比三個匯編的代碼,發現問題出在memcpy這句話上。
    在point0.s中,程序是老老實實的調用的memcpy,然后就將0x12345678老老實實按照字節一個個的放到了buffer+7的位置。
    而在point1.s中程序則是沒有調用memcpy,而是用的語句:
    str        r3, [sp, #7]
    而此時r3中存儲的就是0x12345678;而由于我采用的ARM平臺是32位的,此語句執行時,地址線應該不會發生變化,所以最終的結果是buffer+4到buffer+7的數據被覆蓋了,而不是buffer+7到buffer+10的數據被修改。
    而在point2.s中,貌似又針對流水線進行了優化,程序執行順序會有所變化,在對buffer部分位置賦初值的順序是在str  r3, [sp, #7]之后,所以buffer+6處的數據反而是正確的6。
    分析到這兒,也許有人會說寫個簡單的程序,都會因為編譯的優化選項不同導致結果不同,那這memcpy是不是就不敢用了?
    其實一般只要有較好的編程習慣的話,都不會遇到此類問題,比如下面的程序:

#include<stdio.h>#include<string.h>int main(){ char buffer[1024] = {0,1,2,3,4,5,6,7}; int iTest = 0x12345678; char *p = buffer + 7; memcpy(p, &iTest, sizeof(iTest)); printf("%x/n", buffer[6]);  printf("%x/n", buffer[9]);  return 0;}

    這段程序其實只是簡單的改變了p的類型,就能保證在各種優化下,結果都一樣。可見好的編程習慣是有多么的重要。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 国产精品美女久久久久高潮 | 狠狠操夜夜操 | 在线成人免费视频 | 久久国产精品视频观看 | 欧美一级免费 | 夜夜操com| 国产精品视频久久久 | 久久精品欧美一区二区三区不卡 | 婷婷综合 | 午夜视频网 | 精品一区二区三区视频 | 日韩欧美二区 | 精品国产乱码一区二区三 | 中文字幕亚洲区 | 欧美日韩国产高清视频 | 国外成人在线视频网站 | av男人天堂网| 午夜www | 日韩欧美国产视频 | 亚洲一区中文字幕 | 日韩在线高清视频 | 国产一页 | 成人做爰69片免费 | 6080亚洲精品一区二区 | 一区二区国产在线 | 久久精品小视频 | 三级在线观看视频 | 亚洲一区在线视频 | 亚洲视频中文字幕 | 国产日韩欧美在线 | 亚洲一区二区三区日韩 | 99精品欧美一区二区三区综合在线 | 日本视频一区二区三区 | 草久视频| 亚洲一区高清 | 欧美精品成人 | 成人黄视频在线观看 | 国产精品国产成人国产三级 | 国产成人午夜高潮毛片 | 久久99精品久久久久久久 | 在线观看中文 |