當前位置:首頁 » 編程語言 » 開發中的防禦性c語言編程
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

開發中的防禦性c語言編程

發布時間: 2022-10-08 13:04:23

㈠ 楚雄電腦培訓學校告訴你c語言編程技術的優勢和劣勢

隨著互聯網編程技術的不斷發展,現在大多數的軟體開發都是通過編程語言來實現的,今天我們就一起來了解一下C語言編程開發技術都有哪些優勢和劣勢。



C語言的一些好的體驗


一次通過閱讀POV-Ray源代碼學會如何在C語言中實現面向對象編程。


通過閱讀GTK+源代碼了解C語言代碼的清晰、干凈和可維護性。


通過閱讀SIOD和Guile的源代碼,知道如何使用C語言實現Scheme解析器。


使用C語言寫出GNOMEEye的初始版本,並對MicroTile渲染進行調優。


C語言的一些不好的體驗


在Evolution團隊時,很多東西老是崩潰。那個時候還沒有Valgrind,為了得到Purify這個軟體,需要購買一台Solaris機器。


調試gnome-vfs線程死鎖問題。


調試Mesa,卻無果。


接手Nautilus-share的初始版本,卻發現代碼裡面居然沒有使用free()。


想要重構代碼,卻不知道該如何管理好內存。


想要打包代碼,卻發現到處是全局變數,而且沒有靜態函數。


但不管怎樣,還是來說說那些Rust里有但C語言里沒有的東西吧。


自動資源管理


Rust從C++那裡借鑒了一些想法,如RAII(,資源獲取即初始化)和智能指針,並加入了值的單一所有權原則,還提供了自動化的決策性資源管理機制。


自動化:不需要手動調用free()。內存使用完後會自動釋放,文件使用完後會自動關閉,互斥鎖在作用域之外會自動釋放。如果要封裝外部資源,基本上只要實現Drop這個trait就可以了。封裝過的資源就像是編程語言的一部分,因為你不需要去管理它的生命周期。


決策性:資源被創建(內存分配、初始化、打開文件等),然後在作用域之外被銷毀。根本不存在垃圾收集這回事:代碼執行完就都結束了。程序數據的生命周期看起來就像是函數調用樹。


如果在寫代碼時老是忘記調用這些方法(free/close/destroy),或者發現以前寫的代碼已經忘記調用,甚至錯誤地調用,那麼以後我再也不想使用這些方法了。


泛型


Vec真的就是元素T的vector,而不只是對象指針的數組。在經過編譯之後,它只能用來存放類型T的對象。


在C語言里需要些很多代碼才能實現類似的功能,所以我不想再這么幹了。


trait不只是interface


Rust並不是一門類似那樣的面向對象編程語言,它有trait,看起來就像是里的interface——可以用來實現動態綁定。如果一個對象實現了Drawable,那麼就可以肯定該對象帶有draw()方法。


不過不管怎樣,trait的威力可不止這些。


依賴管理


以前實現依賴管理需要:


手動調用或通過自動化工具宏來調用g-config。


指定頭文件和庫文件路徑。


基本上需要人為確保安裝了正確版本的庫文件。


而在Rust里,只需要編寫一個Cargo.toml文件,然後在文件里指明依賴庫的版本。這些依賴庫會被自動下載下來,或者從某個指定的地方獲取。


測試


C語言的單元測試非常困難,原因如下:


內部函數通常都是靜態的。也就是說,它們無法被外部文件調用。測試程序需要使用#include指令把源文件包含進來,或者使用#ifdefs在測試過程中移除這些靜態函數。


需要編寫Makefile文件將測試程序鏈接到其中的部分依賴庫或部分代碼。


需要使用測試框架,並把測試用例注冊到框架上,還要學會如何使用這些框架。


衛生宏(HygienicMacro)


Rust的衛生宏避免了C語言宏可能存在的問題,比如宏中的一些東西會掩蓋掉代碼里的標識符。Rust並不要求宏中所有的符號都必須使用括弧,比如max(5+3,4)。


沒有自動轉型


在C語言里,楚雄北大青鳥http://www.kmbdqn.cn/發現很多bug都是因為在無意中將int轉成short或char而導致,而在Rust里就不會出現這種情況,因為它要求顯示轉型。


不會出現整型溢出


這個就不用再多作解釋了。


㈡ 什麼是C語言編程

C語言是國際上廣泛流行的,很有發展前途的計算機高級語言.它適合作為系統描述語言,即可用來編寫系統軟體,也可用來編寫應用軟體.

早期的操作系統等系統軟體主要是用匯編語言編寫的(包括 UNIX操作系統在內).由於匯編語言依賴於計算機硬體,程序的可讀性和可移植性都比較差.為了提高可讀性和可移植性,最好改用高級語言,但一般的高級語言難以實現匯編語言的某些功能(匯編語言可以直接對硬體進行操作),例如:對內存地址的操作,位操作等).人們設想能否找到一種既具有一般高級語言特性,又具有低級語言特性的語言,集它們的優點於一身.於是,C語言就在這種情況下應運而生了.

C語言是在B語言的基礎上發展起來的,它的根源可以追溯到ALGOL 60. 1960年出現的ALGOL 60是一種面向問題的高級語言,它離硬體比較遠,不宜用來編寫系統程序.1963年英國的劍橋大學推出了CPL(CombinedProgram- ming Language)語言.CPL語言在ALGOL 60的基礎上接近了硬體一些,但規模比較大,難以實現.1967年英國劍橋大學的Matin Richards對 CPL語言作了簡化,推出了BCPL(Basic Combined Programming Language)語言.1970年美國貝爾實驗室的 Ken Thompson以 BCPL語言為基礎,又作了進一步簡化,設計出了很簡單的而且很接近硬體的 B語言( 取 BCPL的第一個字母),並用 B語言寫第一個UNIX操作系統,在PDP-7上實現. 1971年在PDP-11/20上實現了B語言,並寫了UNIX操作系統.但B語言過於簡單,功能有限.1972年至 1973年間,貝爾實驗室的 D.M.Ritchie在B語言的基礎上設計出了C語言(取 BCPL的第二個字母).C語言既保持了BCPL和B語言的優點(精練,接近硬體),又克服了它們的缺點(過於簡單,數據無類型等). 最初的C語言只是為描述和實現UNIX操作系統提供一種工作語言而設計的.1973年,K.Thom- pson和D.M.ritchie兩人合作把UNIX的90%以上用 C改寫(UNIX第5版.原來的 UNIX操作系統是1969年由美國的貝爾實驗室的 K.Thompson和D.M.Ritchie開發成功的,是用匯編語言寫的).

後來,C語言多次作了改進,但主要還是在貝爾實驗室內部使用.直到1- 975年UNIX第6版公布後 ,C語言的突出優點才引起人們普遍注意.1977年出現了不依賴於具體機器的C語言編譯文本《可移植C語言編譯程序》,使C移植到其它機器時所做的工作大大簡化了,這也推動了UNIX操作系統迅速地在各種機器上實現.例如,VAX,AT&T等計算機系統都相繼開發了UNIX.隨著 UNIX的日益廣泛使用,C語言也迅速得到推廣.C語言和UNIX可以說是一對孿生兄弟,在發展過程中相輔相成.1978年以後,C語言已先後移植到大,中,小,微型機上,已獨立於UNIX和PDP了.現在C語言已風靡全世界,成為世界上應用最廣泛的幾種計算機語言之一.

以1978年發表的UNIX第7版中的C編譯程序為基礎,Brian W.Kernighan和 Dennis M.Ritchie(合稱K&R)合著了影響深遠了名著《The C Programming Lan- guage》,這本書中介紹的C語言成為後來廣泛使用的C語言版本的基礎,它被稱為標准C.1983年,美國國家標准化協會(ANSI)根據C語言問世以來各種版本對C的發展和擴充 ,制定了新的標准,稱為ANSI C.ANSI C比原來的標准C有了很大的發展.K&R在1988年修改了他們的經典著作《The C Progra- mming Language》 ,按照ANSI C的標准重新寫了該書.1987年,ANSI C又公布了新標准--87 ANSI C .目前流行的C編譯系統都是以它為基礎的.
=========
上面說的87ANSI C已經老了,
現在最新的標準是C98

㈢ 昆明北大青鳥分享C語言編程技術的優勢和劣勢

隨著互聯網編程技術的不斷發展,現在大多數的軟體開發都是通過編程語言來實現的,今天我們就一起來了解一下C語言編程開發技術都有哪些優勢和劣勢。



C語言的一些好的體驗


一次通過閱讀POV-Ray源代碼學會如何在C語言中實現面向對象編程。


通過閱讀GTK+源代碼了解C語言代碼的清晰、干凈和可維護性。


通過閱讀SIOD和Guile的源代碼,知道如何使用C語言實現Scheme解析器。


使用C語言寫出GNOME Eye的初始版本,並對MicroTile渲染進行調優。


C語言的一些不好的體驗


在Evolution團隊時,很多東西老是崩潰。那個時候還沒有Valgrind,為了得到Purify這個軟體,需要購買一台Solaris機器。


調試gnome-vfs線程死鎖問題。


調試Mesa,卻無果。


接手Nautilus-share的初始版本,卻發現代碼裡面居然沒有使用free()。


想要重構代碼,卻不知道該如何管理好內存。


想要打包代碼,卻發現到處是全局變數,而且沒有靜態函數。


但不管怎樣,還是來說說那些Rust里有但C語言里沒有的東西吧。


自動資源管理


Rust從C++那裡借鑒了一些想法,如RAII(Resource Acquisition Is Initialization,資源獲取即初始化)和智能指針,並加入了值的單一所有權原則,還提供了自動化的決策性資源管理機制。


自動化:不需要手動調用free()。內存使用完後會自動釋放,文件使用完後會自動關閉,互斥鎖在作用域之外會自動釋放。如果要封裝外部資源,基本上只要實現Drop這個trait就可以了。封裝過的資源就像是編程語言的一部分,因為你不需要去管理它的生命周期。


決策性:資源被創建(內存分配、初始化、打開文件等),然後在作用域之外被銷毀。根本不存在垃圾收集這回事:代碼執行完就都結束了。程序數據的生命周期看起來就像是函數調用樹。


如果在寫代碼時老是忘記調用這些方法(free/close/destroy),或者發現以前寫的代碼已經忘記調用,甚至錯誤地調用,那麼以後我再也不想使用這些方法了。


泛型


Vec真的就是元素T的vector,而不只是對象指針的數組。在經過編譯之後,它只能用來存放類型T的對象。


在C語言里需要些很多代碼才能實現類似的功能,所以我不想再這么幹了。


trait不只是interface


Rust並不是一門類似那樣的面向對象編程語言,它有trait,看起來就像是里的interface——可以用來實現動態綁定。如果一個對象實現了Drawable,那麼就可以肯定該對象帶有draw()方法。


不過不管怎樣,trait的威力可不止這些。


依賴管理


以前實現依賴管理需要:


手動調用或通過自動化工具宏來調用g-config。


指定頭文件和庫文件路徑。


基本上需要人為確保安裝了正確版本的庫文件。


而在Rust里,只需要編寫一個Cargo.toml文件,然後在文件里指明依賴庫的版本。這些依賴庫會被自動下載下來,或者從某個指定的地方獲取。


測試


C語言的單元測試非常困難,原因如下:


內部函數通常都是靜態的。也就是說,它們無法被外部文件調用。測試程序需要使用#include指令把源文件包含進來,或者使用#ifdefs在測試過程中移除這些靜態函數。


需要編寫Makefile文件將測試程序鏈接到其中的部分依賴庫或部分代碼。


需要使用測試框架,並把測試用例注冊到框架上,還要學會如何使用這些框架。


衛生宏(Hygienic Macro)


Rust的衛生宏避免了C語言宏可能存在的問題,比如宏中的一些東西會掩蓋掉代碼里的標識符。Rust並不要求宏中所有的符號都必須使用括弧,比如max(5 + 3, 4)。


沒有自動轉型


在C語言里,昆明北大青鳥http://www.kmbdqn.com/發現很多bug都是因為在無意中將int轉成short或char而導致,而在Rust里就不會出現這種情況,因為它要求顯示轉型。


不會出現整型溢出


這個就不用再多作解釋了。


㈣ C語言編程技術的優勢和劣勢

隨著互聯網編程技術的不斷發展,現在大多數的軟體開發都是通過編程語言來實現的,今天我們就一起來了解一下C語言編程開發技術都有哪些優勢和劣勢。



C語言的一些好的體驗


一次通過閱讀POV-Ray源代碼學會如何在C語言中實現面向對象編程。


通過閱讀GTK+源代碼了解C語言代碼的清晰、干凈和可維護性。


通過閱讀SIOD和Guile的源代碼,知道如何使用C語言實現Scheme解析器。


使用C語言寫出GNOMEEye的初始版本,並對MicroTile渲染進行調優。


C語言的一些不好的體驗


在Evolution團隊時,很多東西老是崩潰。那個時候還沒有Valgrind,為了得到Purify這個軟體,需要購買一台Solaris機器。


調試gnome-vfs線程死鎖問題。


調試Mesa,卻無果。


接手Nautilus-share的初始版本,卻發現代碼裡面居然沒有使用free()。


想要重構代碼,卻不知道該如何管理好內存。


想要打包代碼,卻發現到處是全局變數,而且沒有靜態函數。


但不管怎樣,還是來說說那些Rust里有但C語言里沒有的東西吧。


自動資源管理


Rust從C++那裡借鑒了一些想法,如RAII(,資源獲取即初始化)和智能指針,並加入了值的單一所有權原則,還提供了自動化的決策性資源管理機制。


自動化:不需要手動調用free()。內存使用完後會自動釋放,文件使用完後會自動關閉,互斥鎖在作用域之外會自動釋放。如果要封裝外部資源,基本上只要實現Drop這個trait就可以了。封裝過的資源就像是編程語言的一部分,因為你不需要去管理它的生命周期。


決策性:資源被創建(內存分配、初始化、打開文件等),然後在作用域之外被銷毀。根本不存在垃圾收集這回事:代碼執行完就都結束了。程序數據的生命周期看起來就像是函數調用樹。


如果在寫代碼時老是忘記調用這些方法(free/close/destroy),或者發現以前寫的代碼已經忘記調用,甚至錯誤地調用,那麼以後我再也不想使用這些方法了。


泛型


Vec真的就是元素T的vector,而不只是對象指針的數組。在經過編譯之後,它只能用來存放類型T的對象。


在C語言里需要些很多代碼才能實現類似的功能,所以我不想再這么幹了。


trait不只是interface


Rust並不是一門類似那樣的面向對象編程語言,它有trait,看起來就像是里的interface——可以用來實現動態綁定。如果一個對象實現了Drawable,那麼就可以肯定該對象帶有draw()方法。


不過不管怎樣,trait的威力可不止這些。


依賴管理


以前實現依賴管理需要:


手動調用或通過自動化工具宏來調用g-config。


指定頭文件和庫文件路徑。


基本上需要人為確保安裝了正確版本的庫文件。


而在Rust里,只需要編寫一個Cargo.toml文件,然後在文件里指明依賴庫的版本。這些依賴庫會被自動下載下來,或者從某個指定的地方獲取。


測試


C語言的單元測試非常困難,原因如下:


內部函數通常都是靜態的。也就是說,它們無法被外部文件調用。測試程序需要使用#include指令把源文件包含進來,或者使用#ifdefs在測試過程中移除這些靜態函數。


需要編寫Makefile文件將測試程序鏈接到其中的部分依賴庫或部分代碼。


需要使用測試框架,並把測試用例注冊到框架上,還要學會如何使用這些框架。


衛生宏(HygienicMacro)


Rust的衛生宏避免了C語言宏可能存在的問題,比如宏中的一些東西會掩蓋掉代碼里的標識符。Rust並不要求宏中所有的符號都必須使用括弧,比如max(5+3,4)。


沒有自動轉型


在C語言里,昆明北大青鳥http://www.kmbdqn.cn/發現很多bug都是因為在無意中將int轉成short或char而導致,而在Rust里就不會出現這種情況,因為它要求顯示轉型。


不會出現整型溢出


這個就不用再多作解釋了。


㈤ c語言防止優化

編譯器編譯命令里有設置選項,通過設置,你可以要求 不優化,也可以要求用哪種優化。
具體選項有哪些,要查自己編譯器的幫助文件。
例如,MS VC++ 6.0 編譯器編
優化選項:
/O1:優化使產生的可執行代碼最小
/O2:優化使產生的可執行代碼速度最快
/Oa:指示編譯器程序里沒有使用別名,可以提高程序的執行速度
/Ob:控制內聯(inline)函數的展開
/Od:禁止代碼優化
/Og:使用全局優化
/Oi:用內部函數去代替程序里的函數調用,可以使程序運行的更快,但程序的長度變長
/Op:提高浮點數比較運算的一致性
/Os:產生盡可能小的可執行代碼
/Ot:產生盡可能塊的可執行代碼
/Ow:指示編譯器在函數體內部沒有使用別名
/Ox:組合了幾個優化開關,達到盡可能多的優化
/Oy:阻止調用堆棧里創建幀指針

/O2 為了加速,會優化掉。 選 /Od 不優化。

㈥ 防禦性編程C語言代碼

#include<assert.h>char* strcpy(char* strDest, char* strSource)
{
int size1,size2;
size1=strlen(strDest);//也可用while判斷到'\0',size1++;
size2=strlen(strSource);//同上
assert((strDest != NULL) && (strSource != NULL)&& (size1>=size2)); // 防禦主要在於使用斷言,必須都是非空指針,而且Dest長度大於等於Source的長度才能繼續執行函數
byte *pbTo = (byte *) strDest; // 防止改變strDest 的地址
byte *pbFrom = (byte *) strSource; // 防止改變strSource 的地址
while(size1-- > 0 )
*pbTo ++ = *pbFrom ++ ;
*pbTo='\0';
return strDest;
}

㈦ 單片機和C語言編程學習之間有什麼聯系呢

在單片機開發過程中,經常用到C語言和匯編語言。
匯編語言是一種用文字助記符來表示及其指令的符號語言,是最接近機器碼的一種語言,其主要優點是佔用資源少,程序執行效率高,但是不同的CPU,其匯編語言可能有所差異,所以不易移植。C語言是一種結構化的高級語言,其優點是可讀性好,移植容易,是普遍使用的一種計算機語言,缺點是佔用資源較多,執行效率沒有匯編高。
對於目前使用的RISE架構的8位單片機來說,其內部ROM,RAM,STACK等資源都有限,如果使用C語言編寫,一條C語言指令編譯後,會變成很多條機器碼,很容易出現ROM空間不夠,堆棧溢出來等問題,而匯編語言,一條指令對應一條機器碼,每一步的執行動作都很清楚,並且程序大小和堆棧調用情況都容易控制,調試起來也比較方便。
C語言是一種編譯型程序設計語言,它兼顧了多種高級語言的特點,並具備匯編語言的功能。C語言有功能豐富的庫函數,運算速度快,編譯效率高,有良好的可移植性,而且可以直接實現對系統硬體的控制。此外,C語言程序具有完善的模塊程序結構,從而為軟體開發中採用模塊化程序設計方法提供了有力的保障。因此,使用C語言進行程序設計已成為軟體開發的一個主流,作為一個技術全面並涉足較大規模的軟體系統開發的單片機開發人員最好能夠掌握基本的C語言編程。
對於單片機的初學者來說,應該從匯編學起,可以加深初學者對單片機各個功能模塊的了解,從而打好扎實的基礎。

有興趣可以加951359927,一起學習探討單片機,還有免費的學習資料提供
上海靈訓IT教育

㈧ 編程開發必須要學C語言嗎

編程不一定非要學習C 語言。是否學習這個主要看你的方向了。

就純軟體來講(做web 開發,客戶端開發等),C 的優勢不大。畢竟是一種過程性語言,開發難度,代碼維護成本都比 JAVA, C# 等高級語言高上不少。當然,這個時候會一些 C 語言還是有加分的。比如目前最火的前端 nodejs,使用的就是 v8 引擎,就是 C 語言編程的,這時候會一些 c 語言可以幫助你快速定位問題。

偏向硬體的話(嵌入式,單片機,寫驅動程序),C 語言就是必學的了。目前流行的編程語言中,已知能夠操作硬體寄存器,內存的語言除了 C 就是匯編了(可能還有別的,但是這兩個是絕對的硬體操作主力語言)。匯編太晦澀難懂,所以大部分項目使用的是 C 來開發,匯編做輔助操作。

綜上所述,純軟體開發的話,會 c 語言開發是一個加分項,當然不會也沒太大的關系。但是偏硬體開發的話,C 語言必須是要掌握的。