C 및 C++에서 학업과 같은 작업을 도와주는 PVS-Studio

오늘은 Stack Overflow에 게시된 질문, 특히 C++ 언어를 배우는 사람이 시작한 또 다른 토론에 대해 좀 더 이야기하겠습니다. 코딩을 배우는 중이라면 PVS-Studio가 큰 도움이 될 수 있습니다. 많은 질문에 답할 수 있으며 Stack Overflow에서 다른 사람이 답할 때까지 기다릴 필요가 없습니다!



previous article에서 PVS-Studio 분석기의 온라인 버전이 어떻게 초보 프로그래머의 삶을 더 쉽게 만들어 주는지 설명했습니다. 이제 비슷한 사례를 검토하겠습니다.

Stack Overflow: "C++ error: "pointer being freed was not allocated "에서 찾은 토론입니다. 코드를 조사해 보겠습니다.

#include <stdexcept>
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using std::cout;
using std::endl;
using std::vector;      

typedef vector<int> ints;

void print_ints(vector<int>);
void print_ints_vec(vector<vector<int>>);
void int_part(int, vector<vector<int>>&);

int main() 
{
  vector<vector<int>> partition;
  int_part(5, partition);
  print_ints_vec(partition);

  return 0;
}

void int_part(int sum, vector<vector<int>>& res)
{
  vector<int> init_xs = vector<int>{sum};
  vector<int>* xs = &init_xs; // POINTER INITIALIZED TO vector<int>
  int current_sum = sum;

  while (true) 
  {
    current_sum = accumulate(xs->begin(), xs->end(), 0);

    if (current_sum == sum)
    {
      res.push_back(*xs);
      vector<int> next_xs;
      vector<int>::iterator it = find(xs->begin(), xs->end(), 1);
      if (it == xs->begin()) return;
      copy(xs->begin(), it, back_inserter(next_xs));
      next_xs[next_xs.size() - 1] -= 1;
      xs = &next_xs; // POINTER REASSIGNED TO ANOTHER vector<int>
    }
    else 
    {
      int tail = xs->back();
      int diff = sum - current_sum;
      int m = std::min(tail, sum - tail);
      int next_tail = current_sum + m > sum ? diff : m;
      xs->push_back(next_tail);
    }
  }
}

void print_ints(ints v) // PRINT UTILITY
{
  cout << "[ ";
  for (const int& n : v) { cout << n << "; "; }
  cout << "]" << endl;
}

void print_ints_vec(vector<ints> v) // PRINT UTILITY
{
  cout << "[ \n";
  for (const vector<int>& xs : v) { cout << "  "; print_ints(xs); }
  cout << "]" << endl;
}


Stack Overflow의 일반 전문가에게 위의 코드를 한 줄씩 검사하는 것은 지루하다는 데 동의합니다. 특히 문제의 코드가 쉬운 학업과 같은 작업을 해결할 것으로 예상된다는 사실을 고려할 때 그렇습니다. 그러나 실제로는 전문가의 주의를 분산시키고 답변을 기다릴 필요가 없습니다. 대신 PVS-Studio 분석기가 코드를 검사하도록 하십시오!

그 내용은 다음과 같습니다reports. V506 로컬 변수 'next_xs'에 대한 포인터가 이 변수의 범위 밖에 저장됩니다. 이러한 포인터는 무효화됩니다.

분석기가 문제를 발견한 줄은 다음과 같습니다.

xs = &next_xs; // POINTER REASSIGNED TO ANOTHER vector<int>


그리고 분석기는 실제로 정확합니다. 이 코드는 개체에 대한 참조를 저장합니다. 그런 다음 이 객체는 파괴됩니다. Stack Overflow의 사람들도 이 오류를 지적하고 설명했습니다. 그러나 더 경험이 많은 동료가 문제를 조사하고 응답할 수 있을 때까지 기다릴 필요가 없습니다. 이 경우 V506 진단에 대한 PVS-Studio 문서에서 오류에 대한 모든 것을 알 수 있습니다.

결론



위의 예에서 볼 수 있듯이 코딩을 배울 때 PVS-Studio를 사용할 수 있습니다. 분석기의 경고는 초보 개발자가 코드의 잘못된 점을 파악하는 데 도움이 될 수 있습니다. 물론 이것은 전문가나 동료가 수행한 실제 코드 검토를 대체하지 않습니다. 오류를 찾는 것 외에도 개발자는 코드 개선에 대한 팁을 제공할 수 있습니다. 그러나 정적 분석은 여전히 ​​코딩을 배울 때 사용할 수 있는 빠르고 효과적인 도구입니다.

추가 리소스:

  • Static code analysis .
  • PVS-Studio: online version .
  • PVS-Studio: free use for students .
  • 좋은 웹페이지 즐겨찾기