C 및 C++에서 학업과 같은 작업을 도와주는 PVS-Studio
4685 단어 beginnerscppprogrammingtutorial
내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 .
Reference
이 문제에 관하여(C 및 C++에서 학업과 같은 작업을 도와주는 PVS-Studio), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/unicorn_developer/pvs-studio-to-help-with-schoolwork-like-tasks-in-c-and-c-1c7i텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)