Skip to content

Conversation

@oetr
Copy link
Contributor

@oetr oetr commented Oct 10, 2025

This allows the users provide values directly to types by annotating them with @ValuePool.
All types, other than those that need cached-based mutators, are supported.

  public static Stream<?> myPool() {
    return Stream.of(
        "0123456789abcdef".repeat(50),
        "sitting duck suprime".repeat(53),
        123);
  }

  @FuzzTest
  @ValuePool("myPool")
  public static void fuzzerTestOneInput(
      @NotNull @WithUtf8Length(max = 10000) String data,
      @NotNull @WithUtf8Length(max = 10000) String data2) {
    if (data.equals("0123456789abcdef".repeat(50))
        && data2.equals("sitting duck suprime".repeat(53))) {
      throw new FuzzerSecurityIssueLow("Found the long string!");
    }
  }

@oetr oetr force-pushed the CIF-1785-dictionary-provider branch 15 times, most recently from 958d54a to d164e3c Compare October 16, 2025 23:50
@oetr oetr force-pushed the CIF-1785-dictionary-provider branch 3 times, most recently from 5eac7ec to 5069fb3 Compare October 28, 2025 19:20
@oetr oetr changed the title feat: dictionary provider for selected types feat: dictionary provider for Strings and Integrals Oct 28, 2025
@oetr oetr marked this pull request as ready for review October 28, 2025 19:25
Copilot AI review requested due to automatic review settings October 28, 2025 19:25
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR adds dictionary provider support to the mutation framework, enabling users to provide custom dictionary values for fuzzing through the @DictionaryProvider annotation. The implementation:

  • Introduces MutatorRuntime class to provide runtime information (including the fuzz test method) to mutators
  • Adds @DictionaryProvider annotation that references static methods returning Stream<?> of dictionary values
  • Updates all MutatorFactory implementations to accept MutatorRuntime parameter
  • Implements dictionary support for String and integral mutators using weighted sampling
  • Adds SamplingUtils with Vose's alias method for efficient O(1) weighted sampling
  • Includes comprehensive tests for the new functionality

Reviewed Changes

Copilot reviewed 85 out of 85 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
DictionaryProvider.java New annotation for specifying dictionary provider methods with probability control
MutatorRuntime.java New runtime info class providing fuzz test method to mutators
DictionaryProviderSupport.java Helper methods to extract dictionary values from provider methods
IgnoreRecursiveConflicts.java Meta-annotation to allow duplicate annotations during type hierarchy propagation
SamplingUtils.java Weighted sampling utilities using Vose's alias method
StringMutatorFactory.java Implements dictionary support for String mutators
IntegralMutatorFactory.java Implements dictionary support for integral type mutators
MutatorFactory.java Updated interface to accept MutatorRuntime parameter
ArgumentsMutator.java Forwards method-level @DictionaryProvider annotations to parameters
TestSupport.java Adds helper methods for creating dummy MutatorRuntime in tests
All other factory files Updated to pass through MutatorRuntime parameter

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@oetr oetr force-pushed the CIF-1785-dictionary-provider branch 5 times, most recently from 0044fb9 to 84707f2 Compare October 30, 2025 12:42
Copy link
Contributor

@simonresch simonresch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool feature!

I'm not entirely sure that the ability to have different dictionaries per field warrants the added complexity & state in the MutatorRuntime. Is this an essential part of the custom dictionary in your opinion? Having a single @DictionaryProvider per fuzz test could simplify the mutator instantiation and maybe even make it simpler to use for users.
Otherwise my main concern would be the duplication with DictionaryEntry and similar annotations (see other comment).

@oetr oetr force-pushed the CIF-1785-dictionary-provider branch from 84707f2 to c64c841 Compare November 19, 2025 12:17
@oetr oetr marked this pull request as draft November 19, 2025 12:17
@oetr oetr force-pushed the CIF-1785-dictionary-provider branch 5 times, most recently from 1ca7569 to b29031b Compare November 21, 2025 01:34
@oetr oetr changed the title feat: dictionary provider for Strings and Integrals feat: add @ValuePool to propagate values to types Nov 21, 2025
@oetr oetr force-pushed the CIF-1785-dictionary-provider branch 3 times, most recently from 7fc2b50 to 4cbb978 Compare November 21, 2025 13:17
@oetr oetr marked this pull request as ready for review November 21, 2025 13:53
Copy link
Contributor

@simonresch simonresch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the changes! I really like the ValuePool name and the more centralized implementation. Really cool that it works for (almost) all mutators. Only have some minor comments regarding doc strings. Nice work!

@oetr oetr force-pushed the CIF-1785-dictionary-provider branch from 4cbb978 to 38b2459 Compare November 25, 2025 09:58
oetr added 3 commits November 25, 2025 10:59
In addition to primitive arrays, these types are now also supported:
- List<Integer> []
- List<Integer> [][][]
Allow annotations to be inherited at multiple levels of the type hierarchy,
enabling both broad and specific configuration of mutators.

Use case: Configure mutators that share common types. For example, annotate
a fuzz test method to apply default settings to all String mutators, while
still allowing individual String parameters to override those settings with
different values.

Without this feature, an annotation could only appear once in the inheritance
chain, preventing this layered configuration approach.
This adds a new user-facing annotation @valuepool for wiring values
directly to type mutators.

ValuePoolMutatorFactory is prepended before (almost) every mutator.
@oetr oetr force-pushed the CIF-1785-dictionary-provider branch from 38b2459 to 00d05c2 Compare November 25, 2025 09:59
@oetr oetr enabled auto-merge (rebase) November 25, 2025 10:05
@oetr oetr merged commit cb951cf into main Nov 25, 2025
13 of 17 checks passed
@oetr oetr deleted the CIF-1785-dictionary-provider branch November 25, 2025 11:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants