亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 5436 | 回復: 22
打印 上一主題 下一主題

[C] 騷年,千萬別偷懶啊! [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-12-03 02:07 |只看該作者 |倒序瀏覽
本帖最后由 大眾推薦 于 2014-12-03 14:48 編輯

話說。。。。2年前開始寫的一個服務器程序,一年前上線,跑了一整年,沒有掛過,前段時間剛小得意了一下。。。

結(jié)果,3周前,悲劇了。。
在過去3周里,掛了8,9次。。。。!

由于是跑在公網(wǎng)上正處于服務期的,加上很久沒怎么看過那份代碼。。。再加上自己近來比較忙,也懶。。。。。種種原因。。。。
反正斷斷續(xù)續(xù)的跟了3,4天,根本不知道是怎么回事。。。。。
而且自己記得最近沒怎么改這份代碼。。。

從3天前開始,實在是無法容忍了,于是乎gdb,strace什么的都用上了,雖然coredump大致定位了位置并提示是訪問了非法內(nèi)存,
但仔細看了該部分的代碼還是沒有找到具體的問題。。。。

可以肯定的是,出現(xiàn)問題的哪行代碼是很久沒改過了。。。
反復閱讀了這部分代碼,實在是沒問題。。。而且這部分代碼跑了1整年了,都沒有CRASH過。。。

這不科學。。。。!

仔細回想,大概在1個多月前,曾經(jīng)嘗試優(yōu)化一下HASH TABLE。。。。
于是,看了一下這部分代碼,也對比了一下之前的版本。。。。還是沒有發(fā)現(xiàn)代碼有問題。。。。

不過aaaaa.c 有類似這樣的一個地方:
struct A* a (void)
{
#if XXX
      return aa();
#else
      return bb();
#endif
}

其中,之前代碼只有 aa(),其他函數(shù)也只是直接調(diào)用 aa();
而 bb()是為了測試某一樣東西加而加的,
而為了這個測試,a()也是后來加的。

由于之前吃過一次虧,所以趕緊找aaaaa.h來看,果然是沒有聲明a(void)!!!!!

-----------------------------------------------------
背景交代完畢,

A.由于a()返回的是一個malloc()出來的內(nèi)存指針。
B.我沒有在頭文件中聲明函數(shù)的返回類型(一般不會出現(xiàn)這種不聲明返回類型的情況,除非是。。。有時候太HIGH了,根本就不記得了。。,而自己又不是每次都會清空編譯時候的WARNING)。
C.C返回的默認指針,是只有32BIT的。前面的32BIT會自動CUT掉。
D.跑的服務器是64BIT的。

于是乎,當某個時刻malloc()出來的內(nèi)存地址,其前面的32BIT不全為0的時候,而系統(tǒng)已經(jīng)CUT掉了前面的32BIT,那么剩下了的地址就肯定不是我們想要的。。。。
或者說,在linux(UBUNTU AMD 64)中,調(diào)用隱式聲明的API,返回默認是一個32位的INT,而接收這個返回值的時候,會轉(zhuǎn)換這個返回值為指針,并自動補齊高32BIT的值
(貌似是,如果返回值的最高位是1,則全部補0XFFFFFFFF,如果返回值的最高位為0,則全部補0)

所以,當返回的地址第31-63 BIT(不是第32BIT開始,而包括31)不全為0的時候,自動補齊得出的地址,就肯定不對。。。這個時候去訪問,就掛了。。。

-----------------------------------------------------
告誡各位新人,以后寫代碼,千萬不要偷懶。。。
1.不可不聲明全局函數(shù)。特別地,當返回值是一個指針的時候,+你跑的是64位的系統(tǒng)的時候。。。。。
2.不可放過編譯時候的任何一個warning.當然,-Wall是必須的。



論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
2 [報告]
發(fā)表于 2014-12-03 08:16 |只看該作者
不看警告,自作孽不可活

論壇徽章:
59
2015年亞洲杯之約旦
日期:2015-01-27 21:27:392015年亞洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵節(jié)徽章
日期:2015-03-06 15:50:392015年亞洲杯之阿聯(lián)酋
日期:2015-03-19 17:39:302015年亞洲杯之中國
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03雙子座
日期:2014-12-10 21:39:16處女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [報告]
發(fā)表于 2014-12-03 08:17 |只看該作者
B.我沒有在頭文件中聲明函數(shù)的返回類型(一般不會出現(xiàn)這種不聲明返回類型的情況,除非是。。。有時候太HIGH了,根本就不記得了。。,而自己又不是每次都會清空編譯時候的WARNING)。
<< Warning 一定要當做錯誤處理
C.C返回的默認指針,是只有32BIT的。前面的32BIT會自動CUT掉。
<< 很神奇, 還有這種編譯器(Intel 64Bit的話, 返回值應當在RAX中, 足夠64位, 64位的話, void *返回32位只能說是編譯器的Bug)

論壇徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16賽季CBA聯(lián)賽之青島
日期:2016-07-05 12:36:0515-16賽季CBA聯(lián)賽之廣東
日期:2016-06-29 11:45:542015亞冠之全北現(xiàn)代
日期:2015-07-22 08:09:472015年辭舊歲徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39獅子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技術(shù)圖書徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [報告]
發(fā)表于 2014-12-03 08:45 |只看該作者
回復 3# folklore
我猜,他的意思是,對于C89,如果省略返回類型的聲明,則返回類型默認為int類型。比如 main(),等同于 int main(...)。
而在他的平臺上,int只有32bits,而指針有64bits。

求職 : 機器學習
論壇徽章:
79
2015年亞洲杯紀念徽章
日期:2015-05-06 19:18:572015七夕節(jié)徽章
日期:2015-08-21 11:06:172015亞冠之阿爾納斯爾
日期:2015-09-07 09:30:232015亞冠之薩濟拖拉機
日期:2015-10-21 08:26:3915-16賽季CBA聯(lián)賽之浙江
日期:2015-12-30 09:59:1815-16賽季CBA聯(lián)賽之浙江
日期:2016-01-10 12:35:21技術(shù)圖書徽章
日期:2016-01-15 11:07:2015-16賽季CBA聯(lián)賽之新疆
日期:2016-02-24 13:46:0215-16賽季CBA聯(lián)賽之吉林
日期:2016-06-26 01:07:172015-2016NBA季后賽紀念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16賽季CBA聯(lián)賽之浙江
日期:2017-07-18 13:41:54
5 [報告]
發(fā)表于 2014-12-03 08:48 |只看該作者
公司一般會要求消除所有的編譯器告警信息,這個是編碼規(guī)范啊。
可是我也幾乎從不消除編譯器告警。

論壇徽章:
0
6 [報告]
發(fā)表于 2014-12-03 09:49 |只看該作者
C.C返回的默認指針,是只有32BIT的。前面的32BIT會自動CUT掉。
<< 很神奇, 還有這種編譯器(Intel 64Bit的話, 返回值應當在RAX中, 足夠64位, 64位的話, void *返回32位只能說是編譯器的Bug)


>>嚴格來說,應該是 接受到的,比如說 char* p = aa();
我們看到的p 的值還是64BIT的,但是只有低位的32BIT是對的,高位的32BIT是錯的。

個人理解,沒有深入探究。

回復 3# folklore


   

論壇徽章:
0
7 [報告]
發(fā)表于 2014-12-03 09:51 |只看該作者
恩,對。。。

回復 4# bruceteen


   

論壇徽章:
0
8 [報告]
發(fā)表于 2014-12-03 09:55 |只看該作者

有時候,午夜,四周很安靜,
喝了2口白酒或者其它。。。
在實現(xiàn)一個新功能什么的。。。。

反正,就是大腦很HIGH的時候。。。。
只管看結(jié)果。。根本就不會去看WARNING。。。。
一般而言,我會在2-4周左右集中clean up一下。。。。
。。。。嗯,反正這個不是好習慣。。

hellioncu 發(fā)表于 2014-12-03 08:16
不看警告,自作孽不可活

論壇徽章:
0
9 [報告]
發(fā)表于 2014-12-03 10:14 |只看該作者
騷年,這不是好習慣啊。。。。得改。。。

回復 5# zsszss0000


   

論壇徽章:
0
10 [報告]
發(fā)表于 2014-12-03 10:33 |只看該作者
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP