문제

보고 싶은 모든 곳에서 내 코드(C++)는 반환 값은 무시의 기능이 있습니다.어떻게 할 수 있습니다-gcc 또는 코드는 정적 분석 도구입니까?

잘못된 코드를 들어:

int f(int z) {
    return z + (z*2) + z/3 + z*z + 23;
}


int main()
{
  int i = 7;
  f(i); ///// <<----- here I disregard the return value

  return 1;
}

다음 사항에 주의하십시오.

  • 그것은 작동하는 경우에도 기능과 사용이 다른 파일
  • 무료 정적 검사 도구
도움이 되었습니까?

해결책

당신은 GCC를 원합니다 warn_unused_result 기인하다:

#define WARN_UNUSED __attribute__((warn_unused_result))

int WARN_UNUSED f(int z) {
    return z + (z*2) + z/3 + z*z + 23;
}

int main()
{
  int i = 7;
  f(i); ///// <<----- here i disregard the return value
  return 1;
}

이 코드를 컴파일하려고 시도합니다.

$ gcc test.c
test.c: In function `main':
test.c:16: warning: ignoring return value of `f', declared with
attribute warn_unused_result

당신은 이것을 사용하는 것을 볼 수 있습니다 리눅스 커널; 그들은 가지고 있습니다 __must_check 같은 일을하는 매크로; 이것이 작동하려면 GCC 3.4 이상이 필요한 것 같습니다. 그런 다음 커널 헤더 파일에 사용 된 매크로를 찾을 수 있습니다.

unsigned long __must_check copy_to_user(void __user *to,
                                        const void *from, unsigned long n);

다른 팁

내가 알고있는 한이 경고를 할 GCC 옵션이 없습니다. 그러나 특정 기능에 관심이 있으시면 속성으로 태그를 붙일 수 있습니다.

int fn() __attribute__((warn_unused_result));

FN ()의 반환 값이 사용되지 않으면 경고를합니다. 경고 : 나는이 기능을 직접 사용한 적이 없습니다.

이 편리한 템플릿을 사용하여 런타임에 수행 할 수 있습니다.

오류 코드 (예 : hresult)를 반환하는 대신 return_code를 반환합니다.u003CHRESULT> , 값을 읽지 않고 범위를 벗어나지 않으면 주장합니다. 정적 분석 도구는 아니지만 유용하지 않습니다.

class return_value
{
public:
  explicit return_value(T value)
    :value(value), checked(false)
  {
  }

  return_value(const return_value& other)
    :value(other.value), checked(other.checked)
  {
    other.checked = true;
  }

  return_value& operator=(const return_value& other)
  {
    if( this != &other ) 
    {
      assert(checked);
      value = other.value;
      checked = other.checked;
      other.checked = true;
    }
  }

  ~return_value(const return_value& other)
  {
    assert(checked);
  }

  T get_value()const {
    checked = true;
    return value;
  }

private:
  mutable bool checked;
  T value;
};

C ++ 17의 경우이 질문에 대한 답은 이제 우리가 [Nodiscard] 기인하다. 덮여 dcl.attr.nodiscard:

속성 Token Nodiscard는 함수 선언에서 선언자 ID 또는 클래스 또는 열거 선언에 적용될 수 있습니다. 각 속성 목록에 최대 한 번 표시되며 속성 연락 조명이 없어야합니다.

그리고

예시:

struct [[nodiscard]] error_info { /* ... */ };
error_info enable_missile_safety_mode();
void launch_missiles();
void test_missiles() {
  enable_missile_safety_mode(); // warning encouraged
  launch_missiles();
}
error_info &foo();
void f() { foo(); }             // warning not encouraged: not a nodiscard call, because neither
                                // the (reference) return type nor the function is declared nodiscard

- 끝 예

그래서 당신의 예제 수정 (라이브를 본다):

[[nodiscard]] int f(int z) {
    return z + (z*2) + z/3 + z*z + 23;
}


int main()
{
  int i = 7;
  f(i); // now we obtain a diagnostic

  return 1;
}

이제 GCC와 Clang EG로 진단을받습니다.

warning: ignoring return value of function declared with 'nodiscard' attribute [-Wunused-result]
  f(i); // now we obtain a diagnostic
  ^ ~

모든 정적 분석 코드 (예 : PC 린트)를 말할 수 있어야합니다. PC-Lint의 경우 이것이 사실임을 알고 있습니다.

정적 분석기는 귀하를 위해 작업을 수행하지만 코드 기반이 더 많으면 사소한 준비를 압도 할 준비 ;-)

정적 분석기가 여기에서 가장 좋은 방법입니다. 우리는 여기에 덮개를 사용하지만 있습니다 무료 도구 사용할 수 있습니다.

빠른 솔루션이 필요하고 Linux 스타일의 쉘이 편리한 경우 다음과 같은 것을 시도 할 수 있습니다.

grep -rn "function_name" * | grep -v "="

지정된 함수를 참조하지만 "="를 포함하지 않는 모든 줄을 찾을 수 있습니다. 당신은 많은 잘못된 긍정적 (그리고 잠재적으로 허위 네거티브)을 얻을 수 있지만 정적 분석기가 없다면 시작하기에 괜찮은 곳입니다.

클래식'린트'프로그램을 사용하여 매우 습성는 함수에 대해서는 반환하는 값을 무시되었습니다.문제되었고,많은 사람들의 보고서 원하지 않는 선도하는 과도한 소음에서는 린트 출력(었기의 비트를 보풀하고 싶어 그것을 무시하).는 이유는 아마도 GCC 가 없 표준에 대한 경고 그것.

다른 문제가-플립 사이드-은"당신은 어떻게 경고를 표시하지 않도록 설정합니다면 당신은 당신이 알고 무시한 결과 하지만 정말로 걱정하지 않".고전적인 시나리오에 대한 즉:

if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
    signal(SIGHUP, sighandler);

당신의 첫 번째 결과 signal();당신이 알고 있는 두 번째는 것이 일 부 시 스 템 호 출 들 이 시기 때문에(당신은 그것을 설정하는).에서 얻을 수 있고,가끔 사용하여 어떤 변형:

if ((old = signal(SIGHUP, SIG_IGN)) != SIG_IGN)
    old = signal(SIGHUP, sighandler);

이 할당 old 모두 번입니다.따를 수 있는'주장(오래된==일 부 시 스 템 호 출 들 이 시)'.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top