版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系我們

[科普中國]-硬編碼

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識科普陣地
收藏

硬編碼是將數(shù)據(jù)直接嵌入到程序或其他可執(zhí)行對象的源代碼中的軟件開發(fā)實踐,與從外部獲取數(shù)據(jù)或在運行時生成數(shù)據(jù)不同。 硬編碼數(shù)據(jù)通常只能通過編輯源代碼和重新編譯可執(zhí)行文件來修改,盡管可以使用調(diào)試器或十六進制編輯器在內(nèi)存或磁盤上進行更改。 硬編碼的數(shù)據(jù)通常表示不變的信息,例如物理常量,版本號和靜態(tài)文本元素。 另一方面,軟編碼數(shù)據(jù)對用戶輸入,HTTP服務(wù)器響應(yīng)或配置文件等任意信息進行編碼,并在運行時確定。

介紹硬編碼要求程序的源代碼在輸入數(shù)據(jù)或所需格式發(fā)生變化時進行更改,以便最終用戶可以通過程序外的某種方式更改細節(jié)。

硬編碼通常是必需的,但也可以被認為是反模式。程序員可能沒有針對最終用戶制定的動態(tài)用戶界面解決方案,但仍然必須提供該功能或發(fā)布該程序。這通常是暫時的,但從短期來看,確實解決了交付代碼的壓力。稍后,進行軟編碼以允許用戶傳遞參數(shù),該參數(shù)為最終用戶提供修改結(jié)果或結(jié)果的方式。

術(shù)語“硬編碼”最初被用作硬連線電路的類比,并且意在表達軟件設(shè)計和實現(xiàn)中使用它所產(chǎn)生的不靈活性。在諸如MUD之類的運行時可擴展協(xié)作開發(fā)環(huán)境的上下文中,硬編碼還指開發(fā)負責(zé)低級任務(wù)和執(zhí)行腳本的系統(tǒng)的核心引擎,而不是開發(fā)高級腳本的軟編碼。系統(tǒng)在運行時解釋。在這種情況下,這個術(shù)語不是貶義的,而是指一般的發(fā)展,而不是專門嵌入輸出數(shù)據(jù)1。

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

硬編碼和DRM作為一項數(shù)字版權(quán)管理措施,軟件開發(fā)商可能會將一個序列號硬編碼到一個程序中?;蛘哂簿幋a一個公共密鑰是常見的,創(chuàng)建一個不可行的DRM來創(chuàng)建一個keygen。

在相反的情況下,軟件破解者可能會將有效的序列號硬編碼到程序中,甚至阻止可執(zhí)行文件詢問用戶,從而允許未經(jīng)授權(quán)的副本被重新分發(fā)而不需要輸入有效的號碼,從而共享相同的每個副本的密鑰,如果已經(jīng)硬編碼。
修復(fù)安裝路徑。

如果Windows程序編程為假定它始終安裝到C:\ Program Files \ Appname,并且某人為了空間或組織原因嘗試將其安裝到其他驅(qū)動器,則可能無法安裝或在安裝后運行。在測試過程中可能無法識別此問題,因為普通用戶安裝到默認驅(qū)動器和目錄,測試可能不包括更改安裝目錄的選項。不過,程序員和開發(fā)人員不宜修復(fù)程序的安裝路徑,因為默認安裝路徑取決于操作系統(tǒng),操作系統(tǒng)版本和系統(tǒng)管理員決定。例如,Microsoft Windows的許多安裝使用驅(qū)動器C:作為其主硬盤,但這不是保證。

早期計算機中的微處理器存在類似的問題,它開始在內(nèi)存中的固定地址執(zhí)行。

啟動磁盤某些“復(fù)制保護”程序在啟動時在軟盤或閃存驅(qū)動器上查找特定文件,以驗證它們不是未經(jīng)授權(quán)的副本。 如果計算機被沒有軟盤驅(qū)動器的較新計算機所取代,無法運行需要它的程序,因為軟盤無法插入。

最后一個例子說明了為什么硬編碼可能會變得不切實際,即使它看起來完全可以工作。 在二十世紀八十年代和九十年代,絕大多數(shù)個人電腦至少配有一個軟驅(qū),但軟驅(qū)后來沒有使用。 如果不更新,15年前以這種方式硬編碼的程序可能會遇到問題。

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

簡介路徑某些Windows程序?qū)⑴渲梦募窂接簿幋a到開發(fā)人員定義的位置,如C:\ Documents and Settings \ Username。這是絕大多數(shù)Windows 2000或更高版本的路徑,但如果配置文件存儲在網(wǎng)絡(luò)中或以其他方式重新定位,則會導(dǎo)致錯誤。獲取它的正確方法是調(diào)用GetUserProfileDirectory函數(shù)或解析%userprofile%環(huán)境變量。開發(fā)人員經(jīng)常做出的另一個假設(shè)是假設(shè)配置文件位于本地硬盤上。

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

解決辦法可以通過訪問“瀏覽文件”對話窗口來擴展名稱為“FileName”的間接引用,如變量內(nèi)部的變量,如果文件移動,則程序代碼不必更改。在準備用于翻譯成其他語言的軟件時,硬編碼尤其成問題。

在許多情況下,單個硬編碼值(例如數(shù)組大?。┛赡軙诔绦虻脑创a中出現(xiàn)多次。這將是一個神奇的數(shù)字。如果值的某些外觀被修改,這可能通常會導(dǎo)致程序錯誤,但不是全部。這樣的錯誤很難找到,并且可能會長時間保留在程序中。如果相同的硬編碼值用于多于一個參數(shù)值,例如,可能會出現(xiàn)類似的問題。一個由6個元素組成的數(shù)組,最小輸入字符串長度為6.程序員可能會錯誤地更改值的所有實例(通常使用編輯器的搜索和替換工具),而無需檢查代碼以查看每個實例的使用方式。通過定義將名稱與值相關(guān)聯(lián)的常量并在代碼中使用每個外觀的常量名稱,可以避免這兩種情況。

硬編碼的一個重要情況是字符串直接放置在文件中,這迫使翻譯人員編輯源代碼以翻譯程序。 (有一個名為gettext的工具,它允許字符串保留在文件中,但可以讓譯員在不更改源代碼的情況下翻譯它們;它可以有效地對字符串進行解碼。)

比賽中的硬編碼在國際奧林匹克競賽等計算競賽中,參賽者需要根據(jù)問題的要求編寫具有特定投入產(chǎn)出模式的程序。

在極少數(shù)情況下,可能的輸入數(shù)量足夠小,參賽者可能會考慮使用將所有可能輸入映射到其正確輸出的方法。這個程序?qū)⒈徽J為是一種硬編碼解決方案,而不是算法程序(盡管硬編碼程序可能是算法程序的輸出)2。

本詞條內(nèi)容貢獻者為:

李岳陽 - 副教授 - 江南大學(xué)