internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: google/clusterfuzz

Issue:
Support a fallback component for unreproducible bugs.



Discussion:

Resolving patch:
diff --git a/src/appengine/libs/issue_management/issue_filer.py b/src/appengine/libs/issue_management/issue_filer.py
--- a/src/appengine/libs/issue_management/issue_filer.py
+++ b/src/appengine/libs/issue_management/issue_filer.py
@@ -415,6 +415,9 @@ def file_issue(testcase,
   for component in metadata_components:
     issue.components.add(component)
 
+  if testcase.one_time_crasher_flag and policy.unreproducible_component:
+    issue.components.add(policy.unreproducible_component)
+
   issue.reporter = user_email
   issue.save()
 
diff --git a/src/appengine/libs/issue_management/issue_tracker_policy.py b/src/appengine/libs/issue_management/issue_tracker_policy.py
--- a/src/appengine/libs/issue_management/issue_tracker_policy.py
+++ b/src/appengine/libs/issue_management/issue_tracker_policy.py
@@ -89,9 +89,14 @@ def substitution_mapping(self, label):
 
   @property
   def deadline_policy_message(self):
-    """Get the deadline policy message, if if exists."""
+    """Get the deadline policy message, if it exists."""
     return self._data.get('deadline_policy_message')
 
+  @property
+  def unreproducible_component(self):
+    """Get the component for unreproducible bugs, if it exists."""
+    return self._data.get('unreproducible_component')
+
   def get_new_issue_properties(self, is_security, is_crash):
     """Get the properties to apply to a new issue."""
     policy = NewIssuePolicy()


Test patch:
diff --git a/src/python/tests/appengine/libs/issue_filer_test.py b/src/python/tests/appengine/libs/issue_filer_test.py
--- a/src/python/tests/appengine/libs/issue_filer_test.py
+++ b/src/python/tests/appengine/libs/issue_filer_test.py
@@ -73,7 +73,8 @@
     },
     'existing': {
         'labels': ['Stability-%SANITIZER%']
-    }
+    },
+    'unreproducible_component': 'Unreproducible>Component'
 })
 
 OSS_FUZZ_POLICY = issue_tracker_policy.IssueTrackerPolicy({
@@ -489,6 +490,8 @@ def test_reproducible_flag(self):
     self.testcase1.put()
     issue_filer.file_issue(self.testcase1, issue_tracker)
     self.assertIn('Unreproducible', issue_tracker._itm.last_issue.labels)
+    self.assertCountEqual(['Unreproducible>Component'],
+                          issue_tracker._itm.last_issue.components)
 
     self.testcase1.one_time_crasher_flag = False
     self.testcase1.put()
Repository: google/clusterfuzz

Issue:
attach issue filing exception/error to testcase



Discussion:

Resolving patch:
diff --git a/src/appengine/handlers/cron/triage.py b/src/appengine/handlers/cron/triage.py
--- a/src/appengine/handlers/cron/triage.py
+++ b/src/appengine/handlers/cron/triage.py
@@ -324,8 +324,11 @@ def get(self):
       # File the bug first and then create filed bug metadata.
       try:
         issue_filer.file_issue(testcase, issue_tracker)
-      except Exception:
+      except Exception as e:
         logs.log_error('Failed to file issue for testcase %d.' % testcase_id)
+        _add_triage_message(testcase,
+                            f'Failed to file issue due to exception: {str(e)}')
+
         continue
 
       _create_filed_bug_metadata(testcase)


Test patch:
Repository: google/clusterfuzz

Issue:
Investigate GitHub login



Discussion:

Resolving patch:
diff --git a/src/appengine/libs/auth.py b/src/appengine/libs/auth.py
--- a/src/appengine/libs/auth.py
+++ b/src/appengine/libs/auth.py
@@ -154,7 +154,21 @@ def get_current_user():
     logs.log_warn('Invalid session cookie.')
     return None
 
-  if not decoded_claims.get('email_verified'):
+  allowed_firebase_providers = local_config.ProjectConfig().get(
+      'firebase.auth_providers', ['google.com'])
+  firebase_info = decoded_claims.get('firebase', {})
+  sign_in_provider = firebase_info.get('sign_in_provider')
+
+  if sign_in_provider not in allowed_firebase_providers:
+    logs.log_error(f'Firebase provider {sign_in_provider} is not enabled.')
+    return None
+
+  # Per https://docs.github.com/en/authentication/
+  #       keeping-your-account-and-data-secure/authorizing-oauth-apps
+  # GitHub requires emails to be verified before an OAuth app can be
+  # authorized, so we make an exception.
+  if (not decoded_claims.get('email_verified') and
+      sign_in_provider != 'github.com'):
     return None
 
   email = decoded_claims.get('email')
diff --git a/src/appengine/libs/csp.py b/src/appengine/libs/csp.py
--- a/src/appengine/libs/csp.py
+++ b/src/appengine/libs/csp.py
@@ -92,6 +92,7 @@ def get_default_builder():
   builder.add('img-src', 'www.gstatic.com')
   builder.add('connect-src', 'securetoken.googleapis.com')
   builder.add('connect-src', 'www.googleapis.com')
+  builder.add('connect-src', 'identitytoolkit.googleapis.com')
   builder.add('frame-src', auth.auth_domain())
 
   # External style. Used for fonts, charting libraries.


Test patch:
diff --git a/configs/test/project.yaml b/configs/test/project.yaml
--- a/configs/test/project.yaml
+++ b/configs/test/project.yaml
@@ -46,6 +46,10 @@ firebase:
   # API key for Firebase (public).
   api_key: firebase-api-key
   # auth_domain: login.custom-domain.com
+  auth_providers:
+  - google.com
+  # - github.com
+
 
 stacktrace:
   # Stack frames to ignore when determining the crash signature.
Repository: google/clusterfuzz

Issue:
Google OAuth2 during setup is no longer operable (redirect_uri: urn:ietf:wg:oauth:2.0:oob)
When going through production setup on a new instance, I get to this step:

$ python butler.py create_config --oauth-client-secrets-path=$CLIENT_SECRETS_PATH   --firebase-api-key=$FIREBASE_API_KEY --project-id=$CLOUD_PROJECT_ID $CONFIG_DIR
...
Please visit this URL to authorize this application: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=5xxx.....

Visiting that site generates a 400 error: 

| Error 400: invalid_request
| You can't sign in to this app because it doesn't comply with Google's OAuth 2.0 policy for keeping apps secure.


The error appears related to this, https://developers.googleblog.com/2022/02/making-oauth-flows-safer.html#instructions-oob which shows that from Feb 28th, 2022 and new OAuth flows related to the OOB will be blocked.




Discussion:
Thanks for flagging this! We'll take a look at updating the instructions here. 

Resolving patch:
diff --git a/src/local/butler/create_config.py b/src/local/butler/create_config.py
--- a/src/local/butler/create_config.py
+++ b/src/local/butler/create_config.py
@@ -19,9 +19,9 @@
 import subprocess
 import sys
 
+import google_auth_httplib2
 from google_auth_oauthlib.flow import InstalledAppFlow
 from googleapiclient import discovery
-import google_auth_httplib2
 import httplib2
 
 from local.butler import appengine
@@ -70,7 +70,7 @@ def __init__(self, oauth_client_secrets_path):
     flow = InstalledAppFlow.from_client_secrets_file(
         oauth_client_secrets_path,
         scopes=['https://www.googleapis.com/auth/siteverification'])
-    credentials = flow.run_console()
+    credentials = flow.run_local_server()
 
     http = google_auth_httplib2.AuthorizedHttp(
         credentials, http=httplib2.Http())
@@ -140,7 +140,7 @@ def enable_services(gcloud):
 
 def replace_file_contents(file_path, replacements):
   """Replace contents of a file."""
-  with open(file_path) as f:
+  with open(file_path, encoding='utf-8') as f:
     old_contents = f.read()
     contents = old_contents
     for find, replace in replacements:
@@ -149,14 +149,13 @@ def replace_file_contents(file_path, replacements):
   if contents == old_contents:
     return
 
-  with open(file_path, 'w') as f:
+  with open(file_path, 'w', encoding='utf-8') as f:
     f.write(contents)
 
 
 def project_bucket(project_id, bucket_name):
   """Return a project-specific bucket name."""
-  return '{name}.{project_id}.appspot.com'.format(
-      name=bucket_name, project_id=project_id)
+  return f'{bucket_name}.{project_id}.appspot.com'
 
 
 def create_new_config(gcloud, project_id, new_config_dir,


Test patch:
Repository: google/clusterfuzz

Issue:
Add stacktrace parsing patterns for Jazzer hooking framework issues. 



Discussion:
@Navidem putting this in your queue. 
e.g. on https://oss-fuzz.com/testcase-detail/4854085561483264

Rather than "Uncaught exception", we'd like this to surface as "Remote Code Execution" with security flag=True. 
Another example: https://oss-fuzz.com/testcase-detail/4815566107443200

Perhaps we can just take the string right after "FuzzerSecurityIssue*:" as the crash type here. 

Resolving patch:
diff --git a/src/clusterfuzz/stacktraces/__init__.py b/src/clusterfuzz/stacktraces/__init__.py
--- a/src/clusterfuzz/stacktraces/__init__.py
+++ b/src/clusterfuzz/stacktraces/__init__.py
@@ -903,6 +903,12 @@ def parse(self, stacktrace: str) -> CrashInfo:
             address_from_group=1)
 
         if self.update_state_on_match(
+            JAZZER_JAVA_SECURITY_EXCEPTION_REGEX,
+            line,
+            state,
+            new_type='Security exception'):
+          state.found_java_exception = True
+        elif self.update_state_on_match(
             JAZZER_JAVA_EXCEPTION_REGEX,
             line,
             state,
@@ -1164,7 +1170,10 @@ def parse(self, stacktrace: str) -> CrashInfo:
 
       if state.found_java_exception:
         if (state.crash_type in [
-            'CHECK failure', 'Fatal Exception', 'Uncaught exception'
+            'CHECK failure',
+            'Fatal Exception',
+            'Uncaught exception',
+            'Security exception',
         ]):
           self.add_frame_on_match(
               JAVA_EXCEPTION_CRASH_STATE_REGEX, line, state, group=1)
diff --git a/src/clusterfuzz/stacktraces/constants.py b/src/clusterfuzz/stacktraces/constants.py
--- a/src/clusterfuzz/stacktraces/constants.py
+++ b/src/clusterfuzz/stacktraces/constants.py
@@ -109,6 +109,8 @@
 HWASAN_ALLOCATION_TAIL_OVERWRITTEN_ADDRESS_REGEX = re.compile(
     r'.*ERROR: HWAddressSanitizer: allocation-tail-overwritten; '
     r'heap object \[([xX0-9a-fA-F]+),.*of size')
+JAZZER_JAVA_SECURITY_EXCEPTION_REGEX = re.compile(
+    '== Java Exception: .*FuzzerSecurityIssue')
 JAZZER_JAVA_EXCEPTION_REGEX = re.compile('== Java Exception: .*')
 JAVA_EXCEPTION_CRASH_STATE_REGEX = re.compile(r'\s*at (.*)\(.*\)')
 KERNEL_BUG = re.compile(r'kernel BUG at (.*)')


Test patch:
diff --git a/src/clusterfuzz/_internal/tests/core/crash_analysis/stack_parsing/stack_analyzer_test.py b/src/clusterfuzz/_internal/tests/core/crash_analysis/stack_parsing/stack_analyzer_test.py
--- a/src/clusterfuzz/_internal/tests/core/crash_analysis/stack_parsing/stack_analyzer_test.py
+++ b/src/clusterfuzz/_internal/tests/core/crash_analysis/stack_parsing/stack_analyzer_test.py
@@ -549,7 +549,7 @@ def test_java_exception(self):
   def test_java_manual_security_exception(self):
     """Tests for Java exceptions manually marked as security issues."""
     data = self._read_test_data('java_severity_medium_exception.txt')
-    expected_type = 'Uncaught exception'
+    expected_type = 'Security exception'
     expected_address = ''
     expected_state = ('com.example.JsonSanitizerFuzzer.fuzzerTestOneInput\n'
                       'com.google.gson.Gson.fromJson\n'
Repository: google/clusterfuzz

Issue:
Handle reproducing testcases where the FuzzTarget has been garbage collected
This: https://github.com/google/clusterfuzz/blob/63a987ca1f37eaae31b0aa4ba9cab55f4d35e588/src/clusterfuzz/_internal/datastore/data_types.py#L720

will lead to an exception otherwise. We should synthesize a FuzzTarget object here if it does not exist so we can continue.


Discussion:

Resolving patch:
diff --git a/src/clusterfuzz/_internal/datastore/data_types.py b/src/clusterfuzz/_internal/datastore/data_types.py
--- a/src/clusterfuzz/_internal/datastore/data_types.py
+++ b/src/clusterfuzz/_internal/datastore/data_types.py
@@ -718,6 +718,15 @@ def get_fuzz_target(self):
       return None
 
     target = ndb.Key(FuzzTarget, name).get()
+    if not target:
+      binary = self.get_metadata('fuzzer_binary_name')
+      if not binary:
+        # Not applicable.
+        return None
+
+      target = FuzzTarget(
+          engine=self.fuzzer_name, project=self.project_name, binary=binary)
+
     if environment.get_value('ORIGINAL_JOB_NAME'):
       # Overridden engine (e.g. for minimization).
       target.engine = environment.get_engine_for_job()


Test patch:
diff --git a/src/clusterfuzz/_internal/tests/core/datastore/data_types_test.py b/src/clusterfuzz/_internal/tests/core/datastore/data_types_test.py
--- a/src/clusterfuzz/_internal/tests/core/datastore/data_types_test.py
+++ b/src/clusterfuzz/_internal/tests/core/datastore/data_types_test.py
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 """data_types tests."""
+# pylint: disable=protected-access
 import unittest
 
 from clusterfuzz._internal.datastore import data_types
@@ -148,3 +149,37 @@ def test_project_with_special_chars(self):
         'afl_third_party-aspell-aspell_5_aspell_fuzzer',
         data_types.fuzz_target_fully_qualified_name(
             'afl', 'third_party:aspell:aspell_5', 'aspell_fuzzer'))
+
+
+@test_utils.with_cloud_emulators('datastore')
+class GetFuzzTargetTest(unittest.TestCase):
+  """Test get_fuzz_target()."""
+
+  def setUp(self):
+    self.testcase = data_types.Testcase(
+        overridden_fuzzer_name='libFuzzer_proj_test')
+    self.testcase.put()
+
+  def test_exists_in_datastore(self):
+    """Test when the FuzzTarget exists."""
+    data_types.FuzzTarget(
+        engine='libFuzzer', project='proj', binary='test').put()
+    self.assertEqual({
+        'binary': 'test',
+        'engine': 'libFuzzer',
+        'project': 'proj'
+    },
+                     self.testcase.get_fuzz_target()._to_dict())
+
+  def test_not_exists_in_datastore(self):
+    """Test when the FuzzTarget doesn't exist."""
+    self.testcase.project_name = 'proj'
+    self.testcase.fuzzer_name = 'libFuzzer'
+    self.testcase.set_metadata('fuzzer_binary_name', 'test')
+
+    self.assertEqual({
+        'binary': 'test',
+        'engine': 'libFuzzer',
+        'project': 'proj'
+    },
+                     self.testcase.get_fuzz_target()._to_dict())
Repository: google/clusterfuzz

Issue:
Tolerate empty primary_contact in project setup
```
Traceback (most recent call last):
  File "/srv/handlers/base_handler.py", line 277, in dispatch_request
    return super(Handler, self).dispatch_request(*args, **kwargs)
  File "/layers/google.python.pip/pip/lib/python3.7/site-packages/flask/views.py", line 163, in dispatch_request
    return meth(*args, **kwargs)
  File "/srv/libs/handler.py", line 100, in wrapper
    result = func(self)
  File "/srv/handlers/cron/project_setup.py", line 1052, in get
    result = config.set_up(projects)
  File "/srv/handlers/cron/project_setup.py", line 942, in set_up
    self.sync_user_permissions(project, info)
  File "/srv/handlers/cron/project_setup.py", line 883, in sync_user_permissions
    ccs = ccs_from_info(info)
  File "/srv/handlers/cron/project_setup.py", line 445, in ccs_from_info
    ccs.extend(_get_ccs('primary_contact', allow_list=False))
  File "/srv/handlers/cron/project_setup.py", line 442, in _get_ccs
    raise ProjectSetupError(f'Bad value for field {field_name}: {field_value}.')
handlers.cron.project_setup.ProjectSetupError: Bad value for field primary_contact: None.
```


Discussion:

Resolving patch:
diff --git a/src/appengine/handlers/cron/project_setup.py b/src/appengine/handlers/cron/project_setup.py
--- a/src/appengine/handlers/cron/project_setup.py
+++ b/src/appengine/handlers/cron/project_setup.py
@@ -438,6 +438,8 @@ def _get_ccs(field_name, allow_list=True):
       return field_value
     if isinstance(field_value, str):
       return [field_value]
+    if field_value is None:
+      return []
 
     raise ProjectSetupError(f'Bad value for field {field_name}: {field_value}.')
 


Test patch:
diff --git a/src/clusterfuzz/_internal/tests/appengine/handlers/cron/project_setup_test.py b/src/clusterfuzz/_internal/tests/appengine/handlers/cron/project_setup_test.py
--- a/src/clusterfuzz/_internal/tests/appengine/handlers/cron/project_setup_test.py
+++ b/src/clusterfuzz/_internal/tests/appengine/handlers/cron/project_setup_test.py
@@ -244,6 +244,7 @@ def test_execute(self):
                 'User@example.com',
                 'user2@googlemail.com',
             ],
+            'vendor_ccs': None,
         }),
         ('lib2', {
             'homepage': 'http://example2.com',
Repository: google/clusterfuzz

Issue:
cleanup: Support a "ClusterFuzz-Good" label
Currently if CF attempted to close a bug in the past, and we re-opened it, we won't do it again. This is guarded by this logic here:

https://github.com/google/clusterfuzz/blob/7dc72bc4feceff5effb6edf419ed4f246657db93/src/appengine/handlers/cron/cleanup.py#L447

In some rare cases we need to re-enable automatic testcase closing even if we had previously undid this in the past. We need to support a way to override this. 




Discussion:

Resolving patch:
diff --git a/src/appengine/handlers/cron/cleanup.py b/src/appengine/handlers/cron/cleanup.py
--- a/src/appengine/handlers/cron/cleanup.py
+++ b/src/appengine/handlers/cron/cleanup.py
@@ -443,7 +443,15 @@ def mark_issue_as_closed_if_testcase_is_fixed(policy, testcase, issue):
   # As a last check, do the expensive call of actually checking all issue
   # comments to make sure we didn't do the verification already and we didn't
   # get called out on issue mistriage.
-  if (issue_tracker_utils.was_label_added(issue, verified_label) or
+  # If a "good" label was set, we ignore past "verified" flipping.
+  good_label = policy.label('good')
+  if good_label and good_label in issue.labels:
+    was_verified_added = verified_label in issue.labels
+  else:
+    was_verified_added = issue_tracker_utils.was_label_added(
+        issue, verified_label)
+
+  if (was_verified_added or
       issue_tracker_utils.was_label_added(issue, policy.label('wrong'))):
     return
 


Test patch:
Repository: google/clusterfuzz

Issue:
ClusterFuzz is not providing corpus download link for Java fuzzing
Example: in this [report](https://clusterfuzz.corp.google.com/fuzzer-stats?group_by=by-day&project=//javatests/com/google/security/zatar/spiffe&fuzzer=libFuzzer_javatests-com-google-security-zatar-spiffe_SpiffeIdFuzzer) column `corpus_backup` is empty.


Discussion:
We have to enable pruning for `nosanitizer` jobs.

Resolving patch:
diff --git a/src/appengine/handlers/cron/project_setup.py b/src/appengine/handlers/cron/project_setup.py
--- a/src/appengine/handlers/cron/project_setup.py
+++ b/src/appengine/handlers/cron/project_setup.py
@@ -141,11 +141,11 @@ def job_name(self, project_name, config_suffix):
                              ['centipede', 'engine_asan'])
 
 LIBFUZZER_NONE_JOB = JobInfo('libfuzzer_nosanitizer_', 'libfuzzer', 'none',
-                             ['libfuzzer'])
+                             ['libfuzzer', 'prune'])
 LIBFUZZER_NONE_I386_JOB = JobInfo(
     'libfuzzer_nosanitizer_i386_',
     'libfuzzer',
-    'none', ['libfuzzer'],
+    'none', ['libfuzzer', 'prune'],
     architecture='i386')
 
 JOB_MAP = {


Test patch:
diff --git a/src/clusterfuzz/_internal/tests/appengine/handlers/cron/project_setup_test.py b/src/clusterfuzz/_internal/tests/appengine/handlers/cron/project_setup_test.py
--- a/src/clusterfuzz/_internal/tests/appengine/handlers/cron/project_setup_test.py
+++ b/src/clusterfuzz/_internal/tests/appengine/handlers/cron/project_setup_test.py
@@ -1992,7 +1992,7 @@ def test_execute(self):
         'BOOL_VAR = True\n'
         'INT_VAR = 0\n'
         'STRING_VAR = VAL\n', job.environment_string)
-    self.assertCountEqual(['libfuzzer'], job.templates)
+    self.assertCountEqual(['libfuzzer', 'prune'], job.templates)
     self.assertEqual(None, job.external_reproduction_topic)
     self.assertEqual(None, job.external_updates_subscription)
     self.assertFalse(job.is_external())
Repository: google/clusterfuzz

Issue:
Make Centipede handle custom ASAN options that libFuzzer supports
See https://bugs.chromium.org/p/chromium/issues/detail?id=1451080#c4


Discussion:

Resolving patch:
diff --git a/src/clusterfuzz/_internal/bot/fuzzers/centipede/engine.py b/src/clusterfuzz/_internal/bot/fuzzers/centipede/engine.py
--- a/src/clusterfuzz/_internal/bot/fuzzers/centipede/engine.py
+++ b/src/clusterfuzz/_internal/bot/fuzzers/centipede/engine.py
@@ -72,6 +72,15 @@ def _get_reproducer_path(log, reproducers_dir):
   return crash_path
 
 
+def _set_sanitizer_options(fuzzer_path):
+  """Sets sanitizer options based on .options file overrides."""
+  engine_common.process_sanitizer_options_overrides(fuzzer_path)
+  sanitizer_options_var = environment.get_current_memory_tool_var()
+  sanitizer_options = environment.get_memory_tool_options(
+      sanitizer_options_var, {})
+  environment.set_memory_tool_options(sanitizer_options_var, sanitizer_options)
+
+
 class Engine(engine.Engine):
   """Centipede engine implementation."""
 
@@ -188,6 +197,7 @@ def fuzz(self, target_path, options, reproducers_dir, max_time):  # pylint: disa
       A FuzzResult object.
     """
     runner = _get_runner(target_path)
+    _set_sanitizer_options(target_path)
     timeout = max_time + _CLEAN_EXIT_SECS
     fuzz_result = runner.run_and_wait(
         additional_args=options.arguments, timeout=timeout)
@@ -232,6 +242,7 @@ def reproduce(self, target_path, input_path, arguments, max_time):  # pylint: di
     Returns:
       A ReproduceResult.
     """
+    _set_sanitizer_options(target_path)
     target_binaries = self._get_binary_paths(target_path)
     sanitized_target = str(target_binaries.sanitized)
 


Test patch:
diff --git a/src/clusterfuzz/_internal/tests/core/bot/fuzzers/centipede/centipede_engine_test.py b/src/clusterfuzz/_internal/tests/core/bot/fuzzers/centipede/centipede_engine_test.py
--- a/src/clusterfuzz/_internal/tests/core/bot/fuzzers/centipede/centipede_engine_test.py
+++ b/src/clusterfuzz/_internal/tests/core/bot/fuzzers/centipede/centipede_engine_test.py
@@ -116,6 +116,7 @@ def setUp(self):
     self.mock.getpid.return_value = 1337
     test_helpers.patch_environ(self)
     os.environ['BUILD_DIR'] = str(self.test_paths.data)
+    os.environ['JOB_NAME'] = 'centipede_asan_job'
 
   def compare_arguments(self, expected, actual):
     """Compares expected arguments."""
Repository: google/clusterfuzz

Issue:
Please revert/fix/or finish https://github.com/google/clusterfuzz/commit/b38691b82ea080c2309588a72f797609779c3de5
It's the most common error on ClusterFuzz. As far as I can tell it happens all the time for libFuzzer jobs.
@letitz I think you authored it, could you please look into this.


Discussion:
Most importantly though, it's making it harder to diagnose actually misbehaving jobs.
Looking into b38691b82ea080c2309588a72f797609779c3de5
I see two versions of the issue in the most recent samples: https://console.cloud.google.com/errors/detail/CLuEsY-G8c3aaA;service=;version=?project=google.com:clusterfuzz

> Could not find app '' in search directories.
> Could not find app 'd8.exe' in search directories.

I can certainly ignore the error when the app name is empty, that's just silly. Missing `d8.exe` might be pointing to a real error though?

Resolving patch:
diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py
--- a/src/clusterfuzz/_internal/build_management/build_manager.py
+++ b/src/clusterfuzz/_internal/build_management/build_manager.py
@@ -398,7 +398,7 @@ def set_env_var(name, value):
           llvm_symbolizer_path = os.path.join(root, llvm_symbolizer_filename)
           set_env_var('LLVM_SYMBOLIZER_PATH', llvm_symbolizer_path)
 
-  if not absolute_file_path:
+  if app_name and not absolute_file_path:
     logs.log_error(f'Could not find app {app_name!r} in search directories.')
 
 


Test patch: