Udostępnij za pośrednictwem


C28193

Ostrzeżenie C28193: zmienna przechowuje wartość, która musi zostać zbadana

To ostrzeżenie wskazuje, że wywoływana funkcja nie sprawdza wartość określonej zmiennej, która była dostarczona przez funkcję.Zwracana wartość jest odnotowywana z adnotacją _Check_return_, ale wywoływana funkcja albo nie używa wartości, albo zastępuje wartość bez sprawdzania.

To ostrzeżenie jest podobne do ostrzeżenia C6031, ale jest zgłaszane, tylko wtedy, gdy kod nie bada lub nie sprawdza wartości zmiennej, używając jej w porównaniu.Proste przypisanie wartości nie jest uważane za wystarczające sprawdzenie, celem uniknięcia tego ostrzeżenia.Aliasowanie wyniku poza funkcją jest uważane za wystarczające sprawdzenie, ale sam wynik powinien zostać odnotowany z _Check_return_.

Niektóre funkcje (takie jak strlen) istnieją prawie wyłącznie dla ich wartości zwracanej, więc posiadanie ich z adnotacją _Check_return_ ma sens.Dla tych funkcji narzędzie do analizy kodu może zgłaszać to ostrzeżenie, gdy zwracana wartość jest nieużywana.Zazwyczaj wskazuje to, że kod jest niepoprawny, na przykład, może zawierać pozostały kod, który może być usunięty.Jednak w rzadkich przypadkach wartość zwracana jest celowo nieużywana.Najbardziej popularnym z tych przypadków jest, gdy zwrócona jest długość ciągu, ale nie jest faktycznie użyta zanim nie zostaną wykonane inne testy.Inne testy powodują, taką ścieżkę symulacji, że zwrócona długość ciągu nie zostanie użyta.Gdy tak się stanie, kod może być poprawny, ale może być mało wydajny.

Istnieją dwie podstawowe strategie radzące sobie z takimi przypadkami, gdy zwracana wartość jest nieużywana:

Zmiana kolejności kodu, tak aby długość ciągu była zwracana tylko wtedy, gdzie jest to konieczne.

Użycie ostrzeżenia #pragma aby pominąć ostrzeżenie--Jeśli zmiana kolejności kodu, uczyniła by kod zbyt złożonym, lub w innym przypadku mniej użytecznym.

Przykład

Poniższy kod przykładowy generuje to ostrzeżenie:

IoGetDmaAdapter(pPDO, &DevDesc, &nMapRegs);
...

Poniższy kod przykładowy pozwala uniknąć tego ostrzeżenia:

IoGetDmaAdapter(pPDO, &DevDesc, &nMapRegs);
...
if (nMapRegs < MIN_REQUIRED_MAPS) {
...
}