Пример #1
0
        /// <summary>
        /// Get next mutation change (if happend)
        /// </summary>
        /// <param name="stream">Stream</param>
        /// <param name="offset">Offset</param>
        /// <param name="index">Index</param>
        public MutationalChange Get(FuzzingStream stream, long offset, int index)
        {
            if (ValidOffset?.ItsValid(offset) == false)
            {
                return(null);
            }

            switch (FuzzPercentType)
            {
            case EFuzzingPercentType.PeerByte:
            {
                // Check Max changes
                if (MaxChanges != null &&
                    stream.Log.Length >= MaxChanges.Get())
                {
                    return(null);
                }

                // Check Percent
                if (FuzzPercent != null)
                {
                    var value = FuzzPercent.Get();

                    if (!RandomHelper.IsRandomPercentOk(value))
                    {
                        return(null);
                    }
                }

                // Get Item
                return(Changes.Get());
            }

            case EFuzzingPercentType.PeerStream:
            {
                // Check Max changes
                var s = (Step)stream.Variables[index];
                if (stream.Log.Length >= s.MaxChanges)
                {
                    return(null);
                }

                if (!s.FuzzIndex.Contains(offset))
                {
                    return(null);
                }

                // Get Item
                return(Changes.Get());
            }

            default:
            {
                throw new ArgumentException(nameof(FuzzPercentType));
            }
            }
        }