Skip to content

docs: правила работы со строками в CONTRIBUTING (#3807) - #3808

Merged
bylins merged 1 commit into
masterfrom
docs/string-rules
Aug 29, 2026
Merged

docs: правила работы со строками в CONTRIBUTING (#3807)#3808
bylins merged 1 commit into
masterfrom
docs/string-rules

Conversation

@bylins

@bylins bylins commented Aug 29, 2026

Copy link
Copy Markdown
Owner

Слой 0 из плана #3807.

Разбирать три с половиной тысячи старых мест без правила для нового кода бессмысленно: поток тех же конструкций не иссякнет, и уборка никогда не сойдётся. Поэтому сначала правило, разбор — потом и отдельно.

Что добавлено

Раздел «Работа со строками» в CONTRIBUTING.md, сразу после «Работы с памятью»:

  • собирать строки через fmt::format — он считает ширину и точность по символам и не переполняет буфер;
  • не использовать глобальные buf, buf1, buf2, arg, smallBuf — они общие на весь процесс, и вызов чужой функции посреди сборки строки затирает накопленное;
  • передавать const std::string & / std::string_view, возвращать std::string; функция, отдающая char * на статический буфер, ломается так же, как глобальный buf;
  • не измерять текст в байтах — таблица соответствий: длина, смещение, сравнение без регистра, заглавная буква, обход по символам, выравнивание (всё есть в utils/native_text.h, проверил каждое имя);
  • безусловный запрет: strcpy, strcat, sprintf в фиксированный буфер.

Отдельно оговорено, что остаётся допустимым: printf с %d, %s без ширины и %c над ASCII. Там байтовая семантика верна, и переписывать такое — шум в диффе.

Правило адресовано новому коду и тому, что правится рядом; на старый код есть ссылка в #3807.

Почему это нужно

Каждая из недавних правок — один и тот же корень: ширина колонок (#3797), «статус» со своим набором букв (#3795), ответ «нет» в zedit (#3796), заглавная буква в act() (#3806), падение на осмотре ёмкости (#3752).

🤖 Generated with Claude Code

https://claude.ai/code/session_01XUwDWDnYdXrJdvjDVd36QH

Слой 0 плана из #3807. После перехода на UTF-8 байт перестал равняться символу,
и почти каждая ошибка вывода за последние недели растёт отсюда: ширина колонок
(#3797), "статус" со своим набором букв (#3795), ответ "нет" в zedit (#3796),
заглавная буква в act (#3806), падение на осмотре ёмкости (#3752).

Разбирать старый код без правила для нового бессмысленно -- поток тех же
конструкций не иссякнет. Поэтому сначала правило: собирать строки через
fmt::format, не трогать глобальные буферы, передавать std::string, мерить текст
через native_text, не использовать strcpy/strcat/sprintf в фиксированный буфер.

Отдельно оговорено, что printf с %d, %s без ширины и %c над ASCII остаётся
допустимым: там байтовая семантика верна, и переписывать такое незачем.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUwDWDnYdXrJdvjDVd36QH
@bylins
bylins merged commit 17368fd into master Aug 29, 2026
20 checks passed
@bylins
bylins deleted the docs/string-rules branch August 29, 2026 14:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant