Это означает, что анализатор не может «увидеть», могут ли быть затронуты глобальные переменные при вызове этой функции. Поэтому предполагается, что этот вызов ничего не изменяет (иначе все другие доказательства могут быть немедленно опровергнуты). Вероятно, это правильное предположение для вашего конкретного примера, но оно может оказаться недействительным во встроенной системе, где пользовательская реализация Put_Line может делать что угодно.
Есть два способа передать недостающую информацию:
- верификатор может проверить исходный код функции. Затем он может попытаться сам сгенерировать глобальные контракты.
- глобальные контракты указаны явно, см. RM 6.1.4 (http://docs.adacore.com/spark2014-docs/html/lrm/subprograms.html#global-aspects)
В этом случае вызываемая вами процедура является частью системы времени выполнения (RTS), и поэтому источник не виден, и вы, вероятно, не можете/не должны его изменять.
Что делать на практике?
Подавление предупреждений почти никогда не является хорошей идеей, особенно когда вы работаете над чем-то важным для безопасности. Обычно код нужно менять до тех пор, пока предупреждение не исчезнет, или должен начаться какой-то процесс обоснования.
Если вы серьезно относитесь к результатам анализа, я рекомендую не использовать такие подпрограммы. Если вам действительно нужен вывод туда, либо напишите свою собственную процедуру, заменяющую подпрограмму RTS, либо убедитесь, что подпрограмма действительно не имеет побочных эффектов. Это также подтверждается тем, на что ссылается Фредерик: даже если вызываемый объект не имеет побочных эффектов, вы не знаете, вызывает ли он исключение для определенных входных данных (например, очень длинных строк).
Если вы не так серьезно относитесь к результатам, вы можете рассматривать этот конкретный результат как предупреждение, с которым вы можете жить.
person
Martin B
schedule
24.01.2018