Previous achievement | Next achievement

( G. Inkapsling )

G15

Aliasering

Level Assessment
3 L

Använd kopiering eller liknande för att undvika aliaseringsproblem i ett C- eller Javaprogram.

Aliaseringsproblem uppstår då pekare oavsiktligt pekar ut samma objekt/data så att en förändring via en pekare blir synlig via en annan pekare på ett överraskande sätt. I C är ett klassiskt exempel på aliaseringsproblem inläsning av strängar i en buffer som skrivs över vid varje ny inläsning. (Ett bra sätt att angripa detta mål är att vara vaksam på när du drabbas av denna bugg och använd det för att redovisa målet.)

Aliasering innebär att data kan delas mellan objekt. Detta är kraftfullt (en förändring via en pekare blir synlig för alla andra som har en pekare till samma data) men också väldigt farligt (en förändring via en pekare...) om man är slarvig med vad som delas och inte. Problematiskt är att kod som delar data och kod som inte delar data är identisk. T.ex. ett cirkelobjekt som har en pekare till ett punktobjekt som representerar dess center flyttas om dess centerpunkt flyttas. Om många punkter skapas på samma koordinat kan det vara effektivt att de delar denna punkt, men om de skall flytta sig individuellt uppstår problem om de inte har separata kopior av punkten.

Nu följer några tankar kring ägarskap, d.v.s., vilka objekt som hör till vilka andra objekt. Ett objekts (denna term omfattar även C-struktar) representation är de "subobjekt" som bygger upp ett sammansatta objekt. En länkad listas representation innehåller t.ex. dess länkobjekt eftersom dessa ägs av listan, men inte listdatat eftersom det inte är en del av själva listobjektet.

Representationsläckage är ett exempel på ett aliaseringsproblem och uppstår när subobjekt är synliga utanför det objekt till vilket de konceptuellt tillhör. Om man t.ex. kunde få ett handtag till en länk i en sorterad länkad lista utanför listan kan man göra borttagningar eller insättningar som förstör listans sorteringsordning.

Det är vanligt att subobjekt flyttas mellan objekt och byter ägare, eller skapas utanför objektet och flyttas in i det vid initiering. Mainstreamprogramspråk saknar dock koncept för ägarskap vilket kan leda till representationsläckage om man inte är aktsam.

Ge gärna kommentarer och rapportera buggar (klicka på den senaste commiten)

Edit | Back