Development Tip

정적 코드 분석 도구 선택

yourdevel 2020. 12. 12. 12:33
반응형

정적 코드 분석 도구 선택


저는 UNIX 환경에서 C로 코딩하는 프로젝트를 진행하고 있습니다. Lint 도구를 사용하여 소스 코드를 확인했습니다. Lint는 1979 년부터 오랫동안 사용되어 왔습니다. 누구든지 제가 사용할 수있는 최신 코드 분석 도구를 제안 할 수 있습니까? 가급적 무료 도구입니다.


컴파일러 자체를 간과하지 마십시오.

컴파일러의 설명서를 읽고 제공 할 수있는 모든 경고와 오류를 찾은 다음, 원하는만큼 활성화하십시오.

또한 경고를 오류와 같이 처리하도록 컴파일러에 지시하여 즉시 수정해야합니다. (gcc의 "-Werror")

또한 : 않는 GCC의 "-Wall" 하지 모든 경고를 활성화 속지 않습니다.

또한 : valgrind (무료!)를 확인하십시오. "많은 메모리 관리 및 스레딩 버그를 자동으로 감지하고 프로그램을 자세히 프로파일 링합니다."

Valgrind는 정적 검사기는 아니지만 훌륭한 도구입니다! http://valgrind.org


C 코드의 경우 반드시 Flexelint를 사용해야 합니다 . 나는 거의 15 년 동안 그것을 사용했고 맹세했습니다. 정말 훌륭한 기능 중 하나는 코드의 주석 ( "/ * lint -e123 * /")을 통해 경고를 선택적으로 끄고 켤 수 있다는 것입니다. 이것은 평범하지 않은 것을 원할 때 강력한 문서화 도구로 밝혀졌습니다. "나는 경고 X를 해제하고 있으므로 X를 수행하는 데에는 몇 가지 좋은 이유가 있습니다."

흥미로운 C / C ++ 질문이있는 사람은 해당 사이트의 몇 가지 예제를보고 힌트를 보지 않고도 버그를 파악할 수 있는지 확인하십시오.


IIRC가 LLVM을 백엔드로 사용하는 clang static analyzer 에 대해 좋은 소식을 들었습니다 . 플랫폼에서 구현 된 경우 좋은 선택이 될 수 있습니다.

내가 이해하는 바에 따르면 구문 분석 이상의 기능을 수행합니다. 예를 들어 "자동 버그 찾기".


Coverity Prevent사용하여 C ++ 소스 코드를 확인했습니다.

무료 도구는 아니지만 (오픈 소스 프로젝트에 대해 무료 스캔을 제공한다고 생각하지만) 찾을 수있는 최고의 정적 분석 도구 중 하나입니다. C ++보다 C에서 훨씬 더 인상적이라고 들었지만 지금까지 많은 버그를 피하는 데 도움이되었습니다.


최근에 내가 사용할 수있는 모든 정적 분석 도구의 목록을 작성했지만 아직 모두 평가하는 중입니다. 이들은 대부분 보안 분석 도구입니다.


cppcheck 를 사용할 수 있습니다 . 정적 코드 분석 도구를 사용하기 쉽습니다.
예 :
cppcheck --enable=all .
현재 폴더 아래의 모든 C / C ++ 파일을 확인합니다.


Lint와 유사한 도구는 일반적으로 "잘못된 경보"문제를 겪습니다. 실제로 존재하는 것보다 훨씬 많은 문제를보고합니다. 진정으로 유용한 경고의 비율이 너무 낮 으면 사용자는 도구를 무시하는 방법을 배웁니다. 최신 도구는 가능성이 가장 높고 흥미로운 경고에 집중하기 위해 약간의 노력을 기울입니다.


PC-lint / Flexelint 는 매우 강력하고 유용한 정적 분석 도구이며 슬프게도 무료는 아니지만 구성이 가능합니다.

이와 같은 도구를 처음 사용할 때 엄청난 수의 경고를 생성 할 수 있으므로 주요 경고와 사소한 경고를 구분하기 어려울 수 있습니다. 따라서 가능한 한 프로젝트 초기에 코드에서 도구를 사용하기 시작한 다음 가능한 한 자주 코드에서 실행하여 새로운 경고가 발생할 때 처리 할 수 ​​있도록하는 것이 가장 좋습니다.

이와 같이 지속적으로 사용하면 도구에서 적용되는 규칙을 확인하는 방식으로 코드를 작성하는 방법을 곧 알게됩니다.

이 때문에 나는 상대적으로 빠르게 실행되는 Lint와 같은 도구를 선호합니다. 따라서 덜 자주 사용하게 될 수있는 번거로운 도구보다는 지속적으로 사용하도록 권장합니다.


Windows 및 Linux, VS 플러그인, IDE 또는 명령 줄에서 사용할 수있는 매우 완벽한 정적 분석기 인 CppDepend 를 사용해 볼 수 있으며 오픈 소스 기여자 에게는 무료입니다.


Uno 도구가 유용 할 수 있습니다 . 장난감이 아닌 무료 옵션 중 하나입니다. 적은 수의 "의미 적"오류 (널 포인터 역 참조, 범위를 벗어난 배열 인덱스 및 초기화되지 않은 변수 사용)에 초점을 맞추는 점에서 lint, Flexelint 등과 다릅니다. 또한 잠금-잠금 해제 규율과 같은 사용자 정의 검사를 허용합니다.

후속 도구 인 Orion 의 공개 릴리스를 위해 노력하고 있습니다 ( CONTENT NOT ANYMORE )


gcc에 대한 "-Weffc ++"옵션이 있으며 Mac OS X man 페이지에 따르면 다음과 같습니다.

Scott Meyers의 Effective C ++ 책에서 다음 스타일 지침 위반에 대해 경고합니다.

[한조각]

당신이 C에 대해 물었다는 건 알고 있지만 이것이 내가 아는 가장 가까운 ..


lint 는 지속적으로 업데이트됩니다. 그래서 왜 더 최신 버전을 원하십니까?

BTW flexelint 보풀입니다.


G'day,

-Wall을 설정 한 후 컴파일러가 말하는 내용을 읽고 소화하라는 제안에 전적으로 동의합니다.

보안을위한 좋은 정적 분석 도구는 David Wheeler가 작성한 FlawFinder 입니다. 다양한 보안 악용을 찾는 데 효과적입니다.

그러나 지식이있는 사람이 코드를 읽는 것을 대체하지는 않습니다. David가 자신의 웹 페이지에서 "도구를 사용하는 바보는 여전히 바보입니다!"라고 말합니다.

건배,

Rob


일반적으로 여러 정적 분석 도구를 사용하여 버그를 찾는 것이 가장 좋습니다. 모든 도구는 다르게 설계되었으며 서로 매우 다른 것을 찾을 수 있습니다.

There are some good discussions in some of the talks here. It's from a conference held by the US Department of Homeland Security on static analysis.


Sparse is a computer software tool, already available on Linux, designed to find possible coding faults in the Linux kernel.

There are two active projects of Linux Verification Center aimed to improve quality of the loadable kernel modules.

  1. Linux Driver Verification (LDV) - a comprehensive toolset for static source code verification of Linux device drivers.
  2. KEDR Framework - an extensible framework for dynamic analysis and verification of kernel modules.
  3. Another ongoing project is Linux File System Verification that aims to develop a dedicated toolset for verification of Linux file system implementations.

참고URL : https://stackoverflow.com/questions/2873/choosing-a-static-code-analysis-tool

반응형