Skip to content

Commit 2a46a7d

Browse files
chore(ci_visibility): avoid len() in code coverage methods (#14092)
Avoid an infinite recursion where [a test](https://github.com/DataDog/dd-trace-py/blob/v3.10.2/tests/appsec/appsec/test_common_modules.py#L83) patches `len()`, which is used by code coverage, which calls the instrumented patched `len()`, which calls code coverage, and so on. This solves the problem for `len` in particular, but ideally we would like to be more robust against patching things that are used by the tracer, or at least detecting that this happened and gracefully return. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [ ] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)
1 parent 13edc22 commit 2a46a7d

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

ddtrace/internal/test_visibility/coverage_lines.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ def _num_lines(self) -> int:
4141
def add(self, line_number: int):
4242
lines_byte = line_number // 8
4343

44-
if lines_byte >= len(self._lines):
45-
self._lines.extend(bytearray(lines_byte - len(self._lines) + 1))
44+
if lines_byte >= self._lines.__len__():
45+
self._lines.extend(bytearray(lines_byte - self._lines.__len__() + 1))
4646

4747
# DEV this fun bit allows us to trick ourselves into little-endianness, which is what the backend wants to see
4848
# in bytes
@@ -62,8 +62,8 @@ def to_sorted_list(self) -> t.List[int]:
6262

6363
def update(self, other: "CoverageLines"):
6464
# Extend our lines if the other coverage has more lines
65-
if len(other._lines) > len(self._lines):
66-
self._lines.extend(bytearray(len(other._lines) - len(self._lines)))
65+
if other._lines.__len__() > self._lines.__len__():
66+
self._lines.extend(bytearray(other._lines.__len__() - self._lines.__len__()))
6767

6868
for _byte_idx, _byte in enumerate(other._lines):
6969
self._lines[_byte_idx] |= _byte

0 commit comments

Comments
 (0)