정적 분석을 사용하는 이유는 무엇입니까? 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일:
  • 오류가 있는 코드는 committed Akka.NET 프로젝트의 개발 분기(특정 코드 행에 대한 link)입니다.

  • 2022년 4월 21일:
  • 서버가 코드를 분석하고 경고 이메일을 보냅니다.
  • 문제를 조사하고 GitHub에서 issue을 생성합니다.
  • 개발자가 오류를 수정합니다. Alink를 커밋합니다.

  • 꽤 순조로운 협력이었다고 생각합니다! 신속한 수정에 대한 개발자에게 감사합니다.

    이제 중요한 질문입니다. 이벤트가 다른 방향으로 진행되었다면 이 오류가 코드에 얼마나 오래 존재했을까요? 여기서는 상상의 여지를 남겨두겠습니다.

    그렇다면 이와 같은 실수를 피하기 위해 지금 당장 무엇을 할 수 있습니까?
  • 정적 분석기를 사용하십시오. 다운로드할 수 있습니다here. pvs_akka 프로모션 코드를 사용하는 것을 잊지 마세요. 그러면 평가판 라이선스가 7일 대신 30일 동안 작동합니다.
  • 이와 같은 더 많은 기사와 메모를 보려면 Twitter에서 저를 방문하십시오.
  • 좋은 웹페이지 즐겨찾기