需要避免的MYSQL客戶機程式設計錯誤

2021-04-14 00:44:06 字數 1707 閱讀 2054

本文討論一些常見的mysqlc api 程式設計錯誤,以及如何避免其發生(這些問題在mysql郵件清單中會周期性地突然出現)。

1. 錯誤1——使用未初始化的連線處理程式指

我們已經通過傳遞null 引數呼叫了mysql_ i n i t ( ),這就是讓它分配並且初始化mysql 結構,然後返回乙個指標。另外一種方法是將指標傳遞到乙個已有的mysql 結構中。在這種情況下, mysql_init() 會將結構初始化並返回乙個指標,而不必自己分配結構。如果要使用第二種方法,則要小心會出現一些微妙的問題。下面的討論指出了需要注意的一些問題。如果將 乙個指標傳遞給mysql_ init( ),它應該實際指向某些東西。看下面的**段:

這 個問題是,mysql_init() 得到了乙個指標,但指標沒有指向所知的任何地方。conn 是乙個區域性變數,因此在main() 開始執行時它是乙個能指向任何地方的未初始化的儲存器,這就是說mysql_init() 將使用指標,並可在記憶體的一些任意區域濫寫。如果幸運的話, conn 將指向您的程式位址空間的外部,這樣,系統將立即終止,使您能盡早意識到**中出現的問題。

如果不幸的話, conn 將指向程式中以後才使用的一些資料的內部,直到再次使用那個資料時才發現問題。因此實際出現問題的地方遠比執行程式時出現的問題多,也更難捕捉到。下面是一段有問題的**:

此 時, conn 是乙個全域性變數,因此在程式啟動前,將它初始化為0(就是null)。mysql_init() 遇到null 引數,因此初始化並分配乙個新的連線處理程式。只要將conn 傳遞給需要非null 連線處理程式的mysqlcapi 函式,系統就會崩潰。這些**段的修改就是確保conn 有乙個可知的值。例如,可以將它初始化到已經分配的mysql 結構位址中去:

然而,推薦的(較容易的!)解決方案僅僅是將null 顯式地傳遞給mysql_ init( ),讓該函式分配mysql 結構,並將返回值賦值給conn:

無論如何不要忘記檢驗mysql_init() 的返回值,以確保它不是null。

2. 錯誤2——有效結果集檢驗的失敗

請記住檢查希望得到的結果集的呼叫狀態。下面的**沒有做到這一點:

不幸地是,如果mysql_store_result() 失敗,res_set 為null,while 迴圈也不執行了,應測試返回結果集函式的返回值,以確保實際上在進行工作。

3. 錯誤3—— null 列值引起的失敗

不要忘記檢查mysql_fetch_row() 返回的陣列mysql_row 中列值是否為null 指標。如果row[i] 為null,則在一些機器上,下面的**就會引起崩潰:

該 錯誤危害最大的部分是,有些printf() 的版本很寬容地對null指標輸出了「( null )」,這就使錯誤很容易逃脫而沒有把錯誤定位。如果把程式給了朋友,而他只有不太寬容printf( )版本,程式就會崩潰,您的朋友會認為您是個無用的程式設計師。迴圈應該寫成下面這樣:

不需要檢查列值是否為null 的惟一一次是當已經從列資訊結構確定is _ not _ null( )為真時。

4. 錯誤4——傳遞無意義的結果緩衝區

需要您提供緩衝區的客戶機庫函式通常要使這些緩衝區真正存在,下面的**違反了這個規則:

問題是什麼呢?to_str 必須指向乙個存在的緩衝區,而在這個樣例中沒有,因此,它指向了隨意的位置。不要向mysql_escape_string 傳遞無意義的指標作為to_str 引數,否則它會恣意踐踏記憶體。

瘦客戶機的前世今生

最初,人們排隊等待將自己的程式錄入機器,然後執行,機房門前排起來了長隊,直到終端出現!終端的物理形式很多種,常見的終端可以通過一條線欖接入主機 邏輯上,此時多處理機制大規模應用,在序列處理器上,通過分時機制模擬出了乙個並行處理的假象,如此一來,多個終端前的使用者就可以同時工作。隨著計算需求的增加和多...

windows客戶機連線gerrit的乙個報錯處理

gerrit環境部署在linux伺服器,windos客戶機連線gerrit進行 操作 在 git bash 裡使用 ssh keygen t rsa c wangshibo zhongho.com 產生公私鑰 將公鑰上傳到gerrit上 wangshibo賬號下,註冊賬號是wangshibo zho...

windows客戶機連線gerrit的乙個報錯處理

gerrit環境部署在linux伺服器,windos客戶機連線gerrit進行 操作 在 git bash 裡使用 ssh keygen t rsa c wangshibo zhongho.com 產生公私鑰 將公鑰上傳到gerrit上 wangshibo賬號下,註冊賬號是wangshibo zho...