﻿# "Так исторически сложилось", или за что разделили V512

Как говорится, в любом деле самое сложное — это начать\. Так и мы, очень долго откладывали разделение диагностики V512, но время пришло\. Ну а о причинах и последствиях этого решения можно прочитать в данной заметке\.

![0978_V512_V1086_split_ru/image1.png](https://import.viva64.com/docx/blog/0978_V512_V1086_split_ru/image1.png)

Одна из первых диагностик общего назначения – [V512](https://pvs-studio.ru/ru/docs/warnings/v512/)  – изначально была реализована не очень удачно\. В своё время \(2013 год, если верить документации\) в ней совместили поиск переполнения буфера и неполной обработки буфера\. Уже давно стало понятно, что это неудачное решение, но не хотелось менять поведение работающей диагностики\. Так оно и повелось\.

"Ну а зачем же что\-то менять?" – спросите вы\. А причина есть, и довольно весомая\. Периодически нам в поддержку прилетали отзывы о том, что V512 неинтуитивно сочетает в себе практически противоположные по смыслу диагностики\. Причём вес \(достоверность\) сообщения о неполной обработке буфера намного ниже, чем о переполнении буфера\. Даже больше, почти всегда неполная обработка буфера — это ложное срабатывание\. Пример из недавних сообщений:


> "совершенно вредный варнинг буфер ундерфлов\\\. Например, код функции: создаём на стеке буфер \\\(1 кб\\\)\\\. Далее если входной аргумент равен 1, то копируем в тот буфер из одного места 100 байтов\\\. Иначе — из другого места 1 кб\\\. Выдаём преобразованное содержимое буфера \\\(разумеется, с учётом длины скопированного туда\\\)\\\. На это PVS\\\-Studio выдаёт на копирование 100 байтов варнинг буфер ундерфлов\\\. Кто чего\\\-то в жизни не понял?"\\\.



В общем случае люди хотят видеть предупреждения про переполнение буфера и почти никогда — про неполную обработку\. И разные уровни достоверности тут мало помогают\. Пользователям нужна простая возможность отключить диагностику про неполную обработку буфера, чтобы она была именно отдельной и не путалась с полезными предупреждениями о переполнении\.

С этим нужно было что\-то делать, и по какой\-то причине было решено\.\.\. Нет, не разделить диагностики\. Рано :\) Решили ограничиться введением специального комментария –_//\-V512\_UNDERFLOW\_OFF_, который отключал функционал поиска неполной обработки буфера\. Ну а для симметрии ввели похожий комментарий для отключения поиска переполнения буфера _//\-V512\_OVERFLOW\_OFF_\. Интересно, пригодился ли он хоть кому\-нибудь\.\.\.

Очень напоминает некое медицинское средство передвижения, которое переносит вес с ног на верхнюю часть тела\.\.\. Да, я говорю про костыль :\) К сожалению, сейчас уже никто не смог вспомнить, почему было принято именно такое решение \(или не хочет признаваться\)\. Тем не менее ~~костыль~~ малое архитектурное решение реализовали, документацию обновили, посчитали, что должно всех устроить\. Но нет – запросы в поддержку продолжились\. В чём же дело? 

Вряд ли я вас сейчас удивлю, но люди чаще всего смотрят в документацию, только если что\-то сломалось\. Ну а так как ложное срабатывание поломкой не является, то люди продолжали писать в поддержку\. Приходилось довольно часто объяснять, что это ожидаемое поведение диагностики и существуют специальные комментарии для подавления её срабатываний\.

![0978_V512_V1086_split_ru/image2.png](https://import.viva64.com/docx/blog/0978_V512_V1086_split_ru/image2.png)

Недавно нам и это надоело, а посему было решено наконец\-то разделить и переименовать диагностики: [V512](https://pvs-studio.ru/ru/docs/warnings/v512/) решили оставить для переполнения буфера, а для неполной обработки создать новую – [V1086](https://pvs-studio.ru/ru/docs/warnings/v1086/)\. Ну и переименовать заодно, чтобы не создавать ещё больше путаницы\. Теперь диагностики будут называться так:

* V512\. Call of the 'Foo' function will lead to buffer overflow\.
* V1086\. Call of the 'Foo' function will lead to buffer underflow\.

Хотя и тут без странностей не обошлось\. В целях сохранения обратной совместимости пришлось оставить поддержку некогда специально созданных комментариев\. Теперь _//\-V512\_OVERFLOW\_OFF_ будет подавлять диагностику V512, а _//\-V512\_UNDERFLOW\_OFF_ диагностику V1086\. Такое вот наследие прошлого\.