Skip to content

Commit 9fd282c

Browse files
Finish dataflow removal (#3986)
Most of it was removed last year. There's little chance we will use it again.
1 parent b91cd06 commit 9fd282c

File tree

10 files changed

+16
-349
lines changed

10 files changed

+16
-349
lines changed

src/clusterfuzz/_internal/bot/fuzzers/libFuzzer/engine.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,10 @@ class LibFuzzerOptions(engine.FuzzOptions):
6565
"""LibFuzzer engine options."""
6666

6767
def __init__(self, corpus_dir, arguments, strategies, fuzz_corpus_dirs,
68-
extra_env, use_dataflow_tracing, is_mutations_run):
68+
extra_env, is_mutations_run):
6969
super().__init__(corpus_dir, arguments, strategies)
7070
self.fuzz_corpus_dirs = fuzz_corpus_dirs
7171
self.extra_env = extra_env
72-
self.use_dataflow_tracing = use_dataflow_tracing
7372
self.is_mutations_run = is_mutations_run
7473
self.merge_back_new_testcases = True
7574

@@ -144,8 +143,7 @@ def prepare(self, corpus_dir, target_path, build_dir):
144143
subset_size = engine_common.random_choice(
145144
engine_common.CORPUS_SUBSET_NUM_TESTCASES)
146145

147-
if (not strategy_info.use_dataflow_tracing and
148-
strategy_pool.do_strategy(strategy.CORPUS_SUBSET_STRATEGY) and
146+
if (strategy_pool.do_strategy(strategy.CORPUS_SUBSET_STRATEGY) and
149147
shell.get_directory_file_count(corpus_dir) > subset_size):
150148
# Copy |subset_size| testcases into 'subset' directory.
151149
corpus_subset_dir = self._create_temp_corpus_dir('subset')
@@ -177,10 +175,10 @@ def prepare(self, corpus_dir, target_path, build_dir):
177175

178176
strategies = stats.process_strategies(
179177
strategy_info.fuzzing_strategies, name_modifier=lambda x: x)
180-
return LibFuzzerOptions(
181-
corpus_dir, arguments.list(), strategies,
182-
strategy_info.additional_corpus_dirs, strategy_info.extra_env,
183-
strategy_info.use_dataflow_tracing, strategy_info.is_mutations_run)
178+
return LibFuzzerOptions(corpus_dir, arguments.list(), strategies,
179+
strategy_info.additional_corpus_dirs,
180+
strategy_info.extra_env,
181+
strategy_info.is_mutations_run)
184182

185183
def _create_empty_testcase_file(self, reproducers_dir):
186184
"""Create an empty testcase file in temporary directory."""
@@ -271,7 +269,7 @@ def fuzz(self, target_path, options, reproducers_dir, max_time):
271269
A FuzzResult object.
272270
"""
273271
profiler.start_if_needed('libfuzzer_fuzz')
274-
libfuzzer.set_sanitizer_options(target_path, fuzz_options=options)
272+
libfuzzer.set_sanitizer_options(target_path)
275273
runner = libfuzzer.get_runner(target_path)
276274

277275
# Directory to place new units.

src/clusterfuzz/_internal/bot/fuzzers/libfuzzer.py

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
'arguments',
5454
'additional_corpus_dirs',
5555
'extra_env',
56-
'use_dataflow_tracing',
5756
'is_mutations_run',
5857
])
5958

@@ -63,9 +62,6 @@
6362
CRASH_TESTCASE_REGEX = (r'.*Test unit written to\s*'
6463
r'(.*(crash|oom|timeout|leak)-.*)')
6564

66-
# Currently matches oss-fuzz/infra/base-images/base-runner/collect_dft#L34.
67-
DATAFLOW_TRACE_DIR_SUFFIX = '_dft'
68-
6965
# List of all strategies that affect LD_PRELOAD.
7066
MUTATOR_STRATEGIES = [
7167
strategy.PEACH_GRAMMAR_MUTATION_STRATEGY.name,
@@ -1154,7 +1150,6 @@ def get_runner(fuzzer_path, temp_dir=None, use_minijail=None):
11541150
temp_dir = fuzzer_utils.get_temp_dir()
11551151

11561152
build_dir = environment.get_value('BUILD_DIR')
1157-
dataflow_build_dir = environment.get_value('DATAFLOW_BUILD_DIR')
11581153
is_android = environment.is_android()
11591154
is_fuchsia = environment.platform() == 'FUCHSIA'
11601155

@@ -1176,11 +1171,6 @@ def get_runner(fuzzer_path, temp_dir=None, use_minijail=None):
11761171
minijail_chroot.add_binding(
11771172
minijail.ChrootBinding(build_dir, build_dir, writeable=False))
11781173

1179-
if dataflow_build_dir:
1180-
minijail_chroot.add_binding(
1181-
minijail.ChrootBinding(
1182-
dataflow_build_dir, dataflow_build_dir, writeable=False))
1183-
11841174
# Also bind the build dir to /out to make it easier to hardcode references
11851175
# to data files.
11861176
minijail_chroot.add_binding(
@@ -1313,18 +1303,14 @@ def parse_log_stats(log_lines):
13131303
return log_stats
13141304

13151305

1316-
def set_sanitizer_options(fuzzer_path, fuzz_options=None):
1317-
"""Sets sanitizer options based on .options file overrides, FuzzOptions (if
1318-
provided), and what this script requires."""
1306+
def set_sanitizer_options(fuzzer_path):
1307+
"""Sets sanitizer options based on .options file overrides and what this
1308+
script requires."""
13191309
engine_common.process_sanitizer_options_overrides(fuzzer_path)
13201310
sanitizer_options_var = environment.get_current_memory_tool_var()
13211311
sanitizer_options = environment.get_memory_tool_options(
13221312
sanitizer_options_var, {})
13231313
sanitizer_options['exitcode'] = constants.TARGET_ERROR_EXITCODE
1324-
if fuzz_options and fuzz_options.use_dataflow_tracing:
1325-
# Focus function feature does not work without symbolization.
1326-
sanitizer_options['symbolize'] = 1
1327-
environment.update_symbolizer_options(sanitizer_options)
13281314
environment.set_memory_tool_options(sanitizer_options_var, sanitizer_options)
13291315

13301316

@@ -1424,7 +1410,6 @@ def pick_strategies(strategy_pool,
14241410
existing_arguments,
14251411
grammar=None):
14261412
"""Pick strategies."""
1427-
build_directory = environment.get_value('BUILD_DIR')
14281413
fuzzing_strategies = []
14291414
arguments = fuzzer_options.FuzzerArguments({})
14301415
additional_corpus_dirs = []
@@ -1435,24 +1420,6 @@ def pick_strategies(strategy_pool,
14351420
is_mutations_run = (not environment.is_ephemeral() and
14361421
candidate_generator != engine_common.Generator.NONE)
14371422

1438-
# Depends on the presense of DFSan instrumented build.
1439-
dataflow_build_dir = environment.get_value('DATAFLOW_BUILD_DIR')
1440-
use_dataflow_tracing = (
1441-
dataflow_build_dir and
1442-
strategy_pool.do_strategy(strategy.DATAFLOW_TRACING_STRATEGY))
1443-
if use_dataflow_tracing:
1444-
dataflow_binary_path = os.path.join(
1445-
dataflow_build_dir, os.path.relpath(fuzzer_path, build_directory))
1446-
dataflow_trace_dir = dataflow_binary_path + DATAFLOW_TRACE_DIR_SUFFIX
1447-
if os.path.exists(dataflow_trace_dir):
1448-
arguments[constants.DATA_FLOW_TRACE_FLAGNAME] = str(dataflow_trace_dir)
1449-
arguments[constants.FOCUS_FUNCTION_FLAGNAME] = 'auto'
1450-
fuzzing_strategies.append(strategy.DATAFLOW_TRACING_STRATEGY.name)
1451-
else:
1452-
logs.log_warn(
1453-
'Dataflow trace is not found in dataflow build, skipping strategy.')
1454-
use_dataflow_tracing = False
1455-
14561423
# Generate new testcase mutations using radamsa, etc.
14571424
if is_mutations_run:
14581425
new_testcase_mutations_directory = create_corpus_directory('mutations')
@@ -1476,8 +1443,7 @@ def pick_strategies(strategy_pool,
14761443
arguments[constants.VALUE_PROFILE_FLAGNAME] = 1
14771444
fuzzing_strategies.append(strategy.VALUE_PROFILE_STRATEGY.name)
14781445

1479-
if not use_dataflow_tracing and should_set_fork_flag(existing_arguments,
1480-
strategy_pool):
1446+
if should_set_fork_flag(existing_arguments, strategy_pool):
14811447
max_fuzz_threads = environment.get_value('MAX_FUZZ_THREADS', 1)
14821448
num_fuzz_processes = max(1, utils.cpu_count() // max_fuzz_threads)
14831449
arguments[constants.FORK_FLAGNAME] = num_fuzz_processes
@@ -1496,7 +1462,7 @@ def pick_strategies(strategy_pool,
14961462
fuzzing_strategies.append(strategy.USE_EXTRA_SANITIZERS_STRATEGY.name)
14971463

14981464
return StrategyInfo(fuzzing_strategies, arguments, additional_corpus_dirs,
1499-
extra_env, use_dataflow_tracing, is_mutations_run)
1465+
extra_env, is_mutations_run)
15001466

15011467

15021468
def should_set_fork_flag(existing_arguments, strategy_pool):

src/clusterfuzz/_internal/build_management/build_manager.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -494,9 +494,6 @@ def _unpack_build(self,
494494
return False
495495

496496
if unpack_everything:
497-
# Set a random fuzz target now that the build has been unpacked, if we
498-
# didn't set one earlier. For an auxiliary build, fuzz target is already
499-
# specified during main build unpacking.
500497
self._pick_fuzz_target(
501498
self._get_fuzz_targets_from_dir(build_dir), target_weights)
502499
else:

src/clusterfuzz/_internal/cron/project_setup.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -902,20 +902,6 @@ def _sync_job(self, project, info, corpus_bucket_name, quarantine_bucket_name,
902902

903903
create_pubsub_topics_for_queue_id(job.platform)
904904

905-
if (template.engine == 'libfuzzer' and
906-
template.architecture == 'x86_64' and
907-
'dataflow' in info.get('fuzzing_engines', DEFAULT_ENGINES)):
908-
# Dataflow binaries are built with dataflow sanitizer, but can be used
909-
# as an auxiliary build with libFuzzer builds (e.g. with ASan or UBSan).
910-
dataflow_build_bucket_path = self._get_build_bucket_path(
911-
project_name=project,
912-
info=info,
913-
engine='dataflow',
914-
memory_tool='dataflow',
915-
architecture=template.architecture)
916-
job.environment_string += (
917-
f'DATAFLOW_BUILD_BUCKET_PATH = {dataflow_build_bucket_path}\n')
918-
919905
if self._additional_vars:
920906
additional_vars = {}
921907
additional_vars.update(self._additional_vars.get('all', {}))
@@ -1088,7 +1074,6 @@ def main():
10881074
'honggfuzz': bucket_config.get('honggfuzz'),
10891075
'googlefuzztest': bucket_config.get('googlefuzztest'),
10901076
'none': bucket_config.get('no_engine'),
1091-
'dataflow': bucket_config.get('dataflow'),
10921077
'centipede': bucket_config.get('centipede'),
10931078
},
10941079
fuzzer_entities=fuzzer_entities,

src/clusterfuzz/_internal/fuzzing/strategy.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
# Supported fuzzing strategies.
3030
CORPUS_MUTATION_RADAMSA_STRATEGY = Strategy(
3131
name='corpus_mutations_radamsa', probability=0.15, manually_enable=False)
32-
DATAFLOW_TRACING_STRATEGY = Strategy(
33-
name='dataflow_tracing', probability=0.50, manually_enable=True)
3432
CORPUS_SUBSET_STRATEGY = Strategy(
3533
name='corpus_subset', probability=0.50, manually_enable=True)
3634
FORK_STRATEGY = Strategy(name='fork', probability=0.50, manually_enable=False)
@@ -51,7 +49,6 @@
5149
VALUE_PROFILE_STRATEGY,
5250
FORK_STRATEGY,
5351
CORPUS_SUBSET_STRATEGY,
54-
DATAFLOW_TRACING_STRATEGY,
5552
PEACH_GRAMMAR_MUTATION_STRATEGY,
5653
USE_EXTRA_SANITIZERS_STRATEGY,
5754
]
@@ -81,7 +78,6 @@
8178

8279
LIBFUZZER_STRATEGIES_WITH_BOOLEAN_VALUE = [
8380
CORPUS_MUTATION_RADAMSA_STRATEGY,
84-
DATAFLOW_TRACING_STRATEGY,
8581
RANDOM_MAX_LENGTH_STRATEGY,
8682
VALUE_PROFILE_STRATEGY,
8783
USE_EXTRA_SANITIZERS_STRATEGY,

src/clusterfuzz/_internal/metrics/fuzzer_stats_schema.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,6 @@
193193
'mode': 'NULLABLE',
194194
'name': 'strategy_corpus_subset',
195195
'type': 'INTEGER'
196-
}, {
197-
'mode': 'NULLABLE',
198-
'name': 'strategy_dataflow_tracing',
199-
'type': 'INTEGER'
200196
}, {
201197
'mode': 'NULLABLE',
202198
'name': 'number_of_executed_units',

src/clusterfuzz/_internal/tests/appengine/handlers/cron/project_setup_test.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,6 @@ def setUp(self):
205205
'build_buckets': {
206206
'afl': 'clusterfuzz-builds-afl',
207207
'centipede': 'clusterfuzz-builds-centipede',
208-
'dataflow': 'clusterfuzz-builds-dataflow',
209208
'honggfuzz': 'clusterfuzz-builds-honggfuzz',
210209
'libfuzzer': 'clusterfuzz-builds',
211210
'libfuzzer_i386': 'clusterfuzz-builds-i386',
@@ -288,8 +287,8 @@ def test_execute(self):
288287
}),
289288
('lib6', {
290289
'homepage': 'http://example6.com',
291-
'sanitizers': ['address', 'dataflow', 'memory', 'undefined'],
292-
'fuzzing_engines': ['libfuzzer', 'afl', 'dataflow'],
290+
'sanitizers': ['address', 'memory', 'undefined'],
291+
'fuzzing_engines': ['libfuzzer', 'afl'],
293292
'auto_ccs': '[email protected]',
294293
'vendor_ccs': ['[email protected]', '[email protected]'],
295294
}),
@@ -509,9 +508,7 @@ def test_execute(self):
509508
'QUARANTINE_BUCKET = lib6-quarantine.clusterfuzz-external.appspot.com\n'
510509
'BACKUP_BUCKET = lib6-backup.clusterfuzz-external.appspot.com\n'
511510
'AUTOMATIC_LABELS = Proj-lib6,Engine-libfuzzer\n'
512-
'FILE_GITHUB_ISSUE = False\n'
513-
'DATAFLOW_BUILD_BUCKET_PATH = '
514-
'gs://clusterfuzz-builds-dataflow/lib6/lib6-dataflow-([0-9]+).zip\n')
511+
'FILE_GITHUB_ISSUE = False\n')
515512

516513
job = data_types.Job.query(
517514
data_types.Job.name == 'libfuzzer_asan_lib7').get()
@@ -1793,7 +1790,6 @@ def setUp(self):
17931790
'experimental_sanitizers': ['memory'],
17941791
'build_buckets': {
17951792
'afl': 'clusterfuzz-builds-afl',
1796-
'dataflow': 'clusterfuzz-builds-dataflow',
17971793
'honggfuzz': 'clusterfuzz-builds-honggfuzz',
17981794
'googlefuzztest': 'clusterfuzz-builds-googlefuzztest',
17991795
'libfuzzer': 'clusterfuzz-builds',
@@ -1829,7 +1825,6 @@ def setUp(self):
18291825
'build_type': 'FUZZ_TARGET_BUILD_BUCKET_PATH',
18301826
'build_buckets': {
18311827
'afl': 'clusterfuzz-builds-afl-dbg',
1832-
'dataflow': 'clusterfuzz-builds-dataflow-dbg',
18331828
'honggfuzz': 'clusterfuzz-builds-honggfuzz-dbg',
18341829
'googlefuzztest': 'clusterfuzz-builds-googlefuzztest-dbg',
18351830
'libfuzzer': 'clusterfuzz-builds-dbg',

src/clusterfuzz/_internal/tests/core/bot/fuzzers/libFuzzer/engine_test.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ def setUp(self):
9191
}),
9292
additional_corpus_dirs=['/new_corpus_dir'],
9393
extra_env={'extra_env': '1'},
94-
use_dataflow_tracing=False,
9594
is_mutations_run=True)
9695

9796
def test_prepare(self):
@@ -111,7 +110,6 @@ def test_prepare(self):
111110
self.assertCountEqual(['/new_corpus_dir', '/corpus_dir'],
112111
options.fuzz_corpus_dirs)
113112
self.assertDictEqual({'extra_env': '1'}, options.extra_env)
114-
self.assertFalse(options.use_dataflow_tracing)
115113
self.assertTrue(options.is_mutations_run)
116114

117115
self.mock.unpack_seed_corpus_if_needed.assert_called_with(
@@ -157,7 +155,6 @@ def test_no_mutations(self):
157155
strategies=[],
158156
fuzz_corpus_dirs=[],
159157
extra_env={},
160-
use_dataflow_tracing=False,
161158
is_mutations_run=False)
162159
self.assertEqual(1800.0,
163160
engine_impl.fuzz_additional_processing_timeout(options))
@@ -171,7 +168,6 @@ def test_mutations(self):
171168
strategies=[],
172169
fuzz_corpus_dirs=[],
173170
extra_env={},
174-
use_dataflow_tracing=False,
175171
is_mutations_run=True)
176172
self.assertEqual(2400.0,
177173
engine_impl.fuzz_additional_processing_timeout(options))
@@ -249,7 +245,7 @@ def test_fuzz(self):
249245
'-dict=blah.dict',
250246
'-max_len=9001',
251247
'-use_value_profile=1',
252-
], [], ['/corpus'], {}, False, False)
248+
], [], ['/corpus'], {}, False)
253249

254250
with open(os.path.join(TEST_DIR, 'crash.txt'), encoding='utf-8') as f:
255251
fuzz_output = f.read()
@@ -383,7 +379,6 @@ def mock_merge(*args, **kwargs): # pylint: disable=unused-argument
383379
'startup_crash_count': 0,
384380
'strategy_corpus_mutations_radamsa': 0,
385381
'strategy_corpus_subset': 0,
386-
'strategy_dataflow_tracing': 0,
387382
'strategy_extra_sanitizers': 0,
388383
'strategy_fork': 0,
389384
'strategy_peach_grammar_mutation': '',

src/clusterfuzz/_internal/tests/core/bot/fuzzers/libFuzzer/libfuzzer_stats_test.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ def test_parse_log(self):
9393
'slow_unit_count': 0,
9494
'slow_units_count': 0,
9595
'startup_crash_count': 0,
96-
'strategy_dataflow_tracing': 0,
9796
'strategy_extra_sanitizers': 0,
9897
'strategy_corpus_mutations_radamsa': 1,
9998
'strategy_corpus_subset': 50,

0 commit comments

Comments
 (0)