Peringatan kompiler yang nonaktif secara default
Kompiler mendukung peringatan yang dinonaktifkan secara default, karena sebagian besar pengembang tidak menemukannya berguna. Dalam beberapa kasus, mereka memperingatkan tentang pilihan gaya, atau tentang idiom umum dalam kode yang lebih lama. Peringatan lainnya adalah tentang penggunaan ekstensi Microsoft ke bahasa tersebut. Beberapa peringatan menunjukkan area di mana programmer sering membuat asumsi yang salah, yang dapat menyebabkan perilaku yang tidak terduga atau tidak terdefinisi. Jika semua peringatan ini diaktifkan, beberapa di antaranya mungkin muncul berkali-kali di header pustaka. Pustaka runtime C dan pustaka standar C++ dimaksudkan untuk tidak mengeluarkan peringatan hanya pada tingkat /W4
peringatan .
Aktifkan peringatan yang nonaktif secara default
Anda dapat mengaktifkan peringatan yang biasanya nonaktif secara default dengan menggunakan salah satu opsi berikut:
#pragma warning(default :
warning_number)
Peringatan yang ditentukan (warning_number) diaktifkan pada tingkat defaultnya. Dokumentasi untuk peringatan berisi tingkat default peringatan.
#pragma warning(
:
warning_number warning_level)
Peringatan yang ditentukan (warning_number) diaktifkan pada tingkat yang ditentukan (warning_level).
-
/Wall
mengaktifkan semua peringatan yang nonaktif secara default. Jika Anda menggunakan opsi ini, Anda dapat menonaktifkan peringatan individual dengan menggunakan opsi ./wd
-
Opsi ini memungkinkan peringatan nnnn pada tingkat L.
Peringatan yang nonaktif secara default
Visual Studio 2015 dan versi yang lebih baru
Peringatan berikut dinonaktifkan secara default di Visual Studio 2015 dan versi yang lebih baru:
Peringatan | Pesan |
---|---|
C4061 (tingkat 4) | enumerator 'pengidentifikasi' dalam sakelar enum 'enumerasi' tidak ditangani secara eksplisit oleh label kasus. |
C4062 (tingkat 4) | enumerator 'pengidentifikasi' dalam sakelar enum 'enumerasi' tidak ditangani. |
C4165 (tingkat 1) | 'HRESULT' sedang dikonversi menjadi 'bool'; Apakah Anda yakin ini adalah apa yang Anda inginkan? |
C4191 (tingkat 3) | 'operator': konversi tidak aman dari 'type_of_expression' ke 'type_required' |
C4242 (tingkat 4) | 'pengidentifikasi': konversi dari 'type1' ke 'type2', kemungkinan hilangnya data |
C4254 (tingkat 4) | 'operator': konversi dari 'type1' ke 'type2', kemungkinan hilangnya data |
C4255 (tingkat 4) | 'function': no function prototype given: converting '()' to '(void)' |
C4263 (tingkat 4) | 'function': fungsi anggota tidak mengambil alih fungsi anggota virtual kelas dasar apa pun |
C4264 (tingkat 1) | 'virtual_function': tidak ada penimpaan yang tersedia untuk fungsi anggota virtual dari 'kelas' dasar; fungsi disembunyikan |
C4265 (tingkat 3) | 'class': class memiliki fungsi virtual, tetapi destruktor bukan virtual |
C4266 (tingkat 4) | 'function': no override available for virtual member function from base 'type'; function is hidden |
C4287 (tingkat 3) | 'operator': ketidakcocokan konstanta tidak bertanda/negatif |
C4289 (tingkat 4) | ekstensi nonstandar yang digunakan : 'var' : variabel kontrol perulangan yang dideklarasikan dalam for-loop digunakan di luar lingkup for-loop |
C4296 (tingkat 4) | 'operator': ekspresi selalu salah |
C4339 (tingkat 4) | 'type' : penggunaan jenis yang tidak terdefinisi yang terdeteksi dalam meta-data CLR - penggunaan jenis ini dapat menyebabkan pengecualian runtime |
C4342 (tingkat 1) | perubahan perilaku: 'fungsi' dipanggil, tetapi operator anggota dipanggil dalam versi sebelumnya |
C4350 (tingkat 1) | perubahan perilaku: 'member1' dipanggil alih-alih 'member2' |
C4355 | 'ini' : digunakan dalam daftar inisialisasi anggota dasar |
C4365 (tingkat 4) | 'action': konversi dari 'type_1' ke 'type_2', ketidakcocokan yang ditandatangani/tidak ditandatangani |
C4370 (tingkat 3) | tata letak kelas telah berubah dari versi pengkompilasi sebelumnya karena pengemasan yang lebih baik |
C4371 (tingkat 3) | 'class-name': tata letak kelas mungkin telah berubah dari versi kompiler sebelumnya karena pengemasan anggota 'anggota' yang lebih baik |
C4388 (tingkat 4) | ketidakcocokan yang ditandatangani/tidak ditandatangani |
C4412 (tingkat 2) | 'function': tanda tangan fungsi berisi tipe 'type'; Objek C++ tidak aman untuk diteruskan antara kode murni dan campuran atau asli |
C4426 (tingkat 1) | bendera pengoptimalan berubah setelah menyertakan header, mungkin karena #pragma optimize() 14.1 |
C4435 (tingkat 4) | 'class1' : Tata letak objek di bawah /vd2 akan berubah karena basis virtual 'class2'. |
C4437 (tingkat 4) | dynamic_cast dari 'class1' dasar virtual ke 'class2' dapat gagal dalam beberapa konteks. |
C4444 (tingkat 3) | '__unaligned' tingkat atas tidak diimplementasikan dalam konteks ini. |
C4464 (tingkat 4) | relative include path contains '..' |
C4471 (tingkat 4) | deklarasi maju dari enumerasi yang tidak terlingkup harus memiliki jenis yang mendasar (diasumsikan int) Perm |
C4472 (tingkat 1) | 'pengidentifikasi' adalah enum asli: tambahkan penentu akses (privat/publik) untuk mendeklarasikan enum terkelola |
C4514 (tingkat 4) | 'function': fungsi sebaris yang tidak direferensikan telah dihapus |
C4536 (tingkat 4) | 'type name': type-name melebihi batas meta-data karakter 'limit' |
C4545 (tingkat 1) | ekspresi sebelum koma mengevaluasi ke fungsi yang kehilangan daftar argumen |
C4546 (tingkat 1) | panggilan fungsi sebelum daftar argumen koma hilang |
C4547 (tingkat 1) | 'operator': operator sebelum koma tidak berpengaruh; operator yang diharapkan dengan efek samping |
C4548 (tingkat 1) | ekspresi sebelum koma tidak berpengaruh; ekspresi yang diharapkan dengan efek samping |
C4549 (tingkat 1) | 'operator1': operator sebelum koma tidak berpengaruh; apakah Anda berniat 'operator2'? |
C4555 (tingkat 1) | ekspresi tidak berpengaruh; ekspresi yang diharapkan dengan efek samping |
C4557 (tingkat 3) | '__assume' berisi efek 'efek' |
C4571 (tingkat 4) | informational: catch(...) semantik berubah sejak Visual C++ 7.1; pengecualian terstruktur (SEH) tidak lagi tertangkap |
C4574 (tingkat 4) | 'pengidentifikasi' didefinisikan sebagai '0': apakah Anda bermaksud menggunakan 'pengidentifikasi #if'? |
C4577 (tingkat 1) | 'noexcept ' digunakan tanpa mode penanganan pengecualian yang ditentukan; penghentian pengecualian tidak dijamin. Menentukan /EHsc |
C4582 (tingkat 4) | 'type': konstruktor tidak secara implisit disebut |
C4583 (tingkat 4) | 'type': destructor tidak secara implisit disebut |
C4587 (tingkat 1) | 'anonymous_structure': perubahan perilaku: konstruktor tidak lagi secara implisit disebut |
C4588 (tingkat 1) | 'anonymous_structure': perubahan perilaku: destruktor tidak lagi secara implisit disebut |
C4596 (tingkat 4) | 'pengidentifikasi': nama ilegal yang memenuhi syarat dalam deklarasi anggota 14.3Perm |
C4598 (tingkat 1 dan tingkat 3) | '#include "header"': nomor header header-number di header yang telah dikomposisi sebelumnya tidak cocok dengan kompilasi saat ini pada posisi 14.3 |
C4599 (tingkat 3) | 'jalur opsi': nomor argumen baris perintah arg_number tidak cocok dengan header yang telah dikompilasi sebelumnya 14.3 |
C4605 (tingkat 1) | '/Dmakro' ditentukan pada baris perintah saat ini, tetapi tidak ditentukan ketika header yang telah dikompilasi dibuat sebelumnya |
C4608 (tingkat 3) | 'union_member' telah diinisialisasi oleh anggota serikat lain dalam daftar inisialisasi, 'union_member' Perm |
C4619 (tingkat 3) | #pragma peringatan: tidak ada nomor peringatan 'angka' |
C4623 (tingkat 4) | 'turunan kelas': konstruktor default tidak dapat dihasilkan karena konstruktor default kelas dasar tidak dapat diakses |
C4625 (tingkat 4) | 'turunan kelas': konstruktor salinan tidak dapat dihasilkan karena konstruktor salinan kelas dasar tidak dapat diakses |
C4626 (tingkat 4) | 'turunan kelas': operator penugasan tidak dapat dihasilkan karena operator penetapan kelas dasar tidak dapat diakses |
C4628 (tingkat 1) | digraph tidak didukung dengan -Ze. Urutan karakter 'digraph' tidak ditafsirkan sebagai token alternatif untuk 'char' |
C4640 (tingkat 3) | 'instance': konstruksi objek statis lokal tidak aman untuk utas |
C4643 (tingkat 4) | Penerusan yang menyatakan 'pengidentifikasi' di namespace std tidak diizinkan oleh Standar C++. 15.8 |
C4647 (tingkat 3) | perubahan perilaku: __is_pod(jenis) memiliki nilai yang berbeda dalam versi sebelumnya |
C4654 (tingkat 4) | Kode yang ditempatkan sebelum menyertakan baris header yang telah dikompilasi sebelumnya akan diabaikan. Tambahkan kode ke header yang telah dikompilasi sebelumnya. 14.1 |
C4668 (tingkat 4) | 'simbol' tidak didefinisikan sebagai makro praprosesor, mengganti dengan '0' untuk 'direktif' |
C4682 (tingkat 4) | 'simbol' : tidak ada atribut parameter arah yang ditentukan, default ke [in] |
C4686 (tingkat 3) | 'jenis yang ditentukan pengguna': kemungkinan perubahan perilaku, perubahan konvensi panggilan pengembalian UDT |
C4692 (tingkat 1) | 'function': tanda tangan anggota non-privat berisi jenis asli privat rakitan 'native_type' |
C4710 (tingkat 4) | 'function': function not inlined |
C4738 (tingkat 3) | menyimpan float 32-bit mengakibatkan memori, kemungkinan hilangnya performa |
C4746 | akses volatil 'ekspresi' tunduk pada pengaturan /volatile:<iso|ms> ; pertimbangkan untuk menggunakan fungsi intrinsik __iso_volatile_load/simpan |
C4749 (tingkat 4) | didukung secara kondisional: offsetof diterapkan ke jenis 'jenis' tata letak non-standar |
C4767 (tingkat 4) | nama bagian 'simbol' lebih panjang dari 8 karakter dan akan dipotong oleh linker |
C4774 (tingkat 4) | 'string' : format string yang diharapkan dalam nomor argumen bukan string literal |
C4777 (tingkat 4) | 'function' : format string 'string' memerlukan argumen jenis 'type1', tetapi nomor argumen variadik memiliki jenis 'type2' |
C4786 (tingkat 3) | 'simbol' : nama objek dipotong menjadi karakter 'angka' dalam informasi debug |
C4800 (tingkat 4) | Konversi implisit dari 'type' ke bool. Kemungkinan kehilangan informasi 16.0 |
C4820 (tingkat 4) | Padding byte 'byte' ditambahkan setelah membangun 'member_name' |
C4822 (tingkat 1) | 'member': fungsi anggota kelas lokal tidak memiliki isi |
C4826 (tingkat 2) | Konversi dari 'type1' ke 'type2' diperpanjang. Ini dapat menyebabkan perilaku runtime tak terduga. |
C4837 (tingkat 4) | trigraf terdeteksi: '?? karakter' digantikan oleh 'karakter' |
C4841 (tingkat 4) | ekstensi non-standar yang digunakan: penunjuk anggota campuran yang digunakan dalam offsetof |
C4842 (tingkat 4) | hasil 'offsetof' yang diterapkan ke jenis menggunakan beberapa warisan tidak dijamin konsisten antara rilis kompilator |
C4866 (tingkat 4) | Pengkompilasi 'file(nomor baris)' mungkin tidak memberlakukan urutan evaluasi kiri-ke-kanan untuk panggilan ke operator |
C4868 (tingkat 4) | Pengompilasi 'file(line_number)' mungkin tidak memberlakukan urutan evaluasi kiri-ke-kanan dalam daftar inisialisasi braced |
C4905 (tingkat 1) | string lebar literal cast ke 'LPSTR' |
C4906 (tingkat 1) | string literal cast ke 'LPWSTR' |
C4917 (tingkat 1) | 'deklarator': GUID hanya dapat dikaitkan dengan kelas, antarmuka, atau namespace |
C4928 (tingkat 1) | inisialisasi salinan ilegal; lebih dari satu konversi yang ditentukan pengguna telah diterapkan secara implisit |
C4931 (tingkat 4) | kami berasumsi pustaka jenis dibangun untuk pointer number-bit |
C4946 (tingkat 1) | reinterpret_cast digunakan antara kelas terkait: 'class1' dan 'class2' |
C4962 | 'function': pengoptimalan yang dipandu profil dinonaktifkan karena pengoptimalan menyebabkan data profil menjadi tidak konsisten |
C4986 (tingkat 4) | 'simbol': spesifikasi pengecualian tidak cocok dengan deklarasi sebelumnya |
C4987 (tingkat 4) | ekstensi nonstandar yang digunakan: 'throw (...)' |
C4988 (tingkat 4) | 'simbol': variabel dideklarasikan di luar lingkup kelas/fungsi |
C5022 | 'type': multiple move constructors specified |
C5023 | 'type': beberapa operator penetapan pemindahan ditentukan |
C5024 (tingkat 4) | 'type': move constructor secara implisit didefinisikan sebagai dihapus |
C5025 (tingkat 4) | 'type': operator penetapan pemindahan secara implisit didefinisikan sebagai dihapus |
C5026 (tingkat 1 dan tingkat 4) | 'type': move constructor secara implisit didefinisikan sebagai dihapus |
C5027 (tingkat 1 dan tingkat 4) | 'type': operator penetapan pemindahan secara implisit didefinisikan sebagai dihapus |
C5029 (tingkat 4) | ekstensi nonstandar yang digunakan: atribut perataan di C++ berlaku untuk variabel, anggota data, dan jenis tag saja |
C5031 (tingkat 4) | #pragma peringatan(pop): kemungkinan tidak cocok, memunculkan status peringatan yang didorong dalam file yang berbeda 14.1 |
C5032 (tingkat 4) | peringatan #pragma terdeteksi tanpa peringatan #pragma(pop) 14.1 yang sesuai |
Visual Studio 2017 dan versi yang lebih baru
Peringatan berikut dinonaktifkan secara default di Visual Studio 2017 dan versi yang lebih baru:
Peringatan | Pesan |
---|---|
C5034 | penggunaan 'intrinsik' intrinsik menyebabkan fungsi-nama dikompilasi sebagai kode tamu 15.3 |
C5035 | penggunaan fitur 'fitur' menyebabkan nama fungsi dikompilasi sebagai kode tamu 15.3 |
C5036 (tingkat 1) | konversi penunjuk fungsi varargs saat mengkompilasi dengan /hybrid:x86arm64 'type1' ke 'type2' 15.3 |
C5038 (tingkat 4) | anggota data 'member1' akan diinisialisasi setelah anggota data 'member2' 15.3 |
C5039 (tingkat 4) | 'function': pointer atau referensi ke fungsi yang berpotensi melempar diteruskan ke fungsi C ekstern di bawah -EHc . Perilaku yang tidak terdefinisi dapat terjadi jika fungsi ini melemparkan pengecualian. 15.5 |
C5041 (tingkat 4) | 'member-name': definisi di luar baris untuk anggota data statis constexpr tidak diperlukan dan tidak digunakan lagi di C++17. 15.2 |
C5042 (tingkat 3) | 'function': deklarasi fungsi pada cakupan blok tidak dapat ditentukan 'sebaris' dalam C++; hapus penentu 'sebaris' 15.5 |
C5045 | Compiler akan menyisipkan mitigasi Spectre untuk beban memori jika /Qspectre switch ditentukan 15.7 |
Visual Studio 2019 dan versi yang lebih baru
Peringatan berikut dinonaktifkan secara default di Visual Studio 2019 dan versi yang lebih baru:
Peringatan | Pesan |
---|---|
C5052 (tingkat 3) | Kata kunci 'kata kunci-nama' diperkenalkan dalam versi C++ dan memerlukan penggunaan opsi baris perintah 'opsi' 16.1 |
C5204 (tingkat 3) | Kelas dengan fungsi virtual memiliki destruktor sepele non-virtual. 16.5 |
C5214 (tingkat 4) | menerapkan 'kata kunci' ke operand dengan jenis yang memenuhi syarat volatil tidak digunakan lagi dalam C++20 16.7 |
C5215 (tingkat 4) | 'parameter fungsi' parameter fungsi dengan jenis yang memenuhi syarat volatil tidak digunakan lagi di C++20 16.7 |
C5216 (tingkat 4) | 'return-type' jenis pengembalian yang memenuhi syarat volatil tidak digunakan lagi di C++20 16.7 |
C5217 (tingkat 4) | deklarasi pengikatan terstruktur yang mencakup volatile tidak digunakan lagi dalam C++20 16.7 |
C5219 (tingkat 2) | konversi implisit dari 'type-1' ke 'type-2', kemungkinan hilangnya data 16.7 |
C5220 (tingkat 4) | 'member': anggota data non-statis dengan jenis yang memenuhi syarat volatil tidak lagi menyiratkan bahwa konstruktor salinan/pemindahan yang dihasilkan kompilator dan operator penugasan salin/pindah tidak sepele 16,7 |
C5233 (tingkat 4) | 'Pengidentifikasi' penangkapan lambda eksplisit tidak digunakan 16.10 |
C5240 (tingkat 4) | 'attribute-name': atribut diabaikan dalam posisi syntactic 16.10 ini |
C5243 (tingkat 1) | 'type-name': menggunakan kelas 'class-name' yang tidak lengkap dapat menyebabkan potensi pelanggaran aturan definisi karena batasan ABI 16.10 |
C5245 (tingkat 4) | 'function': fungsi tidak direferensikan dengan tautan internal telah dihapus |
C5246 (tingkat 1) | 'member': inisialisasi subobjek harus dibungkus dengan kurung kurawal 16.10 |
C5247 (tingkat 1) | Bagian 'section-name' dicadangkan untuk inisialisasi dinamis C++. Membuat bagian secara manual akan mengganggu inisialisasi dinamis C++ dan dapat menyebabkan perilaku yang tidak ditentukan 16.11 |
C5248 (tingkat 1) | Bagian 'section-name' dicadangkan untuk inisialisasi dinamis C++. Variabel yang dimasukkan secara manual ke bagian dapat dioptimalkan dan urutannya relatif terhadap pengkompilasi yang dihasilkan penginisialisasi dinamis tidak ditentukan 16.11 |
Visual Studio 2022 dan versi yang lebih baru
Peringatan berikut dinonaktifkan secara default di Visual Studio 2022 dan versi yang lebih baru:
Peringatan | Pesan |
---|---|
C5249 (tingkat 1) | 'bitfield' tipe 'enumeration_name' memiliki enumerator bernama dengan nilai yang tidak dapat diwakili dalam lebar bidang bit yang diberikan dari 'bitfield_width'. 17.0 |
C5250 (tingkat 3) | 'function_name': fungsi intrinsik tidak dideklarasikan. 17.0 |
C5251 (tingkat 4) | nama segmen berubah setelah menyertakan header 17.1 |
C5254 (tingkat 4) | fitur bahasa 'pernyataan statis terse' memerlukan bendera kompilator '/std:c++17' 17.1 |
C5256 (tingkat 1) | 'enumerasi': deklarasi enumerasi yang tidak mendefinisikan dengan jenis yang mendasar tetap hanya diizinkan sebagai deklarasi mandiri 17.2 |
C5258 (tingkat 4) | pengambilan eksplisit 'simbol' tidak diperlukan untuk penggunaan ini 17.2 |
C5259 (tingkat 4) | 'specialized-type': spesialisasi eksplisit memerlukan 'template <> ' 17.3 |
C5262 (tingkat 1, kesalahan) | fall-through implisit terjadi di sini; Apakah Anda kehilangan pernyataan break ? Gunakan [[fallthrough]] saat break pernyataan sengaja dihilangkan antara kasus 17.4 |
C5263 (tingkat 4) | memanggil 'std::move ' pada objek sementara mencegah penyalinan elisi 17.4 |
C5264 (tingkat 4) | 'variable-name': variabel 'const' tidak digunakan 17.4 |
C5266 (tingkat 4) | Kualifikasi 'const' pada jenis pengembalian tidak berpengaruh pada 17.6 |
C5267 (tingkat 4) | definisi operator konstruktor/penugasan salinan implisit untuk 'jenis' tidak digunakan lagi karena memiliki operator penugasan yang disediakan pengguna/konstruktor salinan 17.7 |
14.1 Peringatan ini tersedia mulai dari Visual Studio 2015 Update 1.
14.3 Peringatan ini tersedia mulai dari Visual Studio 2015 Update 3.
15.2 Peringatan ini tersedia mulai dari Visual Studio 2017 versi 15.2.
15.3 Peringatan ini tersedia mulai dari Visual Studio 2017 versi 15.3.
15.5 Peringatan ini tersedia mulai di Visual Studio 2017 versi 15.5.
15.7 Peringatan ini tersedia mulai di Visual Studio 2017 versi 15.7.
15.8 Peringatan ini tersedia mulai di Visual Studio 2017 versi 15.8.
16.0 Peringatan ini tersedia mulai di Visual Studio 2019 RTM.
16.5 Peringatan ini tersedia mulai di Visual Studio 2019 versi 16.5.
16.7 Peringatan ini tersedia mulai di Visual Studio 2019 versi 16.7.
16.10 Peringatan ini tersedia mulai di Visual Studio 2019 versi 16.10.
16.11 Peringatan ini tersedia mulai di Visual Studio 2019 versi 16.11.
17.0 Peringatan ini tersedia mulai visual Studio 2022 versi 17.0.
17.1 Peringatan ini tersedia mulai di Visual Studio 2022 versi 17.1.
17.2 Peringatan ini tersedia mulai visual Studio 2022 versi 17.2.
17.3 Peringatan ini tersedia mulai di Visual Studio 2022 versi 17.3.
17.4 Peringatan ini tersedia mulai visual Studio 2022 versi 17.4.
17.5 Peringatan ini tersedia mulai visual Studio 2022 versi 17.5.
17.6 Peringatan ini tersedia mulai visual Studio 2022 versi 17.6.
17.7 Peringatan ini tersedia mulai visual Studio 2022 versi 17.7.
Perm Peringatan ini nonaktif kecuali /permissive-
opsi pengkompilasi diatur.
Peringatan nonaktif secara default dalam versi yang lebih lama
Peringatan ini nonaktif secara default di Visual Studio 2015 versi 15.3, dan diaktifkan di Visual Studio 2015 versi 15.5:
Peringatan | Pesan |
---|---|
C4768 | __declspec atribut sebelum spesifikasi tautan diabaikan |
Peringatan ini nonaktif secara default dalam versi pengkompilasi sebelum Visual Studio 2015:
Peringatan | Pesan |
---|---|
C4302 (tingkat 2) | 'konversi': pemotongan dari 'type1' ke 'type2' |
C4311 (tingkat 1) | 'variabel': pemotongan pointer dari 'type' ke 'type' |
C4312 (tingkat 1) | 'operation': konversi dari 'type1' ke 'type2' dengan ukuran yang lebih besar |
C4319 (tingkat 1) | 'operator': nol memperluas 'type1' ke 'type2' dengan ukuran yang lebih besar |
Peringatan ini nonaktif secara default dalam versi pengkompilasi sebelum Visual Studio 2012:
Peringatan | Pesan |
---|---|
C4431 (tingkat 4) | penentu tipe hilang - int diasumsikan. Catatan: C tidak lagi mendukung default-int |
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk