1. 程式人生 > 實用技巧 >gcc4.8.5下strncpy的坑

gcc4.8.5下strncpy的坑

一直以來都很中意strncpy,沒想到會在升級gcc版本後出現巨坑。

使用場景是對串a開頭幾個字元做刪除處理,假如有以空格開始的串,要求去掉空格,一般是自身拷貝,相當於對陣列成員進行移位。

strncpy(a, a+n, strlen(a)-n)

像這個情況,在gcc4.8.5版本下,編譯成32位的應用,字元拷貝就會出問題;編譯成64位的應用不會有出這種bug。原因可能是gcc4.8.5的X86優化出現的問題。

centos7.4,gcc4.8.5實測如下:

int main ()
{
  char str0[10]="123456789";
  char str1[512]= " IIP:123.112.154.118;LIP:192.168.118.107;MAC:54EE750B1713;HD:TF655AY91GHRVL23466SDGG;PCN:XXJSB-ZHUANGSHUANG;CPU:BFEBFBFF004065
"; char str2[240]; char str3[40]; int len = strlen(str1); /* copy to sized buffer (overflow safe): */ strncpy (str2, str1+1, len-1); strncpy(str1, str1+1, len-1); str1[len-1] = 0; str3[5] = '\0'; /* null character manually added */ puts(str1); puts (str2); puts (str3); return 0; }

編譯

 gcc -m32 test.cpp -o test

執行結果:

如果編譯時候不加-m32,那字元拷貝正常。

同時,其他場景的字元拷貝也是正常的,比如把串a內容拷貝給串b,也是正常的

strncpy(b, a, sizeof(b)-1);