어떤 오픈 소스 C ++ 정적 분석 도구를 사용할 수 있습니까? [닫은]


301

Java에는 FindBugs , CheckstylePMD 와 같은 매우 훌륭한 오픈 소스 정적 분석 도구가 있습니다. 이러한 도구는 사용하기 쉽고 매우 유용하며 여러 운영 체제에서 실행되며 무료 입니다.

상용 C ++ 정적 분석 제품을 사용할 수 있습니다. 이러한 제품은 훌륭하지만 비용은 학생에게 너무 비싸며 일반적으로 시험판을 얻는 것이 다소 어렵습니다.

대안은 여러 플랫폼 (Windows 및 Unix)에서 실행되는 오픈 소스 C ++ 정적 분석 도구를 찾는 것입니다. 오픈 소스 도구를 사용하면 특정 요구에 맞게 수정할 수 있습니다. 도구를 찾는 것은 쉬운 일이 아닙니다.

아래는 다른 사람들이 찾거나 제안한 C ++ 정적 분석 도구의 간단한 목록입니다.

어떤 무엇인가 다른 휴대용 오픈 소스 C ++ 정적 분석 도구는 누구나 알고 권장 될 수있다?

일부 관련 링크.


상용, DMS 소프트웨어 리엔지니어링 툴키는 Java, C, C ++ 및 COBOL을 처리하고 구문 분석, AST 빌드, 이름 / 유형 해석, 제어 / 데이터 흐름 분석, 사용자 정의 분석 및 변환을 제공합니다. semanticdesigns.com/Products/DMS/DMSToolkit.html을 참조하십시오 .
Ira Baxter

1
상용 도구의 경우 CppDepend ( cppdepend.com ) 도 있으며 시험판으로도 충분할 수 있습니다.

답변:


21

Oink는 Elsa C ++ 프론트 엔드 위에 구축 된 도구입니다. 모질라 포크는 엘사 / 오 잉크 포크입니다.

참조 : http://danielwilkerson.com/oink/index.html


1
나는 내 인생에서 1000 개 이상의 프로그램을 컴파일했지만, 하나님의 사랑을 위해이 패키지를 컴파일 할 수 없습니다. Fedora, Ubuntu, WSL, Cygwin, MSYS2, Windows를 사용해 보았습니다. 무언가가 항상 누락되어 있으며 문서가 끔찍합니다. 나를 잘못 이해하지 마십시오. 도구가 훌륭하다고 생각합니다. 그러나 웹 사이트와 문서는 10-15 년 동안 아무도 손대지 않은 것처럼 보입니다.
Apache

73

CppCheck 는 오픈 소스이며 크로스 플랫폼입니다.

맥 OS X:

brew install cppcheck

1
@gio 나는 개인적으로 어떤 문제도 보지 못했다. CppCheck는 특정 경로 또는 파일을 무시하거나 제외 할 수있는 능력이 있다고 생각합니다.
Soo Wei Tan

1
Windows :choco install cppcheck
KindDragon

53

GNU 컴파일러와 관련하여 gcc에는 이미 -Wall에 대한 추가 경고 를 가능하게하는 내장 옵션이 있습니다 . 옵션은 -Weffc ++ 이며 그의 책 " Effective and More Effective C ++ "에 실린 Scott Meyers 의 일부 지침 위반에 관한 것 입니다.

특히이 옵션은 다음 항목을 감지합니다.

  • 동적으로 할당 된 메모리가있는 클래스에 대한 복사 생성자와 할당 연산자를 정의하십시오.
  • 생성자의 할당보다 초기화를 선호하십시오.
  • 기본 클래스에서 소멸자를 가상으로 만듭니다.
  • "operator ="가 * this에 대한 참조를 리턴하도록하십시오.
  • 객체를 반환해야 할 때 참조를 반환하지 마십시오.
  • 접두사와 접미사 형식의 증분 및 감소 연산자를 구별합니다.
  • "&&", "||"또는 ","를 오버로드하지 마십시오.

7
gcc의 -Wall 및 -Weffc ++ 외에도 -Wextra는 값을 반환하지 않는 분기 또는 부호없는 것을 0보다 작은 지 확인하는 등의 무료 정적 분석을 수행합니다. 전문 프로그래머가 후자를 좋은 아이디어라고 생각하는 것은 놀랍습니다…
Flash Sheridan

24
윽, -Weffc++에 대해 경고 큰 코드베이스에 완벽하게 괜찮 구조의. 그러나 나는 두 번째 제안을 -Wextra한다. 그것없이 집을 떠나지 마십시오!
Tom

29

현재 개발 중이지만 clang 은 C 분석을 수행하며 시간이 지남에 따라 C ++를 처리하는 것을 목표로합니다. LLVM 프로젝트 의 일부입니다 .

업데이트 : 랜딩 페이지에 "분석기는 지속적인 작업 중"이라고 표시되어 있지만 C와 C ++ 모두에 대한 정적 분석기로 문서화 되었습니다.

질문 : 정적 분석을 위해 GCC / Clang을 어떻게 실행할 수 있습니까? (경고 만)

컴파일러 옵션 : -fsyntax-only


1
LLVM은 gcc에 비해 매우 짧은 시간에 최적화 된 바이너리를 생성하는 매우 흥미로운 프로젝트입니다. 그리고 그 소리가 완료되면, 자사의 프론트 엔드 것입니다 ...
니콜라 Bonelli

다른 편집기는 -fsyntax-only 스위치에 대한 정보를 추가했습니다. 컴파일러가 실제로 컴파일하지 않고 실행하고 경고 메시지를 표시한다는 분석을 실행해야한다는 점에 유의하십시오. 확실하지 않지만 정적 분석과는 다르다고 생각합니다.
Don Wakefield

17

다른 사람이 -Weffc ++을 언급했지만 실제로는 기본적으로 켜지지 않는 유일한 GCC 경고 중 하나입니다. 그러나 내가 설정하는 경고 세트는 키트에서 가장 중요한 정적 분석 도구입니다. 권장 경고전체 목록을 볼 수 있습니다 .

요약해서 말하자면:

-pedantic-벽 -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat = 2 -Winit-self -Wological-op -Wmissing-declarations-결산 포함 디렉토리 -Wnoexcept -Wold -스타일 캐스트-오버로드 가상-중복 데클-섀도우-워드 변환 -Wsign- 프로모션 -Null- 널 센티넬 -Wstrict-overflow = 5 -Wswitch-default -Wundef -Werror-미사용

이들 중 일부는 gcc의 새로운 버전을 필요로하므로 4.5 이상으로 멈춰 있으면 목록에서 제거해야 할 수도 있습니다.



7

오픈 소스가 실제로 "무료"를 의미한다면 Microsoft의 빠른 분석이 좋습니다. 물론 Windows 전용. Visual Studio와 컴파일러에 완전히 통합되어 있습니다. 예 :

cl /analyze Sample.cpp

어떤 버전 및 에디션이 제공됩니까?
twk

컴파일러에 내장 된 것 같습니다. 무료입니다. 통합은 아마도 Team 에디션 일 것입니다.
JBR 윌킨슨


4

부목 은 C의 청구서를 채우는 것 같습니다.

오픈 소스를 지정하지 않았다면 Gimpel SoftwarePCLint 는 아마도 C ++에서 정적 코드 검사에 사용할 수있는 최고의 도구 중 하나 라고 말할 것입니다. 그러나 물론 오픈 소스가 아닙니다.

맥 OS X:

brew install splint

2
그러나 고가의 단일 개발자 : 내가 무료 더 좋아
로버트 굴드에게

6
부목은 C ++가 아닌 C 용입니다. 그들이 보험 범위를 확대 할 계획인지 모르겠습니다. 그러길 바래!
Harold Bamford

예, pclint는 시도해 볼 만합니다. 유닉스의 대응 부분은 flexe-lint라고 불리며 9.0 버전은 8.x 버전보다 빠릅니다. 9.0 버전은 사전 컴파일 된 헤더를 지원하여 분석 속도를 높입니다. pc-lint를 길들이는 데 시간이 걸리며, 선택적으로 무시할 수없는 경우 문제를 일으킬 수있는 가양 성이 있습니다.
zhaorufei

3

Microsoft의 PREFast 는 Windows 드라이버 키트에서도 제공됩니다. 버전 7.0은 여기에서 다운로드 할 수 있습니다 .

Microsoft 문서에서는 드라이버 코드에 대해서만 실행해야하지만이 블로그 게시물은 이를 실행하기위한 단계를 제시합니다. 아마도 일반적인 빌드 프로세스에 통합 될 수 있습니까?


PREFast는 실제 프로젝트의 경우 빌드 서버가 감당할 수없는 빌드 프로세스 속도를 크게 저하시킵니다.
zhaorufei

@zhaorufei : 대부분의 정적 분석은 "빠르지 않습니다"; 그들은 정의에 따라 매우 복잡한 코드 분석 작업을 수행합니다. 빌드 비용이 항상 마음에 들지 않으면 옵션으로 만드십시오.
Ira Baxter

2

우리는 metriculator라는 Eclipse CDT 플러그인을 개발하고 있습니다. 아직 개발 중이지만 LSLOC, McCabe, EfferentCoupling과 같은 일부 주요 지표가 이미 구현되었습니다.

비디오 데모 및 설명서와 같은 자세한 내용 은 http://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Documentation 을 참조 하십시오 .

최신 야간 빌드는 다음 업데이트 사이트를 통해 설치할 수 있습니다. http://sinv-56013.edu.hsr.ch/metriculator/updatesite-nightly/site/

추가 설명

Metriculator는 C ++ 소스 코드를 정적으로 분석하고 소프트웨어 메트릭을 생성합니다. 메트릭은 코단 체커로 구현됩니다. 분석 결과는 별도의보기에서 탐색 할 수 있습니다. 각 메트릭에는 구성 가능한 속성 (예 : '기능 당 최대 코드 라인 수'에 대한 임계 값)이 있습니다. 이 임계 값을 초과하면 문제점을보고하고 소스 코드 편집기에서 마커를 작성합니다.

측정기를 사용하면 다음을 수행 할 수 있습니다.

  • C ++ 파일 / 폴더 / 프로젝트 분석
  • Codans 환경 설정 페이지를 사용하여 메트릭 임계 값 정의 및 메트릭 활성화 / 비활성화
  • 소스 코드 편집기에 문제 마커가 있음
  • 메트릭 결과 탐색
  • 메트릭 결과를 태그 클라우드로 내보내기 (업데이트 사이트를 통해 선택적 기능으로 사용 가능)

현재 측정기에는 다음과 같은 메트릭이 제공됩니다.

  • 맥 카베 (사이클로 매틱 복잡도)
  • 유형별 EfferentCoupling
  • 논리 소스 코드 라인
  • 유형 당 멤버 수
  • 기능 당 매개 변수 수


1

MELT ( GCC 확장을 위해 설계된 도메인 특정 언어) 에서 GCC의 확장을 코딩 하거나 C에서 GCC 플러그인을 코딩 하여 사용자 정의 분석을 수행 할 수도 있습니다.


2
MELT에 대한 PDF 중 하나를 읽고 용융으로 gcc를 확장하면 내 자신의 플러그인을 gcc에 추가하기에는 여전히 복잡하고 어렵습니다. 일반 사용자에게는 실용적이지 않습니다.
zhaorufei

1
GCC 확장은 C 플러그인, MELT 또는 Python을 통해 수행하는 방식에 관계없이 복잡합니다. GCC가 복잡하기 때문입니다. 그리고 사용자 정의 어떤 C ++ 정적 분석 도구입니다 하드 는 C ++ 언어 사양은 매우 복잡하기 때문에, 당신은 (비 사소한 C ++ 프로그램은 아마도 C ++ 표준 라이브러리를 통해, 기능 ++ C를 많이 사용) 복잡성의 대부분을 처리해야합니다 .
바 실레 스타 인케 치

0

Doxygen은 제어 흐름 분석을 수행하고 그래프를 생성합니다. 그것들은 당신이 찾고있는 것이 아닐 수도 있지만, 나는 그것들을 보는 데 유용합니다.

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