Bohrbug — är ett programvarufel som beter sig deterministiskt: med samma indata uppträder det varje gång utan undantag. Namnet kommer från Niels Bohrs atommodell, där elektronen rör sig i en strikt bestämd bana — lika förutsägbart som denna bugg. Enligt Wikipedia (2026) tillhör Bohrbug klassen av enklast diagnosticerbara defecter, eftersom det inte kräver särskilda villkor för att upprepas.
Huvudpunkter
Bohrbug — är en typ av programvarufel som visar sig deterministiskt: med samma indata leder det alltid till samma fel. Termen introducerades i vetenskaplig cirkulation av forskarna Jim Gray och Andreas Reuter i boken “Transaction Processing: Concepts and Techniques” (1993).
Till skillnad från Mandelbug, som kaotiskt ändrar sitt beteende, är Bohrbug stabilt: en utvecklare kan reproducera det med slutna ögon genom att ge systemet samma parametrar. Detta gör det till en idealisk kandidat för steg-för-steg-felsökning i IDE.
Bohrbug förekommer i alla faser av mjukvarans livscykel — från utveckling till drift. Det upptäcks ofta i testfasen, eftersom QA-ingenjörer utför repeterbara scenarier som garanterat leder till fel.
Enligt klassificeringen av Gray och Reuter är Bohrbug en defekt som uppfyller tre villkor: en fast uppsättning indata, samma systemtillstånd och samma felresultat. Om minst ett villkor bryts är buggen inte länge “Bohr”.
Författarna betonar att Bohrbug inte nödvändigtvis är ett enkelt fel. Det kan vara hur komplext som helst logiskt sett, men dess determinism skiljer det från alla andra feltryper i klassificeringen.
Namnet Bohrbug kommer från den danske fysikern Niels Bohr, skaparen av planetmodellen av atomen. Analogin är enkel: precis som elektronen i Bohrs modell rör sig i en strikt fixerad bana, upprepar denna bugg samma beteende vid varje körning.
Gray och Reuter valde detta namn för att kontrastera deterministiska fel mot kaotiska, som de kallade Mandelbug — för att hedra matematikern Benoît Mandelbrot, grundaren av teorin om fraktaler och kaos.
Intressant nog används termen Bohrbug i engelskspråkig litteratur ofta som synonym för “deterministiskt fel”, även om den är mindre spridd i svenskspråkig miljö. De flesta utvecklare kallar sådana buggar helt enkelt “reproducerbara fel”.
Bohrbug har en uppsättning särskiljande egenskaper som gör att det kan identifieras bland andra typer av mjukvarudefekter. Låt oss granska varje egenskap i detalj.
Huvudegenskapen hos Bohrbug — fullständig förutsägbarhet. Om applikationen kraschade med viss indata på utvecklarens maskin kommer den att krascha exakt likadant på testarens maskin och i produktion. Inga slumpmässiga faktorer.
Bohrbug reproduceras i 100% av försöken. Detta innebär att ingen speciell utrustning krävs för felsökning — en vanlig IDE och debugger räcker. Utvecklaren placerar en brytpunkt, startar applikationen, anger indata och följer koden steg för steg.
Om Bohrbug inte åtgärdas kommer det att reproduceras i varje version av programmet fram till reparationen. Tidsfaktorer — CPU-belastning, månfas, tid på dygnet — påverkar inte dess uppträdande.
Orsakerna till uppkomsten av Bohrbug kan delas in i flera kategorier. Att förstå dessa kategorier hjälper till att snabbare hitta roten till problemet.
Ett felaktigt konstruerat villkor — den vanligaste orsaken till Bohrbug. Till exempel använde utvecklaren operatorn `||` istället för `&&`, vilket ledde till felaktig exekvering av kodgrenen vid varje anrop av funktionen med vissa argument.
Användning av operatorn `<=` istället för `<` eller den omvända situationen — en klassisk källa till Bohrbug. Om en loop ska köras 10 gånger men körs 11 på grund av ett felaktigt villkor är detta ett deterministiskt fel som kommer att visa sig vid varje körning.
Hårdkodade konstanter som inte överensstämmer med affärslogiken skapar stabila fel. Till exempel är timeout för serveranslutning inställd på 100 millisekunder istället för 5000 — anslutningen kommer att brytas vid varje begäran.
Upptäckt av Bohrbug — den enklaste uppgiften för en utvecklare jämfört med andra buggtyper. Den deterministiska karaktären möjliggör användning av standardmetoder för felsökning.
public class DiscountCalculator {
public double calculate(double amount, boolean isPremium) {
// Bug: premiumanvändare får 5% rabatt istället för 10%
if (isPremium) {
return amount * 0.95;
}
return amount * 0.90;
}
}
I detta exempel är Bohrbug uppenbar: vid anrop av `calculate(1000, true)` returnerar metoden alltid 950 istället för 900. Det enklaste enhetstestet med fast indata kommer omedelbart att avslöja problemet.
För upptäckt av Bohrbug är enhetstester det mest effektiva verktyget. Det räcker att täcka funktionen med en uppsättning tester med olika gränsvärden, och det deterministiska felet kommer att visa sig vid första körningen.
När Bohrbug har upptäckts är steg-för-steg-felsökning i IDE det bästa sättet att hitta roten. Utvecklaren placerar en brytpunkt vid ingången till funktionen och följer varje rad och observerar variablernas värden.
Bohrbug skiljer sig från andra typer av programvarufel genom en nyckelegenskap — determinism. Låt oss titta på jämförelsen i en tabell.
| Buggtyp | Reproducerbarhet | Orsak | Felsökningssvårighet |
|---|---|---|---|
| Bohrbug | 100% vid samma indata | Logiskt fel | Låg |
| Mandelbug | Beror på tillstånd | Trådrace, timing | Hög |
| Schrödinbug | Tills koden läses — 0% | Medvetenhet om felet | Psykologisk |
| Hindenbug | Engångsföreteelse | Felkaskad | Extrem |
| Heisenbug | Ändras vid felsökning | Kompilatoroptimering | Medel |
Bohrbug — den enda buggtypen som garanterat kan reproduceras under kontrollerade förhållanden. Detta gör det säkrast ur diagnostiksynpunkt, men inte mindre farligt för användaren.
Heisenbug — en bugg som försvinner vid försök till felsökning. Till skillnad från Bohrbug kan Heisenbug eventuellt inte reproduceras i debugger på grund av förändringar i kodens exekveringstiming. Nybörjarutvecklare blandar ofta ihop dessa två typer.
Låt oss titta på ett verkligt exempel på Bohrbug i en webbutiksapplikation. Funktionen beräknar den totala orderkostnaden med hänsyn till skatt.
public double calculateTotal(double subtotal, double taxRate) {
// Bug: utvecklaren ställde in taxRate som procent
// men glömde dividera med 100
return subtotal + (subtotal * taxRate);
}
Vid anrop av `calculateTotal(1000, 20)` returnerar funktionen 21000 istället för förväntade 1200. Detta är en klassisk Bohrbug: samma indata leder alltid till samma felaktiga resultat. Åtgärden är trivial — lägg till division med 100.
Efter korrigering behandlar funktionen skattesatsen korrekt:
public double calculateTotal(double subtotal, double taxRatePercent) {
return subtotal + (subtotal * taxRatePercent / 100.0);
}
Detta exempel visar tydligt att Bohrbug kan orsakas av det enklaste matematiska felet. Det är just därför kodgranskning och enhetstester är de främsta verktygen för att förebygga sådana defekter.
Vanliga frågor
Bohrbug — är en variant av en vanlig bugg som kännetecknas av strikt determinism. Varje Bohrbug är en bugg, men inte varje bugg är en Bohrbug. En vanlig bugg kan reproduceras instabilt eller bero på yttre faktorer.
Stabil kallas Bohrbug på grund av dess förmåga att reproduceras vid varje körning med samma indata. Denna egenskap gör den förutsägbar och bekväm för felsökning — till skillnad från Mandelbug eller Heisenbug.
Termen Bohrbug introducerades av Jim Gray och Andreas Reuter 1993 i boken “Transaction Processing: Concepts and Techniques”. De klassificerade programvarufel efter grad av determinism med analogier från fysik och matematik.
För snabb åtgärd av Bohrbug krävs: reproducera buggen i testmiljö, gå igenom koden steg för steg i debugger, hitta raden med felaktig logik och skriv ett enhetstest som kontrollerar korrekt beteende.
Ja, Bohrbug kan vara hur komplext som helst logiskt sett. Determinism innebär inte enkelhet. Buggen kan involvera flera villkor och nästlade anrop, men om den reproduceras stabilt — är det en Bohrbug.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också