Uyarı C26437
Dilimlemiyor.
C++ Temel Yönergeleri: ES.63: Dilimlemiyor
Dil dilimleme sağlar ve tehlikeli örtük döküm özel bir durum olarak görülebilir. Kasıtlı olarak yapılmış olsa ve acil sorunlara yol açmasa bile, yine de son derece önerilmez. İlgili veri türlerinde ek gereksinimleri zorlayarak kodun değiştirilmesini zorlaştırır. Özellikle türler çok biçimliyse veya kaynak yönetimi içeriyorsa bu durum geçerlidir.
Açıklamalar
Bu kural yalnızca açık atamalar için değil, aynı zamanda örtük dilimleme konusunda da uyarır. Örtük dilimleme, geçerli işlevden bir sonuç döndürülürse veya veriler diğer işlevlere geçirildiğinde gerçekleşir.
Kural ayrıca bir atamanın gerçek veri dilimlemesi içermediği durumları da işaretler (örneğin, türler boşsa veya tehlikeli veri işlemeleri yapmazsa). Gelecekte veri türleri veya davranışları değişirse istenmeyen regresyonları önlemek için bu tür uyarılar düzeltilmelidir.
Örnek
Sonraki kod örneğinde öğesini okuyoruz id_ex
, ancak işlevi çağıran yalnızca nesnenin bir dilimini alacak:
struct id {
int value;
};
struct id_ex : id {
int extension;
};
bool read_id(stream &s, id &v) {
id_ex tmp{};
if (!s.read(tmp.value) || !s.read(tmp.extension))
return false;
v = tmp; // C26437
return true;
}
Sorunu düzeltmek için işlevi doğru türleri kullanacak şekilde güncelleştirin:
// ...
bool read_id(stream &s, id_ex &v) {
// ...