Skip to content

Conversation

@guan404ming
Copy link
Member

Why

ArrayObj::operator[] and ArrayObj::SetItem were missing negative index validation, causing undefined behavior when accessing arrays with negative indices.

How

  • Add i < 0 check to ArrayObj::operator[] and ArrayObj::SetItem bounds validation
  • Add test case

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @guan404ming, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses a critical vulnerability in the ArrayObj class by implementing robust bounds checking for negative indices in its access and modification methods. Previously, attempting to use negative indices could lead to undefined behavior. The changes ensure that such operations now correctly throw an IndexError, enhancing the stability and predictability of array manipulations.

Highlights

  • Negative Index Validation: Added a bounds check for negative indices in ArrayObj::operator[] and ArrayObj::SetItem to prevent undefined behavior.
  • New Test Case: Introduced a new test case, NegativeIndexThrows, to verify that accessing or setting array elements with negative indices correctly throws an IndexError.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request correctly adds the missing negative index bounds check in ArrayObj::operator[] and ArrayObj::SetItem. The change itself is correct and addresses a potential source of undefined behavior.

However, the accompanying test case in tests/cpp/test_array.cc does not actually test the modified code in ArrayObj. The test uses Array<T>::operator[] and Array<T>::Set, which have their own bounds checks that already handle negative indices. These wrapper methods do not delegate the check to the ArrayObj methods that were fixed.

I've provided a suggestion to update the test to directly target the changed methods in ArrayObj, ensuring the fix is properly verified.

Comment on lines 295 to 344
TEST(Array, NegativeIndexThrows) {
Array<int> arr = {1, 2, 3};
EXPECT_THROW(
{
try {
[[maybe_unused]] int val = arr[-1];
} catch (const Error& error) {
EXPECT_EQ(error.kind(), "IndexError");
throw;
}
},
::tvm::ffi::Error);

EXPECT_THROW(
{
try {
arr.Set(-1, 42);
} catch (const Error& error) {
EXPECT_EQ(error.kind(), "IndexError");
throw;
}
},
::tvm::ffi::Error);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

high

The current test case for negative indices exercises Array<T>::operator[] and Array<T>::Set. These methods have their own bounds checking, which already included negative index validation. Therefore, this test passes even without the fixes in ArrayObj and doesn't verify the changes made in this PR.

To ensure the fix is correctly tested, the test should directly call the modified methods on ArrayObj. The suggested change below targets ArrayObj::at (which calls operator[]) and ArrayObj::SetItem to properly validate the new bounds checks.

TEST(Array, NegativeIndexThrows) {
  Array<int> arr = {1, 2, 3};
  // Directly test ArrayObj methods, which are the ones modified in this PR.
  // The Array<T> wrapper methods already had negative index checks.
  ArrayObj* arr_obj = arr.GetArrayObj();

  // Test ArrayObj::at (which calls operator[])
  EXPECT_THROW(
      {
        try {
          [[maybe_unused]] const auto& val = arr_obj->at(-1);
        } catch (const Error& error) {
          EXPECT_EQ(error.kind(), "IndexError");
          throw;
        }
      },
      ::tvm::ffi::Error);

  // Test ArrayObj::SetItem
  EXPECT_THROW(
      {
        try {
          arr_obj->SetItem(-1, Any(42));
        } catch (const Error& error) {
          EXPECT_EQ(error.kind(), "IndexError");
          throw;
        }
      },
      ::tvm::ffi::Error);
}

@guan404ming guan404ming marked this pull request as ready for review January 2, 2026 07:44
Copy link
Member

@junrushao junrushao left a comment

Choose a reason for hiding this comment

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

Good catch! Could you resolve the merge conflict so that I could get it in?

@guan404ming guan404ming force-pushed the fix-array-negative-index-check branch from 6b83e0f to de9644a Compare January 2, 2026 09:11
@guan404ming
Copy link
Member Author

Sure, I've resolved it. Thanks!

@junrushao junrushao merged commit ec56178 into apache:main Jan 2, 2026
7 checks passed
@guan404ming guan404ming deleted the fix-array-negative-index-check branch January 3, 2026 05:03
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.

2 participants