Информация об изменениях

Сообщение Re[5]: Как в одну строку кода прочитать содержимое файла в м от 07.01.2024 18:59

Изменено 07.01.2024 19:29 rg45

Re[5]: Как в одну строку кода прочитать содержимое файла в м
Здравствуйте, Kluev, Вы писали:

K>Т.е. данный говнокод может легко рыгнуть уже на целочисленном переполнении, не говоря уже о других проблемах озвученных другими собеседниками выше.


Да ты говнокода не видел, походу. Хочешь увидеть говнокод — загляни в реализацию File.ReadAllBytes. Вот где индусятина буйным цветом.

  File.ReadAllBytes (C#)
    public static byte[] ReadAllBytes(string path)
    {
        if (1 == 0)
        {
        }
        FileOptions options = FileOptions.SequentialScan;
        using SafeFileHandle safeFileHandle = OpenHandle(path, FileMode.Open, FileAccess.Read, FileShare.Read, options, 0L);
        long num = 0L;
        if (safeFileHandle.CanSeek && (num = safeFileHandle.GetFileLength()) > 2147483591)
        {
            throw new IOException(SR.IO_FileTooLong2GB);
        }
        if (num == 0L)
        {
            return ReadAllBytesUnknownLength(safeFileHandle);
        }
        int num2 = 0;
        int num3 = (int)num;
        byte[] array = new byte[num3];
        while (num3 > 0)
        {
            int num4 = RandomAccess.ReadAtOffset(safeFileHandle, array.AsSpan(num2, num3), num2);
            if (num4 == 0)
            {
                ThrowHelper.ThrowEndOfFileException();
            }
            num2 += num4;
            num3 -= num4;
        }
        return array;
    }

    private static byte[] ReadAllBytesUnknownLength(SafeFileHandle sfh)
    {
        byte[] array = null;
        Span<byte> span = stackalloc byte[512];
        try
        {
            int num = 0;
            while (true)
            {
                if (num == span.Length)
                {
                    uint num2 = (uint)(span.Length * 2);
                    if ((long)num2 > 2147483591L)
                    {
                        num2 = (uint)Math.Max(2147483591, span.Length + 1);
                    }
                    byte[] array2 = ArrayPool<byte>.Shared.Rent((int)num2);
                    span.CopyTo(array2);
                    byte[] array3 = array;
                    span = (array = array2);
                    if (array3 != null)
                    {
                        ArrayPool<byte>.Shared.Return(array3);
                    }
                }
                int num3 = RandomAccess.ReadAtOffset(sfh, span.Slice(num), num);
                if (num3 == 0)
                {
                    break;
                }
                num += num3;
            }
            return span.Slice(0, num).ToArray();
        }
        finally
        {
            if (array != null)
            {
                ArrayPool<byte>.Shared.Return(array);
            }
        }
    }


Классная работа ученика школы информационных технологий для умственно отсталых. Зато всё большими буквами, ага. Как до сих пор на картинки не перешли вместо букв, удивляюсь.
Re[5]: Как в одну строку кода прочитать содержимое файла в м
Здравствуйте, Kluev, Вы писали:

K>Т.е. данный говнокод может легко рыгнуть уже на целочисленном переполнении, не говоря уже о других проблемах озвученных другими собеседниками выше.


Да ты говнокода не видел, походу. Хочешь увидеть говнокод — загляни в реализацию File.ReadAllBytes. Вот где индусятина буйным цветом.

  File.ReadAllBytes (C#)
    public static byte[] ReadAllBytes(string path)
    {
        if (1 == 0)
        {
        }
        FileOptions options = FileOptions.SequentialScan;
        using SafeFileHandle safeFileHandle = OpenHandle(path, FileMode.Open, FileAccess.Read, FileShare.Read, options, 0L);
        long num = 0L;
        if (safeFileHandle.CanSeek && (num = safeFileHandle.GetFileLength()) > 2147483591)
        {
            throw new IOException(SR.IO_FileTooLong2GB);
        }
        if (num == 0L)
        {
            return ReadAllBytesUnknownLength(safeFileHandle);
        }
        int num2 = 0;
        int num3 = (int)num;
        byte[] array = new byte[num3];
        while (num3 > 0)
        {
            int num4 = RandomAccess.ReadAtOffset(safeFileHandle, array.AsSpan(num2, num3), num2);
            if (num4 == 0)
            {
                ThrowHelper.ThrowEndOfFileException();
            }
            num2 += num4;
            num3 -= num4;
        }
        return array;
    }

    private static byte[] ReadAllBytesUnknownLength(SafeFileHandle sfh)
    {
        byte[] array = null;
        Span<byte> span = stackalloc byte[512];
        try
        {
            int num = 0;
            while (true)
            {
                if (num == span.Length)
                {
                    uint num2 = (uint)(span.Length * 2);
                    if ((long)num2 > 2147483591L)
                    {
                        num2 = (uint)Math.Max(2147483591, span.Length + 1);
                    }
                    byte[] array2 = ArrayPool<byte>.Shared.Rent((int)num2);
                    span.CopyTo(array2);
                    byte[] array3 = array;
                    span = (array = array2);
                    if (array3 != null)
                    {
                        ArrayPool<byte>.Shared.Return(array3);
                    }
                }
                int num3 = RandomAccess.ReadAtOffset(sfh, span.Slice(num), num);
                if (num3 == 0)
                {
                    break;
                }
                num += num3;
            }
            return span.Slice(0, num).ToArray();
        }
        finally
        {
            if (array != null)
            {
                ArrayPool<byte>.Shared.Return(array);
            }
        }
    }


Классная работа ученика школы информационных технологий для умственно отсталых. Зато всё большими буквами, ага.