Bagikan melalui


Anotasi titik mengambang untuk pengemudi

Anotasi titik mengambang dapat membantu alat analisis kode mendeteksi penggunaan titik pecahan dalam kode mode kernel dan dapat melaporkan kesalahan jika status floating-point tidak dilindungi dengan benar. Aturan floating-point hanya diperiksa untuk kode mode kernel.

Untuk beberapa keluarga prosesor, terutama prosesor x86, menggunakan operasi floating-point dari dalam kode mode kernel harus dilakukan hanya dalam lingkup fungsi yang menyimpan dan memulihkan status floating-point. Pelanggaran aturan ini dapat sangat sulit ditemukan karena mereka hanya akan secara spora menyebabkan masalah pada waktu proses (tetapi masalah ini bisa sangat serius). Dengan penggunaan anotasi yang tepat, alat analisis kode efektif dalam mendeteksi penggunaan titik pecahan dalam kode mode kernel dan melaporkan kesalahan jika status floating-point tidak dilindungi dengan benar. Aturan floating-point hanya diperiksa untuk kode mode kernel.

Tambahkan anotasi berikut ke parameter fungsi untuk menunjukkan apa yang mereka lakukan dengan status floating-point.

Anotasi titik mengambang Deskripsi
_Kernel_float_disimpan_ Fungsi anotasi menyimpan status perangkat keras floating-point, ketika fungsi berhasil dikembalikan.
_Kernel_float_dipulihkan_ Fungsi anotasi memulihkan status perangkat keras floating-point saat fungsi berhasil dikembalikan.
_Kernel_float_used_ Jika fungsi dipanggil dengan aman oleh fungsi panggilan, Anda dapat menggunakan anotasi _Kernel_float_used_ untuk menekan pelaporan kesalahan. Namun, jika fungsi panggilan tidak juga diannotasikan dengan _Kernel_float_used_ atau panggilan fungsi tidak terjadi antara fungsi yang dianomasikan dengan _Kernel_float_saved_ dan _Kernel_float_restored_, masing-masing, alat analisis kode akan melaporkan kesalahan.

Anotasi ini sudah diterapkan ke status KeSaveFloatingPoint dan fungsi sistem KeRestoreFloatingPointState, selain anotasi untuk memperoleh dan melepaskan sumber daya untuk mencegah kebocoran. Fungsi EngXxx serupa juga diannotasi dengan cara ini. Namun, fungsi yang membungkus fungsi-fungsi ini juga harus menggunakan anotasi ini.

Jika fungsi secara keseluruhan dipanggil dengan aman oleh beberapa fungsi panggilan, fungsi dapat diannotasi dengan anotasi _Kernel_float_used_. Ini menekan peringatan dan juga menyebabkan alat analisis kode mengonfirmasi bahwa pemanggil menggunakan fungsi dengan aman. Tingkatan _Kernel_float_used_ tambahan dapat ditambahkan sesuai kebutuhan. Anotasi _Kernel_float_used_ secara otomatis disediakan oleh alat analisis kode ketika hasil fungsi atau salah satu parameter fungsi adalah jenis titik mengambang, tetapi tidak ada salahnya untuk memberikan anotasi secara eksplisit.

Misalnya, anotasi _Kernel_float_saved_ menunjukkan bahwa status floating-point disimpan dalam parameter FloatingState dari fungsi sistem KeSaveFloatingPointState.

_Must_inspect_result_  
_IRQL_requires_max_(DISPATCH_LEVEL)  
__drv_valueIs(<0;==0)  
_When_(return==0, _Kernel_float_saved_)  
_At_(*FloatingState, _Kernel_requires_resource_not_held_(FloatState) _When_(return==0, _Kernel_acquires_resource_(FloatState)))  
__forceinline  
NTSTATUS  
KeSaveFloatingPointState (  
    _Out_ PVOID FloatingState  
    )  

Dalam contoh berikut, anotasi _Kernel_float_used_ menekan peringatan tentang penggunaan status floating-point. Anotasi juga menyebabkan alat analisis kode mengonfirmasi bahwa setiap panggilan ke MyDoesFloatingPoint terjadi dalam konteks floating-point yang aman.

_Kernel_float_used_
void
    MyDoesFloatingPoint(arguments);

#B0 Anotasi SAL 2.0 untuk driver Windows #C1