Integrasi PVS-Studio di PlatformIO

Gambar 5

Baru-baru ini, di lingkungan pengembangan sistem tertanam PlatformIO, dukungan untuk PVS-Studio telah muncul. Pada artikel ini, Anda akan belajar cara menguji kode Anda dengan penganalisa statis menggunakan proyek terbuka sebagai contoh.

Apa itu PlatformIO?


PlatformIO adalah alat pemrograman lintas-platform mikrokontroler. Inti dari PlatformIO adalah alat baris perintah, tetapi disarankan untuk menggunakannya sebagai plug-in untuk Visual Studio Code. Sejumlah besar chip dan motherboard modern yang didukungnya didukung. Itu dapat secara otomatis mengunduh sistem perakitan yang sesuai, dan situs ini memiliki banyak koleksi perpustakaan untuk mengelola komponen elektronik plug-in. Ada dukungan untuk beberapa alat analisa kode statis, termasuk PVS-Studio.

Proyek impor


Untuk mendemonstrasikan, mari kita ambil program kontrol hexapod ArduPod pada papan Arduino Mega.


Buat proyek baru untuk papan yang sesuai dan salin kode sumber:

Gambar 2

Di folder / arduino / AP_Utils / example / ada beberapa contoh program untuk mengkonfigurasi dan menjalankan hexapod, kita akan menggunakan servo_test.ino. Program untuk Arduino, sebagai suatu peraturan, dibuat dalam bentuk sketsa dalam format INO, yang dalam hal ini tidak sepenuhnya cocok. Untuk membuat file .cpp yang benar, biasanya cukup untuk mengubah ekstensi nama file, tambahkan header #include <Arduino.h> di awal , dan pastikan fungsi dan variabel global dideklarasikan sebelum mengaksesnya.

Gambar 3

Selama proses perakitan, kesalahan dapat terjadi tentang kurangnya perpustakaan pihak ketiga yang diperlukan. Namun, PlatformIO akan membantu Anda menemukannya di repositori Anda.

In file included from src\servo_test.cpp:20:0:
src/AP_Utils.h:10:37: fatal error: Adafruit_PWMServoDriver.h:
No such file or directory
*******************************************************************************
* Looking for Adafruit_PWMServoDriver.h dependency? Check our library registry!
*
* CLI> platformio lib search "header:Adafruit_PWMServoDriver.h"
* Web> https://platformio.org/lib/search?query=header:Adafruit_PWMServoDriver.h
*
*******************************************************************************
compilation terminated.

Tautan akan menunjukkan opsi yang sesuai, dan pemasangan dependensi dilakukan dengan satu perintah di terminal:

pio lib install "Adafruit PWM Servo Driver Library"

Mengkonfigurasi analisis dan memulai tes


Untuk mengkonfigurasi analisis, Anda perlu mengedit konfigurasi platformio.ini seperti ini:

[env:megaatmega2560]
platform = atmelavr
board = megaatmega2560
framework = arduino
check_tool = pvs-studio
check_flags =
  pvs-studio:
    --analysis-mode=4 ; General analysis mode. Set to 32 for MISRA
    --exclude-path=/.pio/libdeps ; Ignore dependency libraries

Parameter check_tool menunjukkan penganalisa kode mana yang akan digunakan, dan konfigurasinya dilakukan pada parameter check_flags . Instruksi lebih rinci dapat ditemukan dalam dokumentasi di situs web resmi: https://docs.platformio.org/en/latest/plus/check-tools/pvs-studio.html

Akhirnya, Anda dapat menjalankan pemeriksaan proyek dengan perintah di terminal. Sebelum pengujian pertama, lingkungan itu sendiri mengunduh distribusi alat analisa saat ini.

pio check

Hasil dari pengecekan program hexapod


Kali ini, tujuan dari artikel ini adalah untuk menunjukkan integrasi PVS-Studio dengan PlatformIO, dan bukan untuk menunjukkan kemampuan diagnostik penganalisa. Namun, begitu proyek telah diverifikasi, pertimbangkan beberapa kesalahan yang ditemukan untuk menunjukkan bahwa proyek berhasil dianalisis.

V519 Ada sub-ekspresi identik ke kiri dan ke kanan operator '-': pow (t, 2) - pow (t, 2). AP_Utils.cpp 176

pointLeg* AP_Utils::traceLeg(uint8_t leg, float phi, float z,
  int resolution, uint8_t shape) {
  ....
  if(shape == ELLIPTIC) {
    ....
    float v = sqrt(pow(phi - legs[leg].phi, 2) + pow(z - legs[leg].z, 2));
    float u = sqrt(pow(phi - phi0, 2) + pow(z - z0, 2));
    float t = sqrt(pow(phi0 - legs[leg].phi, 2) + pow(z0 - legs[leg].z, 2));
    theta = acos((pow(t, 2) - pow(t, 2) - pow(v, 2))/(-2.0*t*u));
    ....
  }
  ....
}

Dua ekspresi identik dikurangi satu sama lain. Tidak jelas apa arti matematika dari perbedaan ini. Mungkin programmer tidak mengurangi ekspresi. Atau mungkin salah ketik diizinkan, dan argumen lain harus ada di salah satu dari t ini .

V550 Perbandingan presisi yang aneh: value! = - 1. Mungkin lebih baik menggunakan perbandingan dengan presisi yang ditentukan: fabs (A - B)> Epsilon. AP_Utils.cpp 574

float AP_Utils::sr04_average(uint8_t trig, uint8_t echo,
  int unit, int samples, int time) {
  ....
  float average, pause, value;
  ....
  for(int i=0; i<samples; i++) {
    value = sr04(trig, echo, unit);
    if(value != -1) { // <=
      total += value;
      delay(pause);
    } else {
      i--;
    }
  }
  average = total/samples;
  ....
  return average;
}

Peringatan menunjukkan perbandingan angka floating point yang tidak akurat. Karena ketidakmungkinan representasi akurat bilangan real dengan jumlah bit terbatas, lebih aman untuk menetapkan kesetaraan bilangan pecahan dengan membandingkan perbedaannya dengan indeks akurasi yang diberikan. Misalnya, sesuatu seperti ini:

bool is_equal(double x, double y) {
  return std::fabs(x - y) < 0.001f;
}

Satu-satunya cara yang aman untuk secara langsung membandingkan angka-angka non-integer adalah dengan menetapkan konstanta ke variabel, dan kemudian membandingkan nilainya dengan konstanta ini. Dalam hal ini, nilai dari variabel nilai di mana saja tidak secara khusus ditugaskan -1. Ini adalah cara kerja metode AP_Utils :: sr04 , yang mengembalikan nilai yang diperiksa:

float AP_Utils::sr04(uint8_t trig, uint8_t echo, int unit) {
  ....
  float duration, distance;
  ....
  duration = pulseIn(echo, HIGH);
  distance = (346.3*duration*0.000001*unit)/2; // <=
  
  if((distance >= 0.02*unit) && (distance <= 4*unit)) {
    ....
    return(distance);
  } else {
    ....
    return 0;
  }
}

Seperti yang Anda lihat, nilainya ditulis hasil dari beberapa perhitungan. Penugasan -1 tidak terlihat, tetapi AP_Utils :: sr04 dapat mengembalikan 0, dan ini menunjukkan bahwa perbandingan tidak dibuat dengan hasil.

Kesimpulan


Dalam artikel ini, kami memeriksa proses pengecekan proyek pada mikrokontroler dengan penganalisa kode statis dalam lingkungan pemrograman untuk sistem PlatformIO tertanam. Biarkan saya mengingatkan Anda bahwa semua orang yang ingin mencoba PVS-Studio dapat menggunakan mode uji coba , dan untuk proyek terbuka ada peluang untuk mendapatkan lisensi gratis .

Bagi mereka yang ingin mempelajari lebih lanjut tentang fitur-fitur PVS-Studio secara lebih rinci, saya sarankan Anda untuk melihat artikel berikut:




Jika Anda ingin berbagi artikel ini dengan audiens yang berbahasa Inggris, silakan gunakan tautan ke terjemahan: Alexey Govorov. Integrasi PVS-Studio dalam PlatformIO .

All Articles