2013-04-14 11 views
12

ReSharper ostrzega mnie o możliwym NullReferenceException wmoże WindowsIdentity.GetCurrent() zwróci wartość null?

WindowsIdentity windowsIdentity = new WindowsIdentity(WindowsIdentity.GetCurrent().Token); 

Spojrzałem w MSDN doc ale nie widziałem żadnej wzmianki o tym. Ponadto nie ma to sensu, ponieważ jeśli uruchomisz plik wykonywalny, musisz się zalogować.
Czy to tylko wzór wyszukiwania ReSharper?

Odpowiedz

19

Korzystanie ILSpy, można spojrzeć na de-kompilowany wersją GetCurrent i GetCurrentInternal, co GetCurrent połączeń . Wynikiem jest:

GetCurrent:

public static WindowsIdentity GetCurrent() 
    { 
     return WindowsIdentity.GetCurrentInternal(TokenAccessLevels.MaximumAllowed, false); 
    } 

GetCurrentInternal:

internal static WindowsIdentity GetCurrentInternal(TokenAccessLevels desiredAccess, bool threadOnly) 
{ 
    int errorCode = 0; 
    bool flag; 
    SafeTokenHandle currentToken = WindowsIdentity.GetCurrentToken(desiredAccess, threadOnly, out flag, out errorCode); 
    if (currentToken != null && !currentToken.IsInvalid) 
    { 
     WindowsIdentity windowsIdentity = new WindowsIdentity(); 
     windowsIdentity.m_safeTokenHandle.Dispose(); 
     windowsIdentity.m_safeTokenHandle = currentToken; 
     return windowsIdentity; 
    } 
    if (threadOnly && !flag) 
    { 
     return null; 
    } 
    throw new SecurityException(Win32Native.GetMessage(errorCode)); 
} 

Od threadOnly jest zawsze fałszywe Dzwoniąc z GetCurrent i currentToken musi być ważny dla innych return statement, nie sądzę, że jesteś narażony na ryzyko utraty wartości WindowsIdentity.

2

To brzmi jak fałszywe raporty od ReSharper.

W żadnym wypadku nie ma mowy o powrocie null.

Jak zauważysz, musi istnieć bieżący użytkownik (tego samego rodzaju lub innego), więc powinien zawsze zwracać prawidłowy obiekt - jeśli masz uprawnienia.

Może podnieść SecurityException, ale to inny błąd, a mimo to Twój kod się nie powiedzie. Jeśli jest to możliwe to może chcesz zmienić swój kod:

WindowsIdentity currentIdentity = null; 
try 
{ 
    currentIdentity = WindowsIdentity.GetCurrent(); 
    // Carry on if there's nothing you can do 
    WindowsIdentity newIdentity = new WindowsIdentity(currentIdentity.Token); 
} 
catch (SecurityException ex) 
{ 
    // Do something, logging, display error etc. 
} 
1

Zgodnie z demontażu, null może być zwrócony.

Patrz: GetCurrentInternal(TokenAccessLevels desiredAccess, bool threadOnly)

Zastrzeżenie: jestem zbyt leniwy, aby wnikliwie szczególny warunek :)

5

ReSharper powinien obsłużyć to.

w katalogu < ReSharper zainstalować dir> \ v7.1 \ Bin \ ExternalAnnotations \ .NETFramework \ mscorlib adnotacje zewnętrznego pliku Nullness.Manual.xml definiuje następujące adnotacje:

<!-- RSRP-328266 --> 
<member name="M:System.Security.Principal.WindowsIdentity.GetCurrent"> 
    <attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" /> 
</member> 
<member name="M:System.Security.Principal.WindowsIdentity.GetCurrent(System.Boolean)"> 
    <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)"> 
    <argument>false=&gt;notnull</argument> 
    </attribute> 
</member> 
<member name="M:System.Security.Principal.WindowsIdentity.GetCurrent(System.Security.Principal.TokenAccessLevels)"> 
    <attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" /> 
</member> 

Jednak ja otrzymuję również ostrzeżenie o możliwym wyjątku NullReferenceException na WindowsIdentity.GetCurrent(). Z jakiegoś powodu ReSharper nie rozpoznaje swoich zewnętrznych atrybutów adnotacji. Jeśli jest to znany błąd lub jeśli istnieje poprawka tego problemu, odpowiedz.

+2

cóż, szukałem go dla Ciebie :) To wydaje się być naszym małym przyjacielem: http://youtrack.jetbrains.com/issue/RSRP-328266 – Noich

+0

Dokładnie.Powyższe adnotacje mają naprawić 328266 (stąd komentarz w pierwszym wierszu fragmentu XML), ale z jakiegoś powodu poprawka nie działa. Jeśli to wskazuje na problem w moich ustawieniach lub konfiguracji R #, proszę opracuj. –

+0

Naprawdę nie mam pojęcia :) Musisz to zrobić ze swoją kontrolą jakości. – Noich

Powiązane problemy