2013-08-09 3 views
1

주어진 메서드가 null을 반환하거나 반환하지 않을 수있는 경우 프로그래밍 방식으로 검색해야합니다.null을 리턴하는 메소드를 검출하는 정적 바이트 코드 분석 도구?

checker framework은 주석 처리 된 소스 코드에서만 가능할 것으로 보입니다. 바이트 코드가 필요합니다. 특히, 다음과 같은 요청을 확인해야합니다.

Method x.y.Z#foo() cannot return null. 

여기에는 x.y.Z 클래스의 바이트 코드 만 있습니다.

지원할 수있는 도구가 있습니까?

일반적인 경우에도 가능합니까? 지금까지 볼 수있는 한, 프로그램을 통해 정확한 경로를 파악할 필요가 없기 때문에 중지 문제와 동일하지 않습니다.

Foo bar() { 
    if (cond) { return null; } else { return new Foo(); } 
} 

예를 들어 분석 도구에 대한 cond 신경 필요가 없다, 모든 가능한 경로 중 적어도 하나에, null가 반환됩니다 충분하다, 그래서 막대가 null을 반환 할 수 없다는 주장은 거부 될 수 있습니다.

참고 : 나는 예를 들어, cond 그냥 false을 할 수 있고 분석 도구는 여전히 막대() 우리는 cond을하는 일반적인 경우에 proove 수 없다는 것과 같습니다 널 (null)을 (반환 할 수를 주장 할 수, 오탐 (false positive)을 받아 들일 것 사실이어야합니다).

+2

실행하지 않고있는 경우 * 모든 * 방법 * 힘 *는 null을 결정하는 것은 불가능 할 것 모든 가능한 코드 경로를 통해. –

+1

일반적으로 이는 중지 문제와 동일합니다. 한 가지는 'null'을 반환 할 수 있는지 여부를 알기 전에 반환할지 여부를 알아야합니다. – SLaks

+0

@SLaks 나는 그렇게 생각하지 않는다. 나는 적어도 하나의 경로가'return null'으로 연결된다는 것을 입증 할 필요가 있습니다. 'if (false) return null;과 같은 오탐 (false positive)을 갖는 것이 좋습니다.이 질문을 명확하게 편집 할 것입니다. – Ingo

답변

2

이 작업을 수행하는 도구에 대해서는 잘 모르겠지만 오 탐지 (false positives)가 허용되는 경우에는 이것이 가능하다고 생각합니다.

방법에서 리턴 값은 궁극적
  • A는
  • 필드
  • 다른 자바 메소드 호출의 결과 파라미터를 제공
  • 있어서 내에

    • 상수 중 하나로부터 공급 될 것이다

    • 기본 호출 결과
    • A 생성자 호출
    • 소스 내가 잊어 버린에 대한

    당신이 어떤 필드 또는 매개 변수가 null이 될 수 있음을, 그리고 네이티브 호출이 널 (null) 각 방법으로 가능하게 표시 할 수 있습니다 반환 null을 반환 할 수 있다고 가정하면

      경우
    • 방법의 흐름에있어서의 흐름 파라미터 값 께 m의
    • 흐름을 리턴 할 수있는 필드를
    • 방법의 흐름을 리턴 할 수
    • 상수 널을 반환 할 생산 가능성으로 ethod 자체가

    그러나 null을 반환 할 수있는 방법에서 값을 반환 할 수 있습니다 네이티브 호출

  • 방법의 흐름을의 결과를 반환 할 수 있습니다, 아마 유용하지 않다 높은 비율의 가양 성 (허용 가능한 최대 백분율을 가져야합니다. 그렇지 않으면 단순히 true를 반환하는 방법으로 요구 사항을 충족시킬 수 있습니다).

    추론을 추가하여 null로 간주되는 필드/매개 변수/메서드 수를 줄일 수 있습니다.

    ASM 트리 API는 플로우 분석을 포함하여이를 구현하고 구현하는 데 필요한 모든 구성 요소를 제공합니다.

  • +0

    좀 더 복잡해 질 것입니다. 필자는 필드와 매개 변수 값으로 인한 오판 (false positive)을 피하고 싶습니다. 후자의 경우 null인지 여부를 알 수 있습니다. – Ingo

    +0

    문제의 범위를 줄이려면 edu.umd.cs.findbugs.annotations.NonNull 주석 (또는 다른 주석 중 하나)을 사용할 수 있습니다. 나는 findbugs 분석이 이들을 제공 하는지를 잊어 버렸지 만, 당신의 코드베이스가 이것들에 대한 findbugs 경고를 가지고 있다고 가정한다면, 당신의 도구는 주석 필드가 null이 아닌 것을 신뢰할 수있다. – henry

    1

    두 가지 가능성이 마음에 와서 :

    • 사용 findbugs를. 그것을위한 NP 검사, 예를 들어,로 시작하는 버그 패턴
      • NP_LOAD_OF_KNOWN_NULL_VALUE
      • NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
      • NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE는 또한

    해당 검사하여 own bug pattern을 구축 할 수 있습니다 ...

    • ecl에서 빌드 사용 ipse 체커. Preferences \ Java \ Compiler \ Errors/Warnings로 가면 거기에 전체 섹션 (Null 분석)이 있습니다. 당신은 경고 또는 오류로 그 설정을 변경할 수 있습니다 ...

    [업데이트]

    프로그래밍을하고 싶은 경우에 당신은 (findbugs 등)을 수행하고 할 바이트 코드 라이브러리를 사용할 수는 DOM과

    • BCEL을 유사 API
    • ASM과 SAX 유사 API 자습서, 사용자 가이드 및 참조 문서를 사용할 수 있습니다. here

    ASM은 good choice 인 것으로 보입니다. 그리고 내가 정확하게 findbugs를 기억하면 ASM으로 바뀌 었습니다 (그러나 여전히 내부에 bcel이 있습니까?). 처음부터 시작하지 않으려면 탐지기와 함께 findbug를 사용하여 라이브러리로 사용할 수 있습니다. 따라서 함수를 감지하여 함수를 프로그래밍 방식으로 시작한 다음 반환 값을 분석합니다. 자세한 내용은 findbugs 메일 링리스트에 문의하십시오.

    [갱신 2]guy는 당신이 필요로 정확히 어떤 일을 할 수 - 그래서 당신은 그에게 연락한다 ...

    +0

    Findbugs는 훌륭하지만 프로그래밍 방식으로 수행해야합니다. – Ingo