새소식

Welcome to the tech blog of Junior Backend Developer Myoungji Kim!

Development/PHP

소나큐브 PHP 코드 분석: 주요 Bugs 및 해결 방안 정리

  • -

레거시가 많군..

  • 사내 서비스에 소나큐브로 정적분석을 도입한 후, 무수히 많은 Bugs와 Code Smells가 발견되었다 😑
  • 대체 어떤 버그가 이렇게 많은 것일까.. 궁금했던 나는 Overall Code 기준으로 심각도가 높은 Bugs를 모두 파헤쳤고, 빈번하게 발생한 Bugs를 정리해보았다.
  • 최소한 기본적인 버그는 만들지 않는 개발자가 되자! 🤔

 

🚦 Levels: Blocker

⛔️ Create class "Exception" in namespace or check correct import of class

🔖 Issue

  • Class of caught exception should be defined
  • 사용하는 클래스는 꼭 import를 해주자

✅ How to fix

// AS-IS
// ..생략
} catch (Exception $e) {
}

// TO-BE
use Exception;

// ..생략
} catch (Exception $e) {
}

🚦 Levels: Critical

⛔️ Make sure that the referenced value variable is unset after the loop.

🔖 Issue

  • References used in "foreach" loops should be "unset"
  • foreach가 종료된 다음에 예상치 못한 사이드이펙트가 발생하는 것을 방지하기 위해, 항상 참조변수에 대한 unset 처리를 해주는 것을 권장함

✅ How to fix

// AS-IS
$arr = array(1, 2, 3);
foreach ($arr as &$value) {
    $value = $value * 2;
}
$value = 'x';

// TO-BE
$arr = array(1, 2, 3);
foreach ($arr as &$value) { 
    $value = $value * 2;
}
unset($value); // Compliant Solution
$value = 'x';

🚦 Levels: Major

⛔️ Split this 0 characters long line (which is greater than 120 authorized).

🔖 Issue

  • Lines should not be too long
  • 수평으로 스크롤이 길어지기 때문에 코드를 한눈에 파악하고 이해하기 어려움

✅ How to fix

  • 한 라인의 chars가 maximumLineLength를 넘지 않도록 수정
  • 기본값: 120

⛔️ Delete this unreachable code or refactor the code to make it reachable.

🔖 Issue

  • All code should be reachable
  • 도달 불가능한 코드를 제거하거나, 도달이 가능하도록 수정되어야 함

✅ How to fix

if ($isValid) {
    return true;
    exit; // 도달 불가능한 불필요한 라인, 삭제 필요
}

🚦 Levels: Minor

⛔️ Remove this method "__construct" to simply inherit it.

🔖 Issue

  • Overriding methods should do more than simply call the same method in the super class
  • 재정의된 메서드에서는, 부모 클래스에서 동일한 메서드를 호출하는 것 이상의 역할을 담당해야 함
  • 다른 작업을 수행하지 않고 부모 클래스에서 동일한 메서드를 호출하기 위해 메서드를 오버라이드하는 것은 불필요하며, 로직을 이해하는데 오해의 소지가 있음

✅ How to fix

  • 추가 역할을 담당하지 않는 재정의 메서드는 삭제
// AS-IS
class Repository
{
    protected Database $database;

    public function __construct(Database $database)
    {
        $this->database = $database;
    }
}

class GoodsRepository extends Repository
{
    public function __construct(Database $database)
    {
        parent::__construct($database);
    }
}
// TO-BE
class Repository
{
    protected Database $database;

    public function __construct(Database $database)
    {
        $this->database = $database;
    }
}

class GoodsRepository extends Repository
{
    // to be implemented
}

⛔️ Put one space between the closing parenthesis and the opening curly brace.

🔖 Issue

✅ How to fix (example)

// AS-IS
class ClassA {
  function my_function(){
  }
}

// TO-BE
class ClassA {
  function my_function() {
  }
}

'Development > PHP' 카테고리의 다른 글

PHP 8.1: MYSQLI_REPORT 기본 오류 모드 변경  (0) 2024.08.05
PHP 코드 최적화 관련 팁 모음  (0) 2024.08.03
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.