Standart C metinden ondalık sayıya dönüşüm hatalarını taşınabilir yapmıyor
Öne çıkanlar
- C standardında strtod işlevlerinin hata mekanizması math_errhandling makrosunun durumuna göre değişiyor.
- POSIX standartları aşma durumlarında errno değişkenine ERANGE atanmasını zorunlu tutuyor.
- Geçersiz metin girdilerinde glibc errno değerini değiştirmezken musl EINVAL değeri atıyor.
- Hatalı girdileri güvenle doğrulamak için errno yerine endptr göstericisini denetlemek gerekiyor.
Standart C kütüphanesindeki strtod ve benzeri metinden ondalık sayıya dönüştürme işlevleri, taşınabilir bir hata yakalama mekanizmasından yoksun çalışıyor. ISO C standartlarına göre bu işlevlerin hata bildirme biçimi, math.h içindeki math_errhandling makrosuna bağlı bulunuyor. Kütüphane errno desteği vermiyorsa fonksiyon hata durumunda errno değerini güncellemiyor; üstelik alt taşma durumlarında hata bildirmek standart kapsamında tamamen isteğe bağlı bırakılıyor.
POSIX standartları ise C standardından farklılaşarak taşma ve alt taşma durumlarında her zaman errno değişkeninin ERANGE olarak ayarlanmasını zorunlu kılıyor. Linux kılavuz sayfalarında bu farkın bir uzantı olarak belirtilmemesi kafa karışıklığı yaratıyor. POSIX'in bu katı kuralının standart C ile tam olarak uyumlu olup olmadığı belirsizliğini korurken, geçersiz girdilerin işlenmesinde de kütüphaneler arasında ciddi davranış farklılıkları ortaya çıkıyor.
Geçersiz girdi durumunda glibc errno değerini sıfırda bırakırken, musl aynı senaryoda değeri EINVAL olarak işaretliyor. Standart C açısından hatalı girdi bir hata durumu sayılmadığı için yalnızca endptr parametresinin başlangıç göstericisine eşit olup olmadığını denetlemek gerekiyor. Bu çelişkiler, geliştiricilerin farklı C çalışma zamanı kütüphanelerinde güvenli ve taşınabilir sayı dönüşümü yapmasını zorlaştırıyor.
Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.