Hård kodning
Hårdkodning (även hårdkodning eller hårdkodning ) är praxis för mjukvaruutveckling att bädda in data direkt i källkoden för ett program eller annat körbart objekt, i motsats till att hämta data från externa källor eller generera dem vid körning . Hårdkodad data kan vanligtvis bara ändras genom att redigera källkoden och kompilera om den körbara filen, även om den kan ändras i minnet eller på disken med hjälp av en debugger eller hex-redigerare . Data som är hårdkodade är bäst för oföränderliga delar av information, såsom fysiska konstanter , versionsnummer och statiska textelement. Mjukkodad data kodar å andra sidan godtycklig information genom användarinmatning , textfiler , INI-filer , HTTP-serversvar, konfigurationsfiler, förprocessormakron, externa konstanter, databaser, kommandoradsargument och bestäms vid körning.
Översikt
Hårdkodning kräver att programmets källkod ändras varje gång indata eller önskat format ändras, när det kan vara bekvämare för slutanvändaren att ändra detaljerna på något sätt utanför programmet.
Hårdkodning krävs ofta, men kan också betraktas som ett antimönster . Programmerare kanske inte har en utarbetad dynamisk användargränssnittslösning för slutanvändaren men måste ändå leverera funktionen eller släppa programmet. Detta är vanligtvis tillfälligt men löser på kort sikt trycket att leverera koden. Senare görs mjukkodning för att låta en användare skicka vidare parametrar som ger slutanvändaren ett sätt att modifiera resultaten eller resultatet.
Termen "hårdkodad" användes ursprungligen som en analogi till kretsar med fasta ledningar - och var tänkt att förmedla den inflexibilitet som följer av dess användning inom mjukvarudesign och implementering. I samband med utvidgbara samarbetsutvecklingsmiljöer för körning som MUD , avser hårdkodning också att utveckla kärnmotorn i systemet som ansvarar för lågnivåuppgifter och exekvera skript , i motsats till mjukkodning som utvecklar de högnivåskript som får tolkas av systemet vid körning , med värden från externa källor, såsom textfiler , INI-filer , förbehandlare makron , externa konstanter, databaser , kommandoradsargument , HTTP- serversvar , konfigurationsfiler och användarinmatning . I det här fallet är termen inte nedsättande och hänvisar till allmän utveckling, snarare än att specifikt bädda in utdata.
Hårdkodning och bakdörrar
Hårdkodningsuppgifter är ett populärt sätt att skapa en bakdörr . Hårdkodade autentiseringsuppgifter är vanligtvis inte synliga i konfigurationsfiler eller utdata från kommandon för kontouppräkning och kan inte enkelt ändras eller kringgås av användare. Om det upptäcks, kan en användare kunna inaktivera en sådan bakdörr genom att modifiera och bygga om programmet från dess källkod ( om källan är allmänt tillgänglig ), dekompilera eller omvänd manipulering av programvara , direkt redigera programmets binära kod eller inrätta en integritet kontrollera (som digitala signaturer, anti-manipulation och anti-fusk ) för att förhindra oväntad åtkomst, men sådana åtgärder är ofta förbjudna enligt ett slutanvändarlicensavtal .
Hårdkodning och DRM
Som en åtgärd för hantering av digitala rättigheter kan mjukvaruutvecklare hårdkoda ett unikt serienummer direkt i ett program. Eller så är det vanligt att hårdkoda en publik nyckel , vilket skapar den DRM för vilken det är omöjligt att skapa en nyckelgen.
I det motsatta fallet kan en mjukvaruknäckare hårdkoda ett giltigt serienummer till programmet eller till och med hindra den körbara filen från att be användaren om det, vilket gör att obehöriga kopior kan distribueras om utan att behöva ange ett giltigt nummer, och därmed dela samma nyckel för varje kopia, om en har hårdkodats.
Fast installationsväg
Om ett Windows-program är programmerat att anta att det alltid är installerat på C:\Program\Appnamn och någon försöker installera det på en annan enhet av utrymmesskäl eller organisatoriska skäl, kan det hända att det misslyckas med att installera eller köras efter installationen. Det här problemet kanske inte identifieras i testprocessen, eftersom den genomsnittliga användaren installerar på standardenheten och katalogen och testning kanske inte inkluderar alternativet att ändra installationskatalogen. Det är dock tillrådligt för programmerare och utvecklare att inte fixa installationssökvägen för ett program, eftersom standardinstallationssökvägen beror på operativsystemet, OS-versionen och sysadmin- beslut. Till exempel använder många installationer av Microsoft Windows enhet C: som sin primära hårddisk , men detta kan inte garanteras.
Det fanns ett liknande problem med mikroprocessorer i tidiga datorer, som började köras på en fast adress i minnet.
Startskiva
Vissa " kopieringsskyddade " program letar efter en viss fil på en diskett eller flashenhet vid uppstart för att verifiera att de inte är obehöriga kopior. Om datorn ersätts av en nyare maskin, som inte har en diskettenhet, kan programmet som kräver det nu inte köras, eftersom disketten inte kan sättas in.
Det sista exemplet visar varför hårdkodning kan visa sig vara opraktisk även när det vid den tidpunkten verkar som att det skulle fungera helt. På 1980- och 1990-talen var de allra flesta datorer utrustade med minst en diskettenhet, men diskettenheter blev senare ur bruk. Ett program hårdkodat på det sättet för 15 år sedan kan få problem om det inte uppdateras.
Särskilda mappar
Vissa Windows-operativsystem har så kallade Special Folders som organiserar filer logiskt på hårddisken. Det finns problem som kan uppstå med hårdkodning:
Profilväg
Vissa Windows-program hårdkodar profilsökvägen till utvecklardefinierade platser som C:\Documents and Settings\ Användarnamn
. Detta är sökvägen för de allra flesta Windows 2000 eller senare, men detta skulle orsaka ett fel om profilen lagras i ett nätverk eller på annat sätt flyttas. Det korrekta sättet att få det är att anropa GetUserProfileDirectory
-funktionen eller att lösa miljövariabeln %userprofile% .
Ett annat antagande som utvecklare ofta gör är att anta att profilen finns på en lokal hårddisk.
Sökväg till mappen Mina dokument
Vissa Windows-program hårdkodar sökvägen till Mina dokument
som ProfilPath \Mina dokument
. Dessa program skulle fungera på maskiner som kör den engelska versionen, men på lokaliserade versioner av Windows har denna mapp normalt ett annat namn. Till exempel, i italienska versioner heter mappen Mina dokument
Documenti . Mina dokument
kan också ha flyttats med mappomdirigering i grupprincip i Windows 2000 eller senare. Det korrekta sättet att få det är att anropa SHGetFolderPath
-funktionen.
Lösning
En indirekt referens, t.ex. en variabel inuti programmet som heter "Filnamn", kan utökas genom att öppna dialogfönstret "Bläddra efter fil", och programkoden skulle inte behöva ändras om filen flyttades.
Hårdkodning är särskilt problematiskt när man förbereder programvaran för översättning till andra språk.
I många fall kan ett enda hårdkodat värde, till exempel en arraystorlek, förekomma flera gånger i ett programs källkod. Detta skulle vara en magisk siffra . Detta kan vanligtvis orsaka en programbugg om några av värdets utseende ändras, men inte alla. En sådan bugg är svår att hitta och kan finnas kvar i programmet under lång tid. Ett liknande problem kan uppstå om samma hårdkodade värde används för mer än ett parametervärde, t.ex. en array med 6 element och en minsta indatastränglängd på 6. En programmerare kan av misstag ändra alla instanser av värdet (ofta med hjälp av en redaktörens sök-och-ersätt-funktion) utan att kontrollera koden för att se hur varje instans används. Båda situationerna undviks genom att definiera konstanter , som associerar namn med värdena, och genom att använda konstanternas namn för varje utseende i koden.
Ett viktigt fall av hårdkodning är när strängar placeras direkt i filen, vilket tvingar översättare att redigera källkoden för att översätta ett program. (Det finns ett verktyg som heter gettext
som tillåter att strängar lämnas i filer, men som låter översättare översätta dem utan att ändra källkoden; det avhärdar effektivt strängarna.)
Hård kodning i tävlingar
I datortävlingar som den internationella olympiaden i informatik måste de tävlande skriva ett program med ett specifikt input-outputmönster enligt kraven i frågorna.
I sällsynta fall där det möjliga antalet ingångar är tillräckligt litet, kan en tävlande överväga att använda ett tillvägagångssätt som mappar alla möjliga ingångar till deras korrekta utgångar. Detta program skulle betraktas som en hårdkodad lösning i motsats till en algoritmisk (även om det hårdkodade programmet kan vara resultatet av ett algoritmiskt program).