< Summary

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

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
FuzzTarget(...)0%660%
Test(...)0%220%
IndexOfAnyScalar(...)0%440%
IndexOfAnyExceptScalar(...)0%440%
LastIndexOfAnyScalar(...)0%440%
LastIndexOfAnyExceptScalar(...)0%440%

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 => [];
 014    public string[] TargetCoreLibPrefixes { get; } = ["System.Buffers", "System.SpanHelpers", "System.PackedSpanHelpers"
 15
 16    public unsafe void FuzzTarget(ReadOnlySpan<byte> bytes)
 017    {
 018        int newLine = bytes.IndexOf((byte)'\n');
 019        if (newLine < 0)
 020        {
 021            return;
 22        }
 23
 024        ReadOnlySpan<byte> haystack = bytes.Slice(newLine + 1);
 025        ReadOnlySpan<byte> values = bytes.Slice(0, newLine);
 26
 027        using var byteHaystack0 = PooledBoundedMemory<byte>.Rent(haystack, PoisonPagePlacement.Before);
 028        using var byteHaystack1 = PooledBoundedMemory<byte>.Rent(haystack, PoisonPagePlacement.After);
 29
 030        Test(byteHaystack0.Span, byteHaystack1.Span, values, SearchValues.Create(values));
 31
 032        if ((nuint)Unsafe.AsPointer(ref MemoryMarshal.GetReference(haystack)) % 2 != 0 && !haystack.IsEmpty)
 033        {
 34            // Ensure that the haystack is 2-byte aligned now that we're about to cast it to chars.
 035            haystack = haystack.Slice(1);
 036        }
 37
 038        using var charHaystack0 = PooledBoundedMemory<char>.Rent(MemoryMarshal.Cast<byte, char>(haystack), PoisonPagePla
 039        using var charHaystack1 = PooledBoundedMemory<char>.Rent(MemoryMarshal.Cast<byte, char>(haystack), PoisonPagePla
 40
 041        ReadOnlySpan<char> charValues = MemoryMarshal.Cast<byte, char>(values);
 042        Test(charHaystack0.Span, charHaystack1.Span, charValues, SearchValues.Create(charValues));
 043    }
 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>
 047    {
 048        int indexOfAny = haystack.IndexOfAny(searchValues);
 049        int indexOfAnyExcept = haystack.IndexOfAnyExcept(searchValues);
 050        int lastIndexOfAny = haystack.LastIndexOfAny(searchValues);
 051        int lastIndexOfAnyExcept = haystack.LastIndexOfAnyExcept(searchValues);
 52
 053        Assert.Equal(indexOfAny, haystackCopy.IndexOfAny(searchValues));
 054        Assert.Equal(indexOfAnyExcept, haystackCopy.IndexOfAnyExcept(searchValues));
 055        Assert.Equal(lastIndexOfAny, haystackCopy.LastIndexOfAny(searchValues));
 056        Assert.Equal(lastIndexOfAnyExcept, haystackCopy.LastIndexOfAnyExcept(searchValues));
 57
 058        Assert.Equal(IndexOfAnyScalar(haystack, searchValues), indexOfAny);
 059        Assert.Equal(IndexOfAnyExceptScalar(haystack, searchValues), indexOfAnyExcept);
 060        Assert.Equal(LastIndexOfAnyScalar(haystack, searchValues), lastIndexOfAny);
 061        Assert.Equal(LastIndexOfAnyExceptScalar(haystack, searchValues), lastIndexOfAnyExcept);
 62
 063        Assert.Equal(indexOfAny >= 0, lastIndexOfAny >= 0);
 064        Assert.Equal(indexOfAnyExcept >= 0, lastIndexOfAnyExcept >= 0);
 65
 066        Assert.Equal(indexOfAny >= 0, haystack.ContainsAny(searchValues));
 067        Assert.Equal(indexOfAnyExcept >= 0, haystack.ContainsAnyExcept(searchValues));
 68
 069        if (!values.IsEmpty)
 070        {
 071            Assert.Equal(0, values.IndexOfAny(searchValues));
 072            Assert.Equal(-1, values.IndexOfAnyExcept(searchValues));
 073        }
 074    }
 75
 76    private static int IndexOfAnyScalar<T>(ReadOnlySpan<T> haystack, SearchValues<T> values)
 77        where T : IEquatable<T>
 078    {
 079        for (int i = 0; i < haystack.Length; i++)
 080        {
 081            if (values.Contains(haystack[i]))
 082            {
 083                return i;
 84            }
 085        }
 86
 087        return -1;
 088    }
 89
 90    private static int IndexOfAnyExceptScalar<T>(ReadOnlySpan<T> haystack, SearchValues<T> values)
 91        where T : IEquatable<T>
 092    {
 093        for (int i = 0; i < haystack.Length; i++)
 094        {
 095            if (!values.Contains(haystack[i]))
 096            {
 097                return i;
 98            }
 099        }
 100
 0101        return -1;
 0102    }
 103
 104    private static int LastIndexOfAnyScalar<T>(ReadOnlySpan<T> haystack, SearchValues<T> values)
 105        where T : IEquatable<T>
 0106    {
 0107        for (int i = haystack.Length - 1; i >= 0; i--)
 0108        {
 0109            if (values.Contains(haystack[i]))
 0110            {
 0111                return i;
 112            }
 0113        }
 114
 0115        return -1;
 0116    }
 117
 118    private static int LastIndexOfAnyExceptScalar<T>(ReadOnlySpan<T> haystack, SearchValues<T> values)
 119        where T : IEquatable<T>
 0120    {
 0121        for (int i = haystack.Length - 1; i >= 0; i--)
 0122        {
 0123            if (!values.Contains(haystack[i]))
 0124            {
 0125                return i;
 126            }
 0127        }
 128
 0129        return -1;
 0130    }
 131}