首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

代碼加密:糟糕的寫法也是一種加密——維護噩夢實錄

     編輯:關於C++

前言:維護地獄的真實體驗

最近接連維護兩個極其惡心的專案,一個 C++、一個 C#,全是網路相關。每次看到這種代碼,第一反應都是「重寫吧」,但管理層總以「穩定性」、「人員適應」為由駁回。結果?接下來幾個月我被這堆屎山纏身,痛苦不堪。

案例一:C++ 專案——全域緩衝區的指針算術地獄

所有訊息處理函數統一簽名:void xxxx(void* pData)。函數內部全是指針強轉、偏移、讀寫交織:

int* pxx = (int*)pData;
pxx = XXX(sss);
pData += sizeof(int);
SH_XXX* pshxx = (SH_XXX*)pData;
Mxxxk(pshxx, xxxixx);
// ...
Send(g_Buf); // 所有函數最後都發送同一個全域緩衝區

痛點:

  • 讀寫同一全域緩衝區,偏移前後跳躍,極易出錯。
  • 調試時一不小心指針跑飛,完全不知道跑哪去了。
  • 無任何封裝、型別安全、邊界檢查,純靠程式員「小心」。

案例二:C# 專案——繼承鏈與代理函數的無限套娃

類別結構:

Code
DoubleCode : Code
ThreeCode : DoubleCode
SessionCode : ThreeCode  // 筆者原文寫 TreeCode,疑為筆誤
StreamCode : SessionCode

每層只加一個屬性,使用時不斷 base.xxx、型別轉換。執行緒啟動:

Thread th = new Thread(new ThreadStart(base.Receive)); // 基類方法
// base.Receive 又呼叫子類 DealCode 處理訊息

到處都是「代理函數」——只做單純轉呼叫:

void Doxxx(object data) { xxxx.Doxxx(data); }
xxxx.Doxxxx(object data) { yyyy.Doxxx(data); }
yyyy.Doxxxx(object data) { base.xxxx(data); }

疑問:這是為了規範?還是故意混淆視聽防止被維護?

程式員的絕望與「代碼加密」靈感

每天工作 12+ 小時,維護這種代碼簡直是折磨。突發奇想:把所有識別符(類名、方法名、變數名、參數名)全改成隨機亂碼,不就是最強加密?

void sekrj394329428 siweuirweiru234oodk(vdkdfnsdflk23dfkj dkf8s0fd0dsf, dsfklsdfklje sdfjffjj) {
    dkf8s0fd0dsf.sl3n34klsfkljdsklfjl();
    sfnekr234l324j = sdfjffjj.skjl3j4klj32lkj();
    // ...
}

正準備寫工具實現,發現 Xenocode.Fox 已經把庫搞成這樣了。不過我還是想基於 System.CodeDom 自己寫一個,更個性化、更好玩。

結語

糟糕的代碼不僅是技術債,更是對維護者的人身攻擊。若你有重構權限,請果斷動手;若無,請保護好自己的身心健康——趁早離開才是正解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved