Re[24]: И еще рассуждения об ИИ
От: Pavel Dvorkin Россия  
Дата: 11.02.26 10:48
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Эмм, вообще-то преподаватель технического ВУЗа по айтишной специальности должен хоть краем глаза слышать о методах проверки корректности программ. В частности, о дедуктивной верификации.


Слышал.

S>А вот ИИ на эту программу выдаст следующее:


S>В программе есть несколько ошибок и неточностей. Разберём их по порядку.


<skipped>

Да, конечно, написал с ошибками. Писал прямо здесь. Увы, у меня не установлен сейчас С++ компилятор на машине, давно с ним не работал. Раньше я перед постингом обычно проверял работу кода.

Остальное skipped, потому что относится к ошибкам в коде, а не к основному вопросу про переполнение.

Кроме вот этого.

S>Возможное переполнение


S>Если l и w достаточно большие, произведение может переполнить unsigned int.


S>Если это учебная задача — всё нормально.



Это не учебная задача, а пример ad hoc, сделанный для иллюстрации вопроса.

В итоге имеем лишь одно замечание по существу — про возможность переполнения. То, что переполнение "в принципе" возможно при умножении 2 uint — для этого не надо никаких верификаций, это и так ясно. И из этого вовсе не следует, что так уж необходимо перейти к ulong.

Я ничего против того, что он на это указал, не имею. Пусть напомнит, верно. Но меня-то иное интересовало — может ли оно быть при тех данных, которые меня интересуют. А на этот вопрос у него ответа нет.

Если эти длина и ширина — размеры дисплея обычной машины в пикселях, то совершенно спокойно можно остаться с unit — пока что дисплеев с размерами, при которых переполнение возможно, в природе нет.

Если это что-то другое — надо знать, какие могут быть значения у этих величин. Вот я приводил 100000 как пример. Допустим, я не знаю, каков maxint. Делаю несколько простейших тестов — работает. Делаю тест 100000 на 100000 — проваливается. Все. Действительно, надо переходить к ulong.

Ну а если это размеры дисплея — ну сделаю тест 10000 на 10000, все будет в порядке, можно так и оставить.

Так что тест мне ошибку найти сможет, а этот анализ лишь говорит, что она в принципе возможна. Это и без него ясно.

Впрочем, можно и более простой пример привести. даже без умножения.

unsigned int population;

Это корректно или нет ?

Если это население страны, то я нелестно выскажусь в адрес того, кто мне скажет, что может не хватить. Нет таких стран с населением 4 млрд. человек и скорее всего не будет. А если когда-то и будет, то моей программы уже точно не будет
Если это население Земли, то не годится. Не хватит. Сейчас. А были бы компьютеры в 15 веке, сказали бы, что вполне хватит. И несколько веков бы вполне хватило.

Что мне тут статический анализ скажет ? Про потенциальную возможность переполнения при суммировании любых чисел ? Спасибо. Без него я бы не догадался

А тест скажет. Найдем население Земли как сумму населений стран — и все. Приехали. Сейчас. А в 15 веке все было бы в порядке.
With best regards
Pavel Dvorkin
Отредактировано 11.02.2026 11:50 Pavel Dvorkin . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.