PVS-Studio zur Unterstützung bei schulischen Aufgaben in C und C++

PVS-Studio zur Unterstützung bei schulischen Aufgaben in C und C++

Heute werde ich etwas mehr über Fragen sprechen, die auf Stack Overflow gepostet wurden – insbesondere über eine andere Diskussion, die von jemandem gestartet wurde, der die Sprache C++ lernt. Ich möchte darauf hinweisen, dass PVS-Studio eine große Hilfe sein kann, wenn Sie gerade erst Programmieren lernen. Es beantwortet viele Ihrer Fragen – und Sie müssen nicht warten, bis andere Ihnen auf Stack Overflow antworten!

In meinem vorherigen Artikel habe ich beschrieben, wie die Online-Version des PVS-Studio-Analyzers Programmieranfängern das Leben erleichtern kann. Jetzt werde ich einen ähnlichen Fall überprüfen.

Es ist eine Diskussion, die ich bei Stack Overflow gefunden habe:"C++ error:"pointer being freed was notally". Lassen Sie uns den Code untersuchen:

#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;
}

Stimmen Sie zu, dass es für einen durchschnittlichen Experten von Stack Overflow langweilig ist, den obigen Code Zeile für Zeile zu untersuchen – insbesondere angesichts der Tatsache, dass der fragliche Code eine einfache schulaufgabenähnliche Aufgabe lösen soll. Aber eigentlich ist es nicht nötig, Experten abzulenken und auf ihre Antwort zu warten. Lassen Sie stattdessen den Analysator von PVS-Studio den Code untersuchen!

Und hier ist, was es meldet:V506 Der Zeiger auf die lokale Variable „next_xs“ wird außerhalb des Geltungsbereichs dieser Variablen gespeichert. Ein solcher Zeiger wird ungültig.

Hier ist die Zeile, in der der Analysator das Problem gefunden hat:

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

Und der Analysator hat in der Tat recht. Der Code speichert einen Verweis auf ein Objekt. Dann wird dieses Objekt zerstört. Leute bei Stack Overflow haben auch auf diesen Fehler hingewiesen und ihn erklärt. Man muss jedoch nicht darauf warten, dass erfahrenere Kollegen ein Problem untersuchen und darauf antworten können. In diesem Fall kann man in der PVS-Studio-Dokumentation zur V506-Diagnose alles über den Fehler erfahren.

Fazit

Wie Sie dem obigen Beispiel entnehmen können, kann man PVS-Studio beim Programmieren lernen verwenden. Die Warnungen des Analysators können Anfängern dabei helfen, herauszufinden, was in ihrem Code falsch ist. Dies ist natürlich kein Ersatz für eine echte Codeüberprüfung durch Experten oder Kollegen. Neben der Suche nach Fehlern kann ein Entwickler Tipps zur Verbesserung des Codes geben. Die statische Analyse ist jedoch immer noch ein schnelles und effektives Werkzeug, das man beim Erlernen des Programmierens verwenden kann.

Zusätzliche Ressourcen:

  • Statische Codeanalyse.
  • PVS-Studio:Online-Version.
  • PVS-Studio:kostenlose Nutzung für Studenten.