CA1508: Geçersiz koşullu koddan kaçının
Özellik | Değer |
---|---|
Kural Kimliği | CA1508 |
Başlık | Ölü koşullu kodlardan kaçının |
Kategori | Bakýmýný |
Hataya neden olan veya bozulmayan düzeltme | HataYa Neden Olmayan |
.NET 9'da varsayılan olarak etkin | Hayır |
Neden
Bir yöntemin her zaman veya true
çalışma zamanında değerlendirilen false
koşullu kodu vardır. Bu, koşulun false
dalında ölü koda yol açar.
Varsayılan olarak, bu kural tüm kod tabanını analiz eder, ancak bu yapılandırılabilir.
Kural açıklaması
Yöntemlerin if deyimleri, ikili ifadeler (==
, !=
, , <
>
), null denetimleri vb. gibi koşullu kodu olabilir. Örneğin, aşağıdaki kodu göz önünde bulundurun:
public void M(int i, int j)
{
if (i != 0)
{
return;
}
if (j != 0)
{
return;
}
// Below condition will always evaluate to 'false' as 'i' and 'j' are both '0' here.
if (i != j)
{
// Code in this 'if' branch is dead code.
// It can either be removed or refactored.
...
}
}
C# ve VB derleyicileri, her zaman veya olarak değerlendirilen derleme zamanı true
içeren koşullu denetimlerin analizini false
gerçekleştirir. Bu çözümleyici, sabit olmayan değerleri içeren yedekli koşullu denetimleri belirlemek için sabit olmayan değişkenlerin veri akışı analizini gerçekleştirir. Yukarıdaki kodda çözümleyici hem hem i
j
de 0
denetime ulaşan i != j
tüm kod yolları için olduğunu belirler. Bu nedenle, bu denetim her zaman çalışma zamanında olarak değerlendirilir false
. if deyiminin içindeki kod geçersiz koddur ve kaldırılabilir veya yeniden düzenleyebilir. Benzer şekilde çözümleyici, değişkenlerin boşluğunu izler ve yedekli null denetimleri raporlar.
Not
Bu çözümleyici, sabit olmayan değerler için pahalı bir veri akışı analizi gerçekleştirir. Bu, belirli kod tabanlarında genel derleme süresini artırabilir.
Uyarıların ne zaman bastırılması gerekiyor?
Kodunuzun sürdürülebilirliği konusunda endişeleriniz yoksa bu kuralın ihlalini gizlemeniz güvenlidir. Hatalı pozitif olduğu belirlenen ihlallerin gizlenilmesi de uygundur. Bunlar, birden çok iş parçacığından yürütülebilen eşzamanlı kod varlığında mümkündür.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA1508
// The code that's violating the rule is on this line.
#pragma warning restore CA1508
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA1508.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Çözümlemek için kod yapılandırma
Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçenekleri kullanın.
Ayrıca, bu kural için aşağıdaki veri akışı analiziyle ilgili seçenekler geçerlidir:
- interprocedural_analysis_kind
- max_interprocedural_lambda_or_local_function_call_chain
- max_interprocedural_method_call_chain
- points_to_analysis_kind
- copy_analysis
- sufficient_IterationCount_for_weak_KDF_algorithm
Bu seçenekleri yalnızca bu kural için, uyguladıkları tüm kurallar için veya bu kategorideki tüm kurallar için (Bakım) yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.
Belirli simgeleri hariç tutma
excluded_symbol_names seçeneğini ayarlayarak türler ve yöntemler gibi belirli simgeleri analizden hariç tutabilirsiniz. Örneğin, kuralın adlı MyType
türlerdeki herhangi bir kodda çalışmaması gerektiğini belirtmek için, projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Not
XXXX
CAXXXX
bölümünü geçerli kuralın kimliğiyle değiştirin.
Seçenek değerinde izin verilen simge adı biçimleri (ile |
ayrılmış):
- Yalnızca sembol adı (içeren tür veya ad alanı ne olursa olsun, ada sahip tüm simgeleri içerir).
- Simgenin belge kimliği biçimindeki tam adlar. Her simge adı için yöntemler
M:
, türler veT:
ad alanları gibiN:
bir sembol türü ön eki gerekir. -
.ctor
oluşturucular ve.cctor
statik oluşturucular için.
Örnekler:
Seçenek Değeri | Özet |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
adlı MyType tüm simgelerle eşleşir. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
veya MyType1 adlı MyType2 tüm simgelerle eşleşir. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Belirtilen tam imza ile belirli bir yöntemi MyMethod eşleştirir. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Belirli yöntemlerle MyMethod1 ve MyMethod2 ilgili tam imzalarla eşleşir. |
Belirli türleri ve türetilmiş türlerini dışlama
excluded_type_names_with_derived_types seçeneğini ayarlayarak belirli türleri ve türetilmiş türlerini analizden dışlayabilirsiniz. Örneğin, kuralın adlı MyType
ve türetilmiş türleri içindeki hiçbir yöntemde çalışmaması gerektiğini belirtmek için, projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Not
XXXX
CAXXXX
bölümünü geçerli kuralın kimliğiyle değiştirin.
Seçenek değerinde izin verilen simge adı biçimleri (ile |
ayrılmış):
- Yalnızca tür adı (içeren tür veya ad alanına bakılmaksızın adı olan tüm türleri içerir).
- Simgenin belge kimliği biçiminde, isteğe bağlı
T:
ön ek içeren tam adlar.
Örnekler:
Seçenek değeri | Özet |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Adlı MyType tüm türleri ve türetilmiş türlerinin tümünü eşleştirir. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
veya MyType1 adlı MyType2 tüm türleri ve türetilmiş türlerinin tümünü eşleştirir. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Belirli bir türü MyType verilen tam adla ve türetilmiş tüm türleriyle eşleştirir. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Belirli türleri MyType1 ve MyType2 ilgili tam adlarla ve bunların türetilmiş tüm türleriyle eşleşir. |