-
Сборка проекта Bag
Для сборки проекта Bag выберем пункт основного меню Build / Rebuild solution. В результате сборка выполнится успешно, однако в окне “Output. Show output from Build” будет выдан целый ряд предупреждений. Приведем полностью содержимое окна:
------ Rebuild All started: Project: Project4, Configuration: Debug .NET ------
Spec# program verifier: Creating BoogiePL program
Spec# program verifier: Checking BoogiePL program
Spec# program verifier: Verifying method 1 of 12: Bag.SpecSharp::CheckInvariant(System.Boolean) (implementation Bag.SpecSharp.CheckInvariant$System.Boolean)... 0 error(s) found
Spec# program verifier: Verifying method 2 of 12: Bag.#ctor(System.Int32[]) (implementation Bag..ctor$System.Int32.array)... 1 error(s) found
Spec# program verifier: Verifying method 3 of 12: Bag.#ctor(optional(Microsoft.Contracts.NonNullType) System.Int32[],System.Int32,System.Int32) (implementation Bag..ctor$System.Int32.array$notnull$System.Int32$System.Int32)... 2 error(s) found
Spec# program verifier: Verifying method 4 of 12: Bag.RemoveMin (implementation Bag.RemoveMin)... 4 error(s) found
Spec# program verifier: Verifying method 5 of 12: Bag.Add(System.Int32) (implementation Bag.Add$System.Int32)... 5 error(s) found
Spec# program verifier: Verifying method 6 of 12: Bag..cctor (implementation Bag..cctor)... 0 error(s) found
Spec# program verifier: Verifying method 7 of 12: BagFixed.SpecSharp::CheckInvariant(System.Boolean) (implementation BagFixed.SpecSharp.CheckInvariant$System.Boolean)... 0 error(s) found
Spec# program verifier: Verifying method 8 of 12: BagFixed.#ctor(optional(Microsoft.Contracts.NonNullType) System.Int32[]) (implementation BagFixed..ctor$System.Int32.array$notnull)... 0 error(s) found
Spec# program verifier: Verifying method 9 of 12: BagFixed.#ctor(optional(Microsoft.Contracts.NonNullType) System.Int32[],System.Int32,System.Int32) (implementation BagFixed..ctor$System.Int32.array$notnull$System.Int32$System.Int32)... 0 error(s) found
Spec# program verifier: Verifying method 10 of 12: BagFixed.RemoveMin (implementation BagFixed.RemoveMin)... 0 error(s) found
Spec# program verifier: Verifying method 11 of 12: BagFixed.Add(System.Int32) (implementation BagFixed.Add$System.Int32)... 0 error(s) found
Spec# program verifier: Verifying method 12 of 12: BagFixed..cctor (implementation BagFixed..cctor)... 0 error(s) found
Spec# program verifier: Finished
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(11,5): warning CS2663: array reference might be null
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(11,18): warning CS2638: Using possibly null pointer to get array length
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(24,5): warning CS2663: Call of System.Array.Copy(System.Array! sourceArray, int sourceIndex, System.Array! destinationArray, int destinationIndex, int length), unsatisfied precondition: destinationIndex + length <= destinationArray.GetLowerBound(0) + destinationArray.Length
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(24,5): warning CS2663: Call of System.Array.Copy(System.Array! sourceArray, int sourceIndex, System.Array! destinationArray, int destinationIndex, int length), unsatisfied precondition: sourceIndex + length <= sourceArray.GetLowerBound(0) + sourceArray.Length
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(29,14): warning CS2663: Method Bag.RemoveMin(), unsatisfied frame condition
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(42,7): warning CS2663: (trace position)
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(42,7): warning CS2663: Assignment to field Bag.count of non-exposed target object may break invariant: 0 <= count
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(42,7): warning CS2663: (trace position)
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(43,7): warning CS2663: Target array of assignment is not allowed to be committed
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(42,7): warning CS2663: (trace position)
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(43,13): warning CS2663: Array index possibly above upper bound
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(42,7): warning CS2663: (trace position)
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(47,15): warning CS2663: Method Bag.Add(int x), unsatisfied frame condition
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(56,7): warning CS2663: (trace position)
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(53,9): warning CS2663: The call to System.Array.Copy(System.Array! sourceArray, int sourceIndex, System.Array! destinationArray, int destinationIndex, int length) requires sourceArray to be peer consistent
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(52,9): warning CS2663: (trace position)
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(53,9): warning CS2663: The call to System.Array.Copy(System.Array! sourceArray, int sourceIndex, System.Array! destinationArray, int destinationIndex, int length) requires sourceArray to be peer consistent (owner must not be valid)
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(52,9): warning CS2663: (trace position)
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(56,7): warning CS2663: Target array of assignment is not allowed to be committed
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(56,7): warning CS2663: (trace position)
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(56,13): warning CS2663: Array index possibly above upper bound
C:\Documents and Settings\saf\My Documents\Visual Studio 2008\Projects\Project4\Project4\BagBroken.ssc(52,9): warning CS2663: (trace position)
Build complete -- 0 errors, 22 warnings
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
Приведенные предупреждения весьма полезны. Их анализ позволит еще до выполнения программы исправить найденные ошибки.
Ряд ошибок найден статическим верификатором Boogie, встроенном в систему Spec#. Он сообщает о несоответствиях реализации и спецификации, которые могут быть найдены статически (без исполнения программы). Например, в конструкторе Bag используется вызов Array.Copy, неправильный пятый аргумент которого приводит к нарушению инварианта, что и фиксирует верификатор Boogie. Однако верификатор выводит свои сообщения как предупреждения, т.е. пользователю дается возможность исполнения программы, если ее сборка пройдет успешно.
