硬编码要求程序的源代码在输入数据或所需格式发生变化时进行更改,以便最终用户可以通过程序外的某种方式更改细节。
硬编码通常是必需的,但也可以被认为是反模式。程序员可能没有针对最终用户制定的动态用户界面解决方案,但仍然必须提供该功能或发布该程序。这通常是暂时的,但从短期来看,确实解决了交付代码的压力。稍后,进行软编码以允许用户传递参数,该参数为最终用户提供修改结果或结果的方式。
术语“硬编码”最初被用作硬连线电路的类比,并且意在表达软件设计和实现中使用它所产生的不灵活性。在诸如MUD之类的运行时可扩展协作开发环境的上下文中,硬编码还指开发负责低级任务和执行脚本的系统的核心引擎,而不是开发高级脚本的软编码。系统在运行时解释。在这种情况下,这个术语不是贬义的,而是指一般的发展,而不是专门嵌入输出数据[1]。
硬编码凭证是创建后门的一种流行方式。硬编码凭证通常在配置文件和帐户枚举命令输出中不可见,并且无法轻松更改(无需从源重建,如果源可用或逆向工程,二进制修改和完整性检查(数字签名,防篡改)和反作弊)旁路(可以通过EULA禁止)。
作为一项数字版权管理措施,软件开发商可能会将一个序列号硬编码到一个程序中。或者硬编码一个公共密钥是常见的,创建一个不可行的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的工具,它允许字符串保留在文件中,但可以让译员在不更改源代码的情况下翻译它们;它可以有效地对字符串进行解码。)
在国际奥林匹克竞赛等计算竞赛中,参赛者需要根据问题的要求编写具有特定投入产出模式的程序。
在极少数情况下,可能的输入数量足够小,参赛者可能会考虑使用将所有可能输入映射到其正确输出的方法。这个程序将被认为是一种硬编码解决方案,而不是算法程序(尽管硬编码程序可能是算法程序的输出)[2]。