정적 분석을 사용하는 이유는 무엇입니까? Akka.NET에서 오류 탐색
Use static analysis regularly, not just before releases...
The earlier you find errors, the cheaper they are to fix...
당신은 아마 이것을 백 번 들었을 것입니다. 오늘 우리는 "왜?"다시 한 번 질문. Akka.NET 프로젝트의 오류가 도움이 될 것입니다.
오류
작업부터 시작하겠습니다. 아래 코드에서 결함을 찾으십시오.
protected override bool ReceiveRecover(object message)
{
switch (message)
{
case ShardId shardId:
_shards.Add(shardId);
return true;
case SnapshotOffer offer when (offer.Snapshot is
ShardCoordinator.CoordinatorState state):
_shards.UnionWith(state.Shards.Keys.Union(state.UnallocatedShards));
return true;
case SnapshotOffer offer when (offer.Snapshot is State state):
_shards.Union(state.Shards);
_writtenMarker = state.WrittenMigrationMarker;
return true;
case RecoveryCompleted _:
Log.Debug("Recovery complete. Current shards [{0}]. Written Marker {1}",
string.Join(", ", _shards),
_writtenMarker);
if (!_writtenMarker)
{
Persist(MigrationMarker.Instance, _ =>
{
Log.Debug("Written migration marker");
_writtenMarker = true;
});
}
return true;
case MigrationMarker _:
_writtenMarker = true;
return true;
}
....
}
위의 코드를 살펴보고 무엇이 문제인지 살펴보겠습니다.
_shards
변수는 HashSet<ShardId>
유형입니다. 위의 코드는 이 집합의 상태를 변경하는 여러 메서드를 호출합니다.HashSet<T>.Add
:_shards.Add(shardId);
HashSet<T>.UnionWith
:_shards.UnionWith(state.Shards.Keys.Union(state.UnallocatedShards));
그러나 다음 호출 중 하나가 올바르지 않습니다.
_shards.Union(state.Shards);
_shards
개체의 상태를 변경하지 않습니다. Enumerable.Union
는 원래 컬렉션을 변경하지 않고 대신 수정된 컬렉션을 반환하는 LINQ 확장 메서드입니다. 이것은 메소드 호출의 결과가 어딘가에 저장되거나 어떻게든 사용되어야 한다는 것을 의미합니다. 우리는 코드에서 그것을 볼 수 없습니다.PVS-Studio 분석기에서 다음과 같은 경고가 발생했습니다. V3010 'Union' 함수의 반환 값을 사용해야 합니다. Akka.Cluster.Sharding EventSourcedRememberEntitiesCoordinatorStore.cs 123
그런데 고정 코드는 다음과 같습니다.
_shards.UnionWith(state.Shards);
오류를 발견한 방법 — 또는 정적 분석의 이점에 대한 101번째 이야기
매일 밤 우리 서버는 여러 오픈 소스 프로젝트에 대한 정적 분석을 실행합니다. 여기에는 Akka.NET이 포함됩니다. 우리는 왜 그것을 하는가? 이 관행은 다음과 같은 몇 가지 이점을 제공합니다.
우리는 그것에 대해 더 많이 썼습니다 here .
이제 당면한 사례에 대한 몇 마디 - 오류가 어떻게 나타나고 어떻게 수정되었는지.
2022년 4월 20일:
2022년 4월 21일:
꽤 순조로운 협력이었다고 생각합니다! 신속한 수정에 대한 개발자에게 감사합니다.
이제 중요한 질문입니다. 이벤트가 다른 방향으로 진행되었다면 이 오류가 코드에 얼마나 오래 존재했을까요? 여기서는 상상의 여지를 남겨두겠습니다.
그렇다면 이와 같은 실수를 피하기 위해 지금 당장 무엇을 할 수 있습니까?
Reference
이 문제에 관하여(정적 분석을 사용하는 이유는 무엇입니까? Akka.NET에서 오류 탐색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/_sergvasiliev_/why-use-static-analysis-exploring-an-error-from-akkanet-5dia텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)