< Summary

Information
Class: DotnetFuzzing.Fuzzers.SearchValuesByteCharFuzzer
Assembly: DotnetFuzzing
File(s): D:\runner\runtime\src\libraries\Fuzzing\DotnetFuzzing\Fuzzers\SearchValuesByteCharFuzzer.cs
Line coverage
98%
Covered lines: 79
Uncovered lines: 1
Coverable lines: 80
Total lines: 131
Line coverage: 98.7%
Branch coverage
100%
Covered branches: 24
Total branches: 24
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
FuzzTarget(...)100%66100%
Test(...)100%22100%
IndexOfAnyScalar(...)100%44100%
IndexOfAnyExceptScalar(...)100%44100%
LastIndexOfAnyScalar(...)100%44100%
LastIndexOfAnyExceptScalar(...)100%44100%

File(s)

D:\runner\runtime\src\libraries\Fuzzing\DotnetFuzzing\Fuzzers\SearchValuesByteCharFuzzer.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Buffers;
 5using System.Numerics;
 6using System.Runtime.CompilerServices;
 7using System.Runtime.InteropServices;
 8
 9namespace DotnetFuzzing.Fuzzers;
 10
 11internal sealed class SearchValuesByteCharFuzzer : IFuzzer
 12{
 013    public string[] TargetAssemblies => [];
 114    public string[] TargetCoreLibPrefixes { get; } = ["System.Buffers", "System.SpanHelpers", "System.PackedSpanHelpers"
 15
 16    public unsafe void FuzzTarget(ReadOnlySpan<byte> bytes)
 851117    {
 851118        int newLine = bytes.IndexOf((byte)'\n');
 851119        if (newLine < 0)
 3220        {
 3221            return;
 22        }
 23
 847924        ReadOnlySpan<byte> haystack = bytes.Slice(newLine + 1);
 847925        ReadOnlySpan<byte> values = bytes.Slice(0, newLine);
 26
 847927        using var byteHaystack0 = PooledBoundedMemory<byte>.Rent(haystack, PoisonPagePlacement.Before);
 847928        using var byteHaystack1 = PooledBoundedMemory<byte>.Rent(haystack, PoisonPagePlacement.After);
 29
 847930        Test(byteHaystack0.Span, byteHaystack1.Span, values, SearchValues.Create(values));
 31
 847932        if ((nuint)Unsafe.AsPointer(ref MemoryMarshal.GetReference(haystack)) % 2 != 0 && !haystack.IsEmpty)
 448633        {
 34            // Ensure that the haystack is 2-byte aligned now that we're about to cast it to chars.
 448635            haystack = haystack.Slice(1);
 448636        }
 37
 847938        using var charHaystack0 = PooledBoundedMemory<char>.Rent(MemoryMarshal.Cast<byte, char>(haystack), PoisonPagePla
 847939        using var charHaystack1 = PooledBoundedMemory<char>.Rent(MemoryMarshal.Cast<byte, char>(haystack), PoisonPagePla
 40
 847941        ReadOnlySpan<char> charValues = MemoryMarshal.Cast<byte, char>(values);
 847942        Test(charHaystack0.Span, charHaystack1.Span, charValues, SearchValues.Create(charValues));
 1699043    }
 44
 45    private static void Test<T>(ReadOnlySpan<T> haystack, ReadOnlySpan<T> haystackCopy, ReadOnlySpan<T> values, SearchVa
 46        where T : struct, INumber<T>, IMinMaxValue<T>
 1695847    {
 1695848        int indexOfAny = haystack.IndexOfAny(searchValues);
 1695849        int indexOfAnyExcept = haystack.IndexOfAnyExcept(searchValues);
 1695850        int lastIndexOfAny = haystack.LastIndexOfAny(searchValues);
 1695851        int lastIndexOfAnyExcept = haystack.LastIndexOfAnyExcept(searchValues);
 52
 1695853        Assert.Equal(indexOfAny, haystackCopy.IndexOfAny(searchValues));
 1695854        Assert.Equal(indexOfAnyExcept, haystackCopy.IndexOfAnyExcept(searchValues));
 1695855        Assert.Equal(lastIndexOfAny, haystackCopy.LastIndexOfAny(searchValues));
 1695856        Assert.Equal(lastIndexOfAnyExcept, haystackCopy.LastIndexOfAnyExcept(searchValues));
 57
 1695858        Assert.Equal(IndexOfAnyScalar(haystack, searchValues), indexOfAny);
 1695859        Assert.Equal(IndexOfAnyExceptScalar(haystack, searchValues), indexOfAnyExcept);
 1695860        Assert.Equal(LastIndexOfAnyScalar(haystack, searchValues), lastIndexOfAny);
 1695861        Assert.Equal(LastIndexOfAnyExceptScalar(haystack, searchValues), lastIndexOfAnyExcept);
 62
 1695863        Assert.Equal(indexOfAny >= 0, lastIndexOfAny >= 0);
 1695864        Assert.Equal(indexOfAnyExcept >= 0, lastIndexOfAnyExcept >= 0);
 65
 1695866        Assert.Equal(indexOfAny >= 0, haystack.ContainsAny(searchValues));
 1695867        Assert.Equal(indexOfAnyExcept >= 0, haystack.ContainsAnyExcept(searchValues));
 68
 1695869        if (!values.IsEmpty)
 1653670        {
 1653671            Assert.Equal(0, values.IndexOfAny(searchValues));
 1653672            Assert.Equal(-1, values.IndexOfAnyExcept(searchValues));
 1653673        }
 1695874    }
 75
 76    private static int IndexOfAnyScalar<T>(ReadOnlySpan<T> haystack, SearchValues<T> values)
 77        where T : IEquatable<T>
 1695878    {
 233007879        for (int i = 0; i < haystack.Length; i++)
 115793080        {
 115793081            if (values.Contains(haystack[i]))
 984982            {
 984983                return i;
 84            }
 114808185        }
 86
 710987        return -1;
 1695888    }
 89
 90    private static int IndexOfAnyExceptScalar<T>(ReadOnlySpan<T> haystack, SearchValues<T> values)
 91        where T : IEquatable<T>
 1695892    {
 112369093        for (int i = 0; i < haystack.Length; i++)
 55809494        {
 55809495            if (!values.Contains(haystack[i]))
 1320796            {
 1320797                return i;
 98            }
 54488799        }
 100
 3751101        return -1;
 16958102    }
 103
 104    private static int LastIndexOfAnyScalar<T>(ReadOnlySpan<T> haystack, SearchValues<T> values)
 105        where T : IEquatable<T>
 16958106    {
 2487714107        for (int i = haystack.Length - 1; i >= 0; i--)
 1236748108        {
 1236748109            if (values.Contains(haystack[i]))
 9849110            {
 9849111                return i;
 112            }
 1226899113        }
 114
 7109115        return -1;
 16958116    }
 117
 118    private static int LastIndexOfAnyExceptScalar<T>(ReadOnlySpan<T> haystack, SearchValues<T> values)
 119        where T : IEquatable<T>
 16958120    {
 908022121        for (int i = haystack.Length - 1; i >= 0; i--)
 450260122        {
 450260123            if (!values.Contains(haystack[i]))
 13207124            {
 13207125                return i;
 126            }
 437053127        }
 128
 3751129        return -1;
 16958130    }
 131}