GNU grep 2.24 RTFS
Sonuç: Sadece 2 ve 2 vaka:
NUL
, Örneğin printf 'a\0' | grep 'a'
C99'a göre kodlama hatası mbrlen()
, örneğin:
export LC_CTYPE='en_US.UTF-8'
printf 'a\x80' | grep 'a'
çünkü \x80
bir UTF-8 Unicode noktasının ilk baytı olamaz: UTF-8 - Açıklama | en.wikipedia.org
Dahası, Stéphane Chazelas tarafından belirtildiği gibi Grep'i bir dosya olarak ikili yapan nedir? | Unix ve Linux Stack Exchange'de , bu kontroller yalnızca TODO uzunluğundaki ilk okumaya kadar yapılır.
Yalnızca ilk tampon belleğe kadar okunabilir
Bu nedenle, NUL veya kodlama hatası çok büyük bir dosyanın ortasında meydana gelirse, yine de boğulabilir.
Bunun performans nedenleriyle olduğunu hayal ediyorum.
Örn: bu satır basar:
printf '%10000000s\n\x80a' | grep 'a'
ama bu değil:
printf '%10s\n\x80a' | grep 'a'
Gerçek arabellek boyutu, dosyanın nasıl okunacağına bağlıdır. Örneğin, karşılaştır:
export LC_CTYPE='en_US.UTF-8'
(printf '\n\x80a') | grep 'a'
(printf '\n'; sleep 1; printf '\x80a') | grep 'a'
Bu sleep
işlemle ilk satır sadece 1 bayt uzunluğunda olsa bile grep'e geçer, çünkü işlem uykuya gider ve ikinci okuma dosyanın ikili olup olmadığını kontrol etmez.
RTFs
git clone git://git.savannah.gnu.org/grep.git
cd grep
git checkout v2.24
Stderr hata mesajının kodlandığı yeri bulun:
git grep 'Binary file'
Bizi bize yönlendirir /src/grep.c
:
if (!out_quiet && (encoding_error_output
|| (0 <= nlines_first_null && nlines_first_null < nlines)))
{
printf (_("Binary file %s matches\n"), filename);
Eğer bu değişkenler iyi adlandırılmışsa, temel olarak sonuca vardık.
encoding_error_output
Hızlı tarama, encoding_error_output
onu değiştirebilecek tek kod yolunun geçtiğini gösterir buf_has_encoding_errors
:
clen = mbrlen (p, buf + size - p, &mbs);
if ((size_t) -2 <= clen)
return true;
o zaman sadece man mbrlen
.
nlines_first_null ve nlines
İlk olarak başlatıldı:
intmax_t nlines_first_null = -1;
nlines = 0;
yani bir boş bulunan bulunursa 0 <= nlines_first_null
gerçek olur.
TODO ne zaman nlines_first_null < nlines
yanlış olabilir? Tembel oldum.
POSIX
İkili opsiyon grep tanımlamıyor - bir dosya için bir kalıp arayın | pubs.opengroup.org ve GNU grep belgelenmiyor, bu yüzden RTFS tek yol.
--null-data
NUL
sınırlayıcı ise faydalı olabilir .