硬編碼

硬編碼

徠硬編碼是將數據直接嵌入到程序或其他可執行對象的源代碼中的軟體開發實踐,與從外部獲取數據或在運行時生成數據不同。硬編碼數據通常只能通過編輯源代碼和重新編譯可執行文件來修改,儘管可以使用調試器或十六進位編輯器在內存或磁碟上進行更改。硬編碼的數據通常表示不變的信息,例如物理常量,版本號和靜態文本元素。另一方面,軟編碼數據對用戶輸入,HTTP伺服器響應或配置文件等任意信息進行編碼,並在運行時確定。

介紹


硬編碼要求程序的源代碼在輸入數據或所需格式發生變化時進行更改,以便最終用戶可以通過程序外的某種方式更改細節。
硬編碼通常是必需的,但也可以被認為是反模式。程序員可能沒有針對最終用戶制定的動態用戶界面解決方案,但仍然必須提供該功能或發布該程序。這通常是暫時的,但從短期來看,確實解決了交付代碼的壓力。稍後,進行軟編碼以允許用戶傳遞參數,該參數為最終用戶提供修改結果或結果的方式。
術語“硬編碼”最初被用作硬連線電路的類比,並且意在表達軟體設計和實現中使用它所產生的不靈活性。在諸如MUD之類的運行時可擴展協作開發環境的上下文中,硬編碼還指開發負責低級任務和執行腳本的系統的核心引擎,而不是開發高級腳本的軟編碼。系統在運行時解釋。在這種情況下,這個術語不是貶義的,而是指一般的發展,而不是專門嵌入輸出數據。

硬編碼和後門


硬編碼憑證是創建後門的一種流行方式。硬編碼憑證通常在配置文件和帳戶枚舉命令輸出中不可見,並且無法輕鬆更改(無需從源重建,如果源可用或逆向工程,二進位修改和完整性檢查(數字簽名,防篡改)和反作弊))旁路(可以通過EULA禁止)。

硬編碼和DRM


作為一項數字版權管理措施,軟體開發商可能會將一個序列號硬編碼到一個程序中。或者硬編碼一個公共密鑰是常見的,創建一個不可行的DRM來創建一個keygen。
在相反的情況下,軟體破解者可能會將有效的序列號硬編碼到程序中,甚至阻止可執行文件詢問用戶,從而允許未經授權的副本被重新分發而不需要輸入有效的號碼,從而共享相同的每個副本的密鑰,如果已經硬編碼。
修復安裝路徑。
如果Windows程序編程為假定它始終安裝到C:\ Program Files \ Appname,並且某人為了空間或組織原因嘗試將其安裝到其他驅動器,則可能無法安裝或在安裝后運行。在測試過程中可能無法識別此問題,因為普通用戶安裝到默認驅動器和目錄,測試可能不包括更改安裝目錄的選項。不過,程序員和開發人員不宜修復程序的安裝路徑,因為默認安裝路徑取決於操作系統,操作系統版本和系統管理員決定。例如,Microsoft Windows的許多安裝使用驅動器C:作為其主硬碟,但這不是保證。
早期計算機中的微處理器存在類似的問題,它開始在內存中的固定地址執行。

啟動磁碟


某些“複製保護”程序在啟動時在軟盤或快閃記憶體驅動器上查找特定文件,以驗證它們不是未經授權的副本。如果計算機被沒有軟盤驅動器的較新計算機所取代,無法運行需要它的程序,因為軟盤無法插入。
最後一個例子說明了為什麼硬編碼可能會變得不切實際,即使它看起來完全可以工作。在二十世紀八十年代和九十年代,絕大多數個人電腦至少配有一個軟碟機,但軟碟機後來沒有使用。如果不更新,15年前以這種方式硬編碼的程序可能會遇到問題。

特殊文件夾


一些Windows操作系統具有所謂的特殊文件夾,它們將文件邏輯地組織在硬碟上。硬編碼可能會出現問題:

簡介路徑

某些徠Windows程序將配置文件路徑硬編碼到開發人員定義的位置,如C:\ Documents and Settings \ Username。這是絕大多數Windows 2000或更高版本的路徑,但如果配置文件存儲在網路中或以其他方式重新定位,則會導致錯誤。獲取它的正確方法是調用GetUserProfileDirectory函數或解析%userprofile%環境變數。開發人員經常做出的另一個假設是假設配置文件位於本地硬碟上。

我的文檔文件夾路徑

某些Windows程序將“我的文檔”的路徑硬編碼為ProfilePath \ My Documents。這些程序可以在運行英文版的機器上運行,但在本地化版本的Windows上,這個文件夾通常有不同的名稱。例如,在義大利語版本中,我的文檔文件夾名為Documenti。我的文檔也可能已使用Windows 2000或更高版本中的組策略中的文件夾重定向進行重定位。獲得它的正確方法是調用SHGetFolderPath函數。

解決辦法


可以通過訪問“瀏覽文件”對話窗口來擴展名稱為“FileName”的間接引用,如變數內部的變數,如果文件移動,則程序代碼不必更改。在準備用於翻譯成其他語言的軟體時,硬編碼尤其成問題。
在許多情況下,單個硬編碼值(例如數組大小)可能會在程序的源代碼中出現多次。這將是一個神奇的數字。如果值的某些外觀被修改,這可能通常會導致程序錯誤,但不是全部。這樣的錯誤很難找到,並且可能會長時間保留在程序中。如果相同的硬編碼值用於多於一個參數值,例如,可能會出現類似的問題。一個由6個元素組成的數組,最小輸入字元串長度為6.程序員可能會錯誤地更改值的所有實例(通常使用編輯器的搜索和替換工具),而無需檢查代碼以查看每個實例的使用方式。通過定義將名稱與值相關聯的常量並在代碼中使用每個外觀的常量名稱,可以避免這兩種情況。
硬編碼的一個重要情況是字元串直接放置在文件中,這迫使翻譯人員編輯源代碼以翻譯程序。 (有一個名為gettext的工具,它允許字元串保留在文件中,但可以讓譯員在不更改源代碼的情況下翻譯它們;它可以有效地對字元串進行解碼。)

比賽中的硬編碼


在國際奧林匹克競賽等計算競賽中,參賽者需要根據問題的要求編寫具有特定投入產出模式的程序。
在極少數情況下,可能的輸入數量足夠小,參賽者可能會考慮使用將所有可能輸入映射到其正確輸出的方法。這個程序將被認為是一種硬編碼解決方案,而不是演演算法程序(儘管硬編碼程序可能是演演算法程序的輸出)。