Säkerhets- och rasvillkor
Ett annat problemområde är risken för säkerhetshål som utnyttjas av rasförhållanden. Det finns flera sätt på vilka detta kan hända. Underavsnitten som följer beskriver några av de stora fallgropar som utvecklaren måste undvika.
Tävlingsförhållanden i avyttringsmetoden
Om en klasss rensningsmetod (mer information finns i Skräpinsamling) inte synkroniseras, är det möjligt att rensningskoden inuti Dispose kan köras mer än en gång, som du ser i följande exempel.
Sub Dispose()
If Not (myObj Is Nothing) Then
Cleanup(myObj)
myObj = Nothing
End If
End Sub
void Dispose()
{
if (myObj != null)
{
Cleanup(myObj);
myObj = null;
}
}
Eftersom den här disponeringsimplementeringen inte är synkroniserad är det möjligt Cleanup
att anropas av först en tråd och sedan en andra tråd innan _myObj
är inställd på null. Om det här är ett säkerhetsproblem beror på vad som händer när Cleanup
koden körs. Ett stort problem med osynkroniserade disponeringsimplementeringar omfattar användning av resurshandtag, till exempel filer. Felaktig borttagning kan göra att fel handtag används, vilket ofta leder till säkerhetsrisker.
Tävlingsförhållanden i konstruktorer
I vissa program kan det vara möjligt för andra trådar att komma åt klassmedlemmar innan klasskonstruktorerna har körts helt. Du bör granska alla klasskonstruktorer för att se till att det inte finns några säkerhetsproblem om detta skulle inträffa eller synkronisera trådar om det behövs.
Tävlingsförhållanden med cachelagrade objekt
Kod som cachelagrar säkerhetsinformation eller använder kodåtkomstsäkerhetsåtgärden Assert kan också vara sårbar för konkurrensvillkor om andra delar av klassen inte synkroniseras korrekt, som du ser i följande exempel.
Sub SomeSecureFunction()
If SomeDemandPasses() Then
fCallersOk = True
DoOtherWork()
fCallersOk = False
End If
End Sub
Sub DoOtherWork()
If fCallersOK Then
DoSomethingTrusted()
Else
DemandSomething()
DoSomethingTrusted()
End If
End Sub
void SomeSecureFunction()
{
if (SomeDemandPasses())
{
fCallersOk = true;
DoOtherWork();
fCallersOk = false;
}
}
void DoOtherWork()
{
if (fCallersOK)
{
DoSomethingTrusted();
}
else
{
DemandSomething();
DoSomethingTrusted();
}
}
Om det finns andra sökvägar till DoOtherWork
som kan anropas från en annan tråd med samma objekt kan en ej betrodd anropare glida förbi en begäran.
Om koden cachelagrar säkerhetsinformation kontrollerar du att du granskar den för den här säkerhetsrisken.
Tävlingsförhållanden i Finalizers
Tävlingsförhållanden kan också inträffa i ett objekt som refererar till en statisk eller ohanterad resurs som den sedan frigör i sin finalizer. Om flera objekt delar en resurs som manipuleras i en klasss slutversion måste objekten synkronisera all åtkomst till den resursen.