Bagikan melalui


Peringatan C26438

Hindari goto (es.76)

Pedoman Inti C++:
ES.76: Hindari goto

Penggunaan goto secara luas dianggap sebagai praktik berbahaya dan rawan kesalahan. Ini hanya dapat diterima dalam kode yang dihasilkan, seperti dalam pengurai yang dihasilkan dari tata bahasa. Dengan fitur dan utilitas C++ modern yang disediakan oleh Pustaka Dukungan Pedoman, harus mudah dihindari goto sama sekali.

Keterangan

  • Aturan ini memperingatkan pada setiap kemunculan goto, bahkan jika terjadi dalam kode mati, kecuali kode templat yang tidak pernah digunakan dan sebagainya diabaikan oleh pengkompilasi.
  • Peringatan dapat mengalikan ketika makro berisi goto. Mekanisme pelaporan saat ini menunjuk ke semua instans di mana makro tersebut diperluas. Ini sering dapat diperbaiki di satu tempat dengan mengubah makro, atau menghindari penggunaannya demi mekanisme yang lebih dapat dipertahankan.

Nama analisis kode: NO_GOTO

Contoh

'goto clean-up' dalam makro

#define ENSURE(E, L) if (!(E)) goto L;

void poll(connection &c)
{
    ENSURE(c.open(), end);                  // C26438

    while (c.wait())
    {
        connection::header h{};
        connection::signature s{};
        ENSURE(c.read_header(h), end);      // C26438
        ENSURE(c.read_signature(s), end);   // C26438
        // ...
    }

end:
    c.close();
}

'goto clean-up' dalam makro, diganti dengan gsl::finally

void poll(connection &c)
{
    auto end = gsl::finally([&c] { c.close(); });

    if (!c.open())
        return;

    while (c.wait())
    {
        connection::header h{};
        connection::signature s{};
        if(!c.read_header(h))
            return;
       if(!c.read_signature(s))
            return;
        // ...
    }
}