Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Doğrulama sırasında hatalı hata raporlarını gizleyebilmeniz için Sürücü kaynak kodunuz hakkında ek bilgiler içeren Statik Sürücü Doğrulayıcı (SDV) sağlayabilirsiniz. Yanlış hata, SDV bir kural ihlali rapor ettiğinde ama sürücü doğru hareket ediyorsa ortaya çıkar.
SDV'ye bu ek bilgileri sağlamak için __analysis_assume işlevini kullanın. İşlev aşağıdaki söz dizimine sahiptir:
__analysis_assume( expression )
Burada ifade , true olarak değerlendirildiği varsayılan herhangi bir ifade olabilir.
Bu işlevi kullandığınızda, SDV ifadeyle temsil edilen koşulun __analysis_assume işlevinin göründüğü noktada true olduğunu varsayar. __analysis_assume işlevi yalnızca statik çözümleme araçları tarafından kullanılır. İşlev derleyici tarafından yoksayılır.
__analysis_assume kullanıyorsanız, yaptığınız varsayımın geçerliliğinden emin olmanız kritik önem taşır. Varsayımınızın yanlış olduğu ortaya çıkarsa, ya şimdi ya da gelecekte, gerçek bir kusuru bastırıyor olabilirsiniz. Kodunuza her zaman __analysis_assume işlevini neden kullandığınızı açıklayan bir açıklama eklemenizi öneririz. Varsayım için bir neden yazamıyorsanız, kusuru gizlemeyin.
Güvenli bir şekilde gizleyebileceğiniz yanlış kusurlar bulduğunuzda, gerektiğinde __analysis_assume işlevini eklemeniz gerekir.
Örnekleri
Aşağıdaki kod örneğinde , RequestCompletedLocal KMDF kuralı bir hata bildirir. Bu hatalı bir hatadır çünkü SDV switch deyimini doğru yorumlayamaz ve sonuç olarak isteğin tamamlandığı dala girmez.
Bu switch deyiminde altı olası durum vardır. Sürücü altı IOCTL kodu tanımladığından sürücü kesinlikle dallardan birini alır. Dallardan biri seçildiğinde, istek başarıyla tamamlanır.
VOID
PortIOEvtIoDeviceControl(
__in WDFQUEUE Queue,
__in WDFREQUEST Request,
__in size_t OutputBufferLength,
__in size_t InputBufferLength,
__in ULONG IoControlCode
)
PDEVICE_CONTEXT devContext = NULL;
WDFDEVICE device;
PAGED_CODE();
device = WdfIoQueueGetDevice(Queue);
devContext = PortIOGetDeviceContext(device);
switch(IoControlCode)
case IOCTL_GPD_READ_PORT_UCHAR:
case IOCTL_GPD_READ_PORT_USHORT:
case IOCTL_GPD_READ_PORT_ULONG:
PortIOIoctlReadPort(devContext,
Request,
OutputBufferLength,
InputBufferLength,
IoControlCode);
break;
case IOCTL_GPD_WRITE_PORT_UCHAR:
case IOCTL_GPD_WRITE_PORT_USHORT:
case IOCTL_GPD_WRITE_PORT_ULONG:
PortIOIoctlWritePort(devContext,
Request,
OutputBufferLength,
InputBufferLength,
IoControlCode);
break;
}
}
Hatalı kusuru güvenli bir şekilde bastırmak için __analysis_assume işlevini kullanarak IoControlCode'un sürücünün tanımladığı IOCTL'lerden biri olacağının garantisini belirtin.
VOID
PortIOEvtIoDeviceControl(
__in WDFQUEUE Queue,
__in WDFREQUEST Request,
__in size_t OutputBufferLength,
__in size_t InputBufferLength,
__in ULONG IoControlCode
)
PDEVICE_CONTEXT devContext = NULL;
WDFDEVICE device;
PAGED_CODE();
device = WdfIoQueueGetDevice(Queue);
devContext = PortIOGetDeviceContext(device);
/* Use __analysis_assume to suppress a false defect for the SDV RequestCompletedLocal rule.
There are only 6 possible IOCTLs for IoControlCode; each case is covered in the switch statement.
*/
__analysis_assume( IoControlCode == IOCTL_GPD_READ_PORT_UCHAR || \
IoControlCode == IOCTL_GPD_READ_PORT_USHORT|| \
IoControlCode == IOCTL_GPD_READ_PORT_ULONG || \
IoControlCode == IOCTL_GPD_WRITE_PORT_UCHAR|| \
IoControlCode == IOCTL_GPD_WRITE_PORT_USHORT|| \
IoControlCode == IOCTL_GPD_WRITE_PORT_ULONG);
switch(IoControlCode)
case IOCTL_GPD_READ_PORT_UCHAR:
case IOCTL_GPD_READ_PORT_USHORT:
case IOCTL_GPD_READ_PORT_ULONG:
PortIOIoctlReadPort(devContext,
Request,
OutputBufferLength,
InputBufferLength,
IoControlCode);
break;
case IOCTL_GPD_WRITE_PORT_UCHAR:
case IOCTL_GPD_WRITE_PORT_USHORT:
case IOCTL_GPD_WRITE_PORT_ULONG:
PortIOIoctlWritePort(devContext,
Request,
OutputBufferLength,
InputBufferLength,
IoControlCode);
break;
}
}
__analysis_assume nasıl kullanabileceğinize ilişkin başka bir örnek için, __sdv_save_request ve __sdv_retrieve_request'in Ertelenmiş Yordam Çağrıları için kullanımı sırasında kullanılan örnek koda bakın. Örnekte, DPC'ler (çalışma öğeleri, Zamanlayıcılar vb. ) için __sdv_save_request ve __sdv_retrieve_request nasıl kullanılacağı gösterilmektedir. __analysis_assume işlevi, aksi takdirde ortaya çıkan hatalı hataları engellemek için kullanılır.