정적 코드 분석과 코드 검토의 차이점은 무엇입니까?


9

정적 코드 분석과 코드 검토의 차이점이 무엇인지 알고 싶었습니다. 이 두 가지는 각각 어떻게 이루어 집니까? 보다 구체적으로, 오늘날 PHP의 코드 검토 / 정적 분석을 위해 사용할 수있는 도구는 무엇입니까? 또한 모든 언어의 코드 검토를위한 유용한 도구에 대해 알고 싶습니다.


코드 검토는 일반적으로 다른 프로그래머가 코드를 살펴 보는 수동 프로세스입니다. 코딩 규칙 등에서 약간의 실수 나 편차를 발견하고 전체 코드 품질을 향상시키는 좋은 방법입니다. 정적 코드 분석은 도구를 사용할 수 있지만 직접 수행 한 적은 없습니다. 다른 사람들의 답변을 확인하고

9
두 단어로? "뇌".
MSalters

답변:


19

코드 검토는 사람들이하는 일이고 정적 분석은 기계가하는 일입니다. 정적 분석 도구가 있습니다. 코드 검토는 동료 / 멘토 / 교수 / 친구가 코드를 검토하고 건설적인 비판을 제공 할 때입니다.

반면에 정적 분석은 기계가 분석하는 언어 (일반적으로 유형 시스템에서)에 대해 알고있는 정보를 통해 기계가 프로그램을 분석하고 틀릴 수있는 것을 선택하려고 시도하는 자동화 된 프로세스입니다. 비효율적이거나 열악한 스타일 또는 차선책.


2
코드 검토는 일종의 정적 분석이라는 인상을 받았습니다. 소프트웨어를 실행하지 않고 소프트웨어의 상태를 측정하는 방법이기 때문입니다.
Buhb

4
@Buhb : 문맥에 대한 지식을 결정적으로 추가합니다. 코드 검토자는 코드가 예상대로 작동하는지 이해해야합니다. 정적 도구는 (언어가 일부 장식 / 어설 션 / 계약을 통해 허용되는 경우) 공식적으로 모든 것이 정상인지 확인합니다. 따라서 다른 방법으로 넣을 수 있습니다. 정적 분석은 일종의 코드 검토입니다. 알고리즘 적으로.
Francesco

다만, 추가 린트 (정적 분석) : 야 필요가 아니에요! 동료 (리뷰어) : 당신도 그렇게 할 수 있습니다 !!
Kushal

11

정적 분석은 소프트웨어를 실행하지 않고 분석하는 프로세스입니다. 이것은 매우 좋고 권장되지만 다음을 명심해야합니다.

  1. 다른 정적 분석 도구 는 연구중인 코드에 대해 다른 이해 를 가지 므로 다른 문제를 신호 (또는 신호하지) 할 수 있습니다. 하나의 도구는 깨끗한 보고서를 제공하고 다른 하나는 백만 가지에 대해 불평 할 수 있습니다.
  2. 동적 툴 (예를 들어, valgrind를 생각하기 위해)은 리소스 소비 (시간, 메모리 사용량)에 심각한 부담을 주면서 많은 다른 문제를 찾을 수 있습니다. 일반적으로 계측 된 버전의 소프트웨어를 실행하기 때문입니다. 어떤 방식으로 계측 (malloc을 디버깅 malloc으로 교체)하면 소프트웨어와 정확히 동일하지 않습니다 (실행 시간에서 볼 수 있듯이)

이 두 가지 접근 방식 모두 맥락이 부족하여 어려움을 겪고 있습니다.

코드 검토는 다른 코더가 수행하며,이를 알고 있고 확인할 수 있습니다.

  1. 코드가 맞다면
  2. 소프트웨어가 의미 적으로 올바른 경우

훨씬 더 비싸고 다양한 정도의 반복성이 있지만 큰 도움이됩니다.

항상 그렇듯이 모든 버그를 수정하고 모든 문제를 피할 수있는 은색 총알이 하나도 없습니다. 적용-가능한 장소, 코드, 시간, 세 가지 형태의 검사 (정적, 역동적, 더 많은 눈 (및 뇌)가 코드를보고 있음)를 권장합니다.

추신 : 나는 도구를 처음부터 적용하는 것이 일반적으로 훨씬 낫다는 것을 알아야합니다. 기존 시스템을 변환하는 것은 잘못된 긍정으로 인해 훨씬 ​​덜 즐거운 경험입니다. 처음부터 시작하여 항상 분석 도구를 깨끗하게 유지하려는 경우 많은 문제를 피할 수 있습니다.

pps : 도구는 언어에 따라 다릅니다. C 및 C ++ 세계에서는 내장 된 정적 분석 도구가 포함 된 Visual Studio 자체를 살펴 보는 것으로 시작할 수 있습니다. 비교적 완전한 목록 은 Wikipedia에서 찾을 수 있습니다.

ppps : 정적 분석은 C 또는 C ++와 같은 정적 언어에 더 적합합니다. 파이썬의 경우 특정 지점의 목록을 참조하는 이름이 동적 속성으로 인해 나머지 프로그램의 목록을 참조하는지 말하기가 실제로 어려울 수 있습니다. 이것은 PyPy 와 같은 JIT 노력이 보여 주듯이 아무것도 할 수 없다는 것을 의미하지는 않습니다 .


2

코드 검토는 상급 또는 전담 기관에서 코드, 코딩 방식, 코드에 따른 표준 및 코드의 논리 수준을 확인할 때입니다.

정적 분석에 관한 한, 해당 소프트웨어로 작성된 프로그램을 실제로 실행하지 않고 수행되는 것은 컴퓨터 소프트웨어의 분석입니다 (프로그램 실행시 수행되는 분석은 동적 분석이라고 함).

기술에 따른 도구 목록은 아래 링크에 있습니다.

정적 분석 도구 목록

따라서 코드 검토와 정적 분석은 완전히 다른 용어입니다.


7
OM의 대답은 본질적으로 '선임 또는 전담 기관이 코드를 확인합니다 ...'라는 퀴즈를 제외하고는 정확합니다. 일부 장애가있는 상점은이 부모 / 자식 방식으로 코드 검토를 수행하는 것이 사실이며, 많은 (더 나은) 상점에는 교사가 숙제 문제를 평가하는 것과 유사하지 않은 P2P 코드 검토 시스템이 있습니다. 내가 일하는 곳에서 후배가 선배의 일을 검토하는 것이 일반적입니다. 목적은 모든 코드를 확인하기 전에 두 번째 눈을 보게하는 것입니다.
Jim In Texas

2
@JimInTexas, 우리 가게에서 동일합니다. 코드 검토의 가장 중요한 (장기) 결과는 팀 전체에 지식, 통일 관행 및 건축 / 디자인 비전을 전파하는 것입니다. 이런 점에서, 선배의 코드를 검토하는 주니어는 최악의 경우 현지 모범 사례를 배우는 가장 좋은 방법입니다.하지만 누가 선배가 실수를하지 않고 후배가이를 발견 할 수 없다고 누가 말합니까?
Péter Török

1

코드 검토는보다 정성적인 평가이고 정적 코드 분석은보다 정성적인 평가입니다.

이봐,이 방법은 더 잘 쓸 수있어

vs, fe

성능 저하 'wcslen (str)> 0'구문을 사용하여 빈 문자열을 식별하는 것은 비효율적입니다. 보다 효율적인 방법은 str [0]! = '\ 0'을 확인하는 것입니다.

성능 저하 strlen (MyStr.c_str ()) 종류의 표현은 MyStr.length ()로 다시 쓸 수 있습니다

성능 저하 '주문'이 반복자 인 경우 접두사 형태의 증분을 사용하는 것이 더 효과적입니다. iterator ++를 ​​++ iterator로 바꾸십시오.

실제 오류 는 (분명히) 존재하고 SCA에 의해 감지 될 수 있지만

잘못된 형식입니다. 'Foo'함수의 N 실제 인수를 확인하십시오.

표현식은 괄호로 두 번 묶었습니다 : ((식)). 한 쌍의 괄호가 불필요하거나 잘못 인쇄되었습니다

'memset'함수를 호출하면 버퍼 'dest.lfFaceName'의 언더 플로가 발생합니다.


모욕해서 미안해 내 (사라진) 의견이 말하고자하는 한, 인간이 정적 코드 분석의 출력 예와 동일한 의견을 제공 할 수없는 이유를 알고 있습니까?
sq33G

@ sq33G : 아니요. 사무용품 (실제로는 무한한 양의 용지)을 가진 사람은 임의의 튜링 기계를 시뮬레이션 할 수 있습니다. 그러나 그것은 지루하고 시간 소모적입니다. (아마도 주어진 것이 아니라 C에서 정의되지 않은 동작을 말합니다).
Maciej Piechotka

아 따라서 OP의 질문에 대한 진정한 대답은 Turing 기계가 사람이 완전하지 않다는 것입니다.
sq33G

0

정적 분석은 이슈가 실행되지 않고 분석 될 때입니다. 모든 아티팩트에 적용 할 수 있지만 종종 소스 코드 또는 객체 코드에 적용되며 이러한 작업 제품에 대한 정보를 분석하고 정보를 얻기 위해 특정 도구를 사용하는 것을 말합니다. 이 도구는 건설중인 시스템의 품질을 결정하고 개발 및 유지 관리 계획을위한 지침으로 엔지니어가 해석 한 보고서를 생성합니다. Wikipedia에는 언어별로 구성되고 해당 기능에 대한 간단한 설명이 포함 된 정적 분석 도구 목록이 있습니다 .

리뷰는 일부 작업 제품에 대한 인간 평가이며 코드 일 수 있습니다. 디자인이나 다른 문서에서도 검토를 수행 할 수 있습니다. 아이디어는 개발자 이외의 작업 제품에 익숙한 사람들이 보안 문제에서 코딩 표준 위반에 이르기까지 실수를 찾기 위해보고 있습니다.

기술적으로 코드 검토는 코드가 실제로 검토 중에 실행되지 않기 때문에 정적 분석의 한 형태로 간주 될 수 있습니다. 그러나 일반적인 용어로 "정적 분석"은 일반적으로 소스 또는 오브젝트 파일의 기계 구문 분석을 의미하는 반면 "검토"는 인간이 분석을 수행하는 사람임을 나타냅니다.


-2

코드 검토는 소스 코드의 문제를 매우 초기에 냄새 맡는 데 유용한 기술입니다. 이 연습의 일부로 성능, 확장 성 및 코딩 표준과 같은 많은 문제가 식별되고 수정되었습니다. 코드 품질이 향상됩니다.

정적 분석은 사이클로 메트릭 복잡성, 유지 관리 성 지수, 상속 깊이 및 클래스 커플 링과 같은 코드 품질 메트릭을 분석하는 데 사용됩니다. 코드 품질을 분석하기 위해 시장에서 다양한 도구를 사용할 수 있습니다. C # 개발자는 Microsoft Visual Studio를 사용하여 메트릭 보고서를 생성합니다.


-3

정적 코드 분석은 자동화 된 도구로 수행되며, 코드가 커밋되기 전에 사람들과 함께 코드 검토가 수행됩니다.

코드 검토 도구 :

1. 비교를 넘어

버전 관리 소프트웨어의 2.The diff

이 도구는 항상 이전 버전과 새 버전의 차이를 생성하는 데 사용됩니다.


2
1) 코드가 커밋되기 전에있을 필요는 없습니다. 코드 검토는 사람들이 수행합니다. 2) diff 도구에 대한 설명은 코드 검토 도구로 "흥미 롭습니다". 프로세스를 관리하는 데 도움이되는 코드 검토 도구에 대한 질문을 받았습니다 (예를 들어 Kiln 및 Crucible을 사용했습니다).
Murph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.