PHP에서 정적 코드 분석을 수행하는 방법은 무엇입니까? [닫은]


466

PHP 소스 파일에 대한 정적 분석 도구가 있습니까? 이진 자체는 구문 오류를 확인할 수 있지만 다음과 같이 더 많은 일을 찾고 있습니다.

  • 사용되지 않은 변수 할당
  • 먼저 초기화하지 않고 할당 된 배열
  • 코드 스타일 경고
  • ...

57
Righty-o : 분명히 이런 종류의 대답이 엄청나게 유용 할 때 SO에 의해 닫힙니다.
Ira Baxter

3
동의하다. 이 질문은 매우 중요합니다. php lint (php -l 파일)는 나머지 절반을 제공하지 못합니다 : 자동로드를 실행하고 호출 된 함수가 있는지 확인하고 변수가 존재하며 객체 속성이 존재하는지 확인하십시오. 기타
Max

6
@IraBaxter는 주제에 대해 유용하지만 엄격하게 말하면 안됩니다. softwarerecs.stackexchange.com 은 아마도 더 많은 주제가 될 것입니다. 물론 아이러니 한 것보다 더 많은 개발자들이 SO에 친숙하다는 점은 아이러니하다.
Wayne Werner

7
많은 사람들이 이러한 유형의 질문을 유용하게 생각한다는 사실은 아마도 softwarerecs가 현재 존재하는 이유 일 것입니다. 이것이 유일한 스택 교환 사이트 일 때 분명히 주제로 되돌아갔습니다. 이제 명확한 장소가 생겼으니 마이그레이션하는 것이 합리적입니까?
eswald

4
트리거 해피 클로저로 인해 닫힙니다. 바!
Roadowl

답변:


356

명령 행에서 lint-mode로 php를 실행하여 실행하지 않고 구문을 검증하십시오.

php -l FILENAME

고급 정적 분석기에는 다음이 포함됩니다.

하위 레벨 분석기에는 다음이 포함됩니다.

PHP의 동적 특성으로 인해 일부에 더 유용한 런타임 분석기는 다음과 같습니다.

문서 라이브러리 phpdocdoxygen 은 일종의 코드 분석을 수행합니다. 예를 들어 Doxygen은 graphviz 를 사용하여 멋진 상속 그래프를 렌더링하도록 구성 할 수 있습니다 .

또 다른 옵션은 xhprof 이며 xdebug와 비슷하지만 더 가벼워 프로덕션 서버에 적합합니다. 이 도구에는 PHP 기반 인터페이스가 포함되어 있습니다.


20
이 모든 음식을 맛보기 위해 6 시간 동안 일한 것에 대해 +1!
Abe Petrillo

14
@dimitko : php -l한 번에 하나의 입력 파일 만 읽을 수 있기 때문입니다 (즉, 그렇게하면 작동하지 않습니다 php -l file1.php file2.php). 대신 명령 프로세스 당 하나의 입력 행만 사용하도록 -n 1지시 하는 옵션 을 사용해야합니다 xargs. 그 대신 실행하게됩니다 php -l file1.php다음에 php -l file2.php별도로. 동시에 -P <n>실행을 병렬화하기 위해 한 번에 "n"프로세스를 실행 하는 데 사용할 수 있습니다 .find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe

11
find /your/path -name '*.php' -exec php -l {} \;신뢰할 수 있습니다.
코엔.

11
NB : 내장 보풀 기능 (들어 php -l일까지), 당신은 설정해야합니다 display_errors = onphp.ini, 그렇지 않으면 당신은 단지 거기에 대한 일반적인 메시지되는 구문 오류하지만 오류 (들) 또는 무엇 라인 (들)에 대한 더 자세한 내용을 얻을 것이다.
Synetech

8
Synetech-좋습니다. -d스위치를 사용하여 명령 행의 설정을 무시할 수 있습니다 . 예php -l -d display_errors=on $FILENAME
troelskn



24

PHP Mess Detector 는 훌륭하고 빠릅니다.


7
감사합니다! 나는 굉장한 것을 찾고 있었다. 사실, 나는 멋진 도구 외에는 아무것도 사용하지 않습니다. :)
Falken 교수 계약이

1
시작이며 Netbeans에서 사용하는 것처럼 보이지만 완전히 신뢰하지는 않습니다. 옵션 중 일부는 평범하지 않습니다 (else 문을 사용하는 경우 "경고"??). 감지에 개발자의 응답조차 없었던 수많은 큰 버그가 있습니다 : github.com/phpmd / phpmd / issues
NoBugs 2016 년

그렇지 않으면 순환 적 복잡성을 추가하고 피하기 위해 다르게 작성 될 수 있습니다. 예를 들어 (true) {$ x = 1; } else {$ x = 2; } 재 작성 가능 : $ x = 2; if (true) {$ x = 1; }
RichardAtHome

17

나는 $ php -l을 사용하고 다른 도구를 사용하려고 시도했다. 그러나 내 경험 중 가장 좋은 것은 (물론 YMMV) pfff toolset 검사 입니다. Quora에서 pfff에 대해 들었습니다 ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

컴파일하고 설치할 수 있습니다. 좋은 패키지는 없습니다 (내 민트 데비안에서는 먼저 libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev 및 libgimp2.0-dev 종속성을 설치해야 함)는 가치가 있습니다.

결과는 다음과 같이보고됩니다

rjha@mint ~ $ ~/sw/pfff/scheck ~/code/github/sc/
login-now.php:7:4: CHECK: Unused Local variable $title
go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl.

감사합니다. 동적 가져 오기에 대해 계속 불평하지만 다른 기능은 지금까지 좋아 보입니다. binutils-gold를 설치하고 scheck를 사용자 정의 경로에 설치해야했지만 지금은 작동하는 것 같습니다.
eswald

1
@eswald 이제 나는 PHP 엉망 탐지기 (phpmd) 변환입니다. 지금까지 시도한 모든 도구 (php 코드 스니퍼, scheck, php -l, phpmd), IMHO, phpmd가 내 경우에 가장 잘 작동합니다.
rjha94

Scheck를 찾을 수있는 곳을 알고 있습니까?
George Katsanos

1
@GeorgeKatsanos scheck는 pfff 툴셋의 일부입니다. github.com/facebook/pfff
rjha94

2
Scheck는 항상 "php checker에 그래프 파일이 필요합니다"라는 오류를 표시합니다. 존재하지 않는 대부분의 문서에는 예제가 없습니다.
Robert Bruce

14

복사 / 붙여 넣기 / 편집 된 코드를 찾는 "복제 탐지"도구 인 Semantic Designs의 CloneDR을 참조하십시오 . 공백, 주석 및 가변 이름 변경에도 불구하고 정확하고 거의 누락 된 코드 조각을 찾을 수 있습니다. PHP에 대한 샘플 탐지 보고서는 웹 사이트에서 찾을 수 있습니다. (저는 저자입니다).


1
사이트를 보면 놀라운 도구처럼 보입니다. 나중에 자세히 살펴 보겠습니다! 링크 감사합니다 ( "저도 저자입니다"+1)
Eric Cope

저학년 학대.
wom

7

NetBeans IDE는 구문 오류, 사용되지 않은 변수 등을 검사합니다. 자동화되지는 않지만 중소 규모 프로젝트에 적합합니다.


6

PHP 용 nWire 라는 새로운 도구가 있습니다 . Eclipse PDT 및 Zend Studio 7.x 용 코드 탐색 플러그인입니다. PHP에 대한 실시간 코드 분석을 활성화하고 다음 도구를 제공합니다.

  • 코드 시각화-컴포넌트 및 연관의 대화식 그래픽 표현.
  • 코드 탐색-고유 한 탐색보기는 모든 연관을 표시하며 코드를 쓰거나 읽는 동안 작동합니다.
  • 빠른 검색-메소드, 필드, 파일 등을 입력 할 때 검색

1
질문에 대한 답이 아닙니다. 답변 같은 netbeans 등이 있습니다.
Yosef

5

PHPUnit의 이전 부분 인 PHP PMD (프로젝트 엉망 탐지기) 및 PHP CPD (복사 붙여 넣기 탐지기)


4

PHP 스크립트의 취약점에 대한 정적 소스 코드 분석 - 입술은 . SourceForge 에서 사용할 수있는 RIPS 출처 .

RIPS 사이트에서 :

RIPS는 정적 코드 분석을 사용하여 PHP 응용 프로그램의 취약성을 찾기 위해 PHP로 작성된 도구입니다. 모든 소스 코드 파일을 토큰 화하고 파싱하여 RIPS는 PHP 소스 코드를 프로그램 모델로 변환하고 프로그램 흐름 중에 사용자 입력 (악의적 인 사용자에 의해 영향을 받음)으로 오염 될 수있는 민감한 싱크 (잠재적으로 취약한 기능)를 감지 할 수 있습니다. 발견 된 취약점의 구조화 된 결과 외에도 RIPS는 추가 수동 분석을위한 통합 코드 감사 프레임 워크를 제공합니다.


RIPS는 반죽은 프로젝트이며 비 OOP PHP 코드에서만 작동합니다.
alexglue

3

정적 코드 분석을위한 PHP Analyzer 라는 완전히 새로운 도구가 있습니다 .

여러 유형의 정적 분석 중에서 기본 자동 수정 기능도 제공합니다 ( 문서 참조) .

업데이트 : PHP-Analyzer는 더 이상 사용되지 않지만 여전히 레거시 브랜치에서 액세스 할 수 있습니다


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.