Pertanyaan Apa konsekuensi dari mengabaikan: peringatan: parameter yang tidak digunakan


Saya sedang mengerjakan proyek C ++ dan saya perhatikan bahwa kami memiliki sejumlah peringatan tentang parameter yang tidak digunakan.

Apa efeknya jika peringatan ini diabaikan?


18
2017-11-21 09:44


asal


Jawaban:


Fungsi dengan parameter yang tidak digunakan mungkin memiliki bug nyata dalam kasus-kasus berikut:

  1. Ada sebuah keluaran parameter, yang tidak ditugaskan atau ditulis ke dalam, menghasilkan nilai tidak terdefinisi untuk pemanggil.

  2. Salah satu parameter adalah penunjuk fungsi callback, yang harus Anda panggil dan lupakan untuk melakukannya. Dapat terjadi jika ada banyak #ifdefdalam fungsi.

  3. Anda mendeklarasikan variabel lokal dengan nama yang sama yang bayangan parameter dan kemudian menggunakan nilai yang salah dalam fungsi.

Tidak menggunakan memasukkan parameter mungkin tidak berbahaya, tetapi Anda dapat mengurangi kebisingan untuk melihat peringatan yang berguna dengan menandai parameter input yang tidak digunakan secara eksplisit di awal fungsi dengan mentransmisikannya ke void (berfungsi untuk C dan C ++):

(void)param1;

Atau,

#define UNUSED(expr) do { (void)(expr); } while (0)
...

void foo(int param1, int param2)
{
    UNUSED(param2);
    bar(param1);
}

Atau hilangkan nama parameter (C ++ saja):

void foo(int param1, int /*param2*/)
{
    bar(param1);
}

53
2017-11-21 09:49



Jika Anda memiliki banyak peringatan tidak penting yang tidak penting bagi Anda, Anda mungkin mengabaikan peringatan penting tentang baris kode yang baru saja Anda tulis yang bersembunyi di tengah-tengahnya.


14
2017-11-21 09:47



Untuk cara khusus gcc untuk menonaktifkan peringatan, Anda dapat menggunakan __attribute__((unused)) seperti

void foo(int a, int b __attribute__((unused))) {

}

Untuk mengabaikan parameter kedua. Jika program Anda bergantung pada teknologi GCC, Anda dapat menggunakan atribut itu untuk menjadi 100% aman dari jenis peringatan tersebut.


14
2018-01-03 15:26



Ini berarti Anda menulis fungsi yang mengambil parameter tetapi tidak menggunakan parameter. Ini tidak berbahaya tetapi mungkin menunjukkan bug dalam beberapa kasus.

Umumnya Anda dapat membungkam peringatan ini dengan menghapus nama parameter, membuatnya anonim, tapi itu mungkin tidak diinginkan tergantung mengapa parameter tidak digunakan.

Saya akan menyarankan Anda untuk mematikan peringatan jika itu membuat lebih sulit untuk menemukan masalah sebenarnya.


1
2017-11-21 09:47



Di C ++ Anda dapat memiliki argumen default:

int sum(int first, int second=0){   // should not give warning
    return first+first;
}

Anda juga dapat memiliki argumen tambahan:

int sum(int first, int second){     // should give warning
    first *= 2;
    return first;
}

Jika Anda memiliki parameter yang tidak Anda gunakan dan itu tidak gagal, Anda harus mendapatkan peringatan karena Anda meminta program untuk memberikan nilai ekstra ke tumpukan yang tidak pernah direferensikan, dan karena itu melakukan lebih banyak pekerjaan daripada yang seharusnya.

Mungkin itu berarti Anda lupa bagian dari logika fungsi juga.


1
2017-11-21 10:08



Tidak ada. kecuali [EDIT]: seperti yang telah ditunjukkan oleh orang lain, Anda dapat memiliki parameter output yang tidak ditetapkan.

Anda harus membersihkannya, karena dalam banyak kesempatan saya telah melihat pengembang mengabaikan peringatan penting yang 'tersembunyi' di antara sejumlah besar peringatan, dan mereka begitu terbiasa melihat peringatan bahwa mereka tidak pernah memperhatikan mereka. Saya mencoba untuk memiliki peringatan nol setiap saat, dan mengatur peringatan kompilator ke tingkat maksimum.


1
2017-11-21 09:47



Itu tergantung apakah Anda berniat menggunakan paramater. Misalnya.

const int Size = 12; // intended for use in some other function

char* MakeBuffer(int size)
{
   return new char[Size];
}

Dalam kode ini 'ukuran' tidak digunakan, dan sebagai gantinya 'Ukuran' konstan digunakan. Jadi, peringatan akan menyoroti masalah jenis ini untuk Anda.

Namun, jika Anda tidak pernah menjorok ke dalam menggunakan parameter maka itu hanya harus dihapus dari tanda tangan metode. Kecuali Anda perlu mencocokkan tanda tangan untuk metode virtual, atau penunjuk fungsi, jika itu yang terjadi maka Anda tidak memiliki opsi untuk menghapusnya.


1
2017-11-21 10:02



Jika suatu metode tidak menggunakan parameter maka pertanyaan pertama yang muncul adalah mengapa parameter itu menjadi bagian dari tanda tangan metode di tempat pertama. Peringatan ini masuk akal karena ini adalah desain yang buruk yang mengacu dan lebih jauh lagi, ada sedikit overhead juga bahwa setiap kali metode ini dipanggil, parameter ini didorong pada stack, yang terbaik adalah untuk refactor metode dan menghapus parameter semacam itu yang tidak ada gunanya.

Karena itu, meninggalkan parameter ini tidak membahayakan banyak kecuali untuk overhead kecil yang saya sebutkan.


0
2017-11-21 09:49