FIXED: + function WINCOPY & WINREST не запрещают прерывания перед вызовом BIOS (используется вывод стеком!). + при выводе на консоль длинного текста, экран не скролируется. Проверять на достижение 80 позиции! ? ошибка в функции SCROLL A=0. + ошибка при просмотре каталога в функциях установки атрибутов пропускаются системные файлы. п/п SEARCH MASK=#23 - игнорирование ошибок при записи системных областей FAT/DIR, невозможность отработать ошибку write-protect, так как она теряется при попытке записать измененный каталог на диск. Но возникает ошибка file not found так как сразу после создания система открывает файл. - ошибка разбора допустимого имени файла, если оно состоит из "." так как подразумевается пробелы точка пробелы. ======================================================= AI ======================================================= 1.1. CREATE (Create.asm) ? Осиротевшая запись каталога при сбое открытия - После создания записи каталога (WRT_HND, SAVEDIR) вызывается OPEN_FN.FILE. Если открытие файла не удаётся (например, нет свободных манипуляторов, ошибка диска), в каталоге остаётся файловая запись с нулевым размером и без данных. Последующие попытки создать файл с тем же именем приведут к ошибке FILE_EXISTS, хотя файл фактически пуст и не открыт. - Исправление: если OPEN_FN.FILE возвращает ошибку, нужно удалить только что созданную запись вызовом DELETE_REC_FAT. 1.2. ATTRIB (Attribute.asm) ? Некорректный режим открытия для записи атрибутов - При установке атрибута (B=1) вызывается .OPENATR, которая открывает файл с режимом по умолчанию (A=0 ? чтение/запись). Если файл уже открыт другим процессом на запись, операция может завершиться ошибкой или нарушить блокировки. Не проверяется текущий режим доступа. - Исправление: открывать файл с режимом 0 (чтение/запись) только если он не был открыт ранее; при необходимости использовать отдельный запрос блокировки. 1.3. LEAV (Execute.ASM) ? Отсутствие проверки SP в EXE-заголовке - При запуске EXE-файла значение SP_REG из заголовка загружается в SP без проверок. Некорректное значение (например, 0x0000) приведёт к немедленному краху стека. Желательно проверять, попадает ли SP в допустимый диапазон памяти задачи, и устанавливать безопасное значение при ошибке. 1.4. Read (Read.asm) ? Несбалансированный стек на пути ошибки Утверждение из первоначального анализа оказалось неверным ? после трёх PUSH (BC,HL,DE) выполняются три POP (HL,HL,BC), стек балансируется. Однако DE остаётся испорченным, что допустимо по соглашению. Проблемы со стеком нет. Тем не менее, в этом же модуле есть другой потенциальный дефект: в .ROV1 при успешном чтении используется EXX и модификация стека в альтернативных регистрах, что может привести к путанице, если где-то не сохранены вторичные регистры. Рекомендуется тщательно проверять использование EXX в обработчиках ошибок. 1.5. ENV_EX (Environ.asm) ? Игнорирование ошибки переполнения буфера - Функция ENV_EX может установить CF=1, если входная строка окружения слишком длинная, но вызывающие её процедуры GETENV и SETENV никак не анализируют этот флаг. Переменная создаётся или читается с обрезанным значением без предупреждения, что может привести к трудноуловимым ошибкам конфигурации. - Исправление: добавить проверку CF после вызова ENV_EX и возвращать ошибку ENV_ITEM_OVERFLOW. 1.6. diskINF GetFreeSpace (diskINF.asm) ? Возможное зависание при повреждённой FAT - Цикл подсчёта свободных кластеров проверяет READ_FROM_FAT, но не ограничивает число итераций. Если цепочка кластеров замкнута или таблица FAT испорчена, цикл может стать бесконечным. - Исправление: добавить счётчик итераций, равный общему числу кластеров, или использовать аппаратный тайм-аут. ================================================================ 2. ПРЕДЛОЖЕНИЯ ПО ОПТИМИЗАЦИИ ================================================================ 2.2. Кэширование каталога - Многие функции (OPEN, DELETE, RENAME) многократно загружают один и тот же каталог через LOADDIR. Можно проверять, не совпадает ли текущий открытый каталог с FM_BUF[0], и избегать повторного чтения. 2.5. Оптимизация WRITE_FAT_TABLE - При записи кэша FAT на диск проверяется значение CacheUpdated, и записываются только изменённые блоки. Однако при последовательной записи многих кластеров часто вызывается WRITE_FAT_TABLE. Можно отложить запись до закрытия файла или накопить изменения. 2.6. Избегание повторного чтения BPB - В OPENDSK каждый раз вызывается RD_BPB, даже если диск уже открыт с теми же параметрами. Можно добавить поле в FS_Buffer, сигнализирующее, что BPB корректен, и пропускать повторное чтение при отсутствии смены диска. ================================================================ 3. ОБЩИЕ ЗАМЕЧАНИЯ ================================================================ 3.3. Отсутствие проверок границ буферов - В ряде процедур (например, EXEC Build PSP, Environ) используются фиксированные константы размера буфера (#100, #80). Желательно проверять, что данные не выходят за границы выделенной памяти. 3.4. Устаревший код - В файлах присутствуют закомментированные старые реализации (например, старый ECHOKEY с курсором, старый PUTCHAR). Их удаление уменьшит объём исходного текста и улучшит читаемость. ================================================================