Skip to content

Comments

fix: source match, importProcess and __class__ support#107

Open
CyanM0un wants to merge 1 commit intoantgroup:mainfrom
CyanM0un:main
Open

fix: source match, importProcess and __class__ support#107
CyanM0un wants to merge 1 commit intoantgroup:mainfrom
CyanM0un:main

Conversation

@CyanM0un
Copy link
Collaborator

  • add additional match logic for source
  • add .__class__() support
  • fix processImportDirect for cases:
    from django.utils import tree where tree is a python file
    from django.db.models import sql where sql is module dir that contains __init__.py

@cursor
Copy link

cursor bot commented Feb 15, 2026

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on February 27.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @CyanM0un, 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 refines the analyzer's capabilities by enhancing how taint sources are identified and how Python imports are resolved. It also introduces support for the __class__ attribute in property resolution, leading to more accurate and robust code analysis, particularly for Python projects with complex import structures.

Highlights

  • Source Matching Logic: Extended the source matching logic to include additional conditions for identifying and marking taint sources based on function signatures.
  • class Support: Implemented support for __class__ in property resolution, treating it similarly to __init__ for constructor-like behavior.
  • Improved Python Import Processing: Fixed issues in processImportDirect to correctly handle various Python import scenarios, including direct .py file imports and module directories containing __init__.py.

🧠 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.

Changelog
  • src/checker/taint/common-kit/source-util.ts
    • Added new logic to introduceFuncArgTaintByRuleConfig to mark taint sources when call.name matches tspec.fsig.
  • src/engine/analyzer/python/common/python-analyzer.ts
    • Improved processImportDirect to correctly resolve Python imports for .py files and __init__.py files within module directories.
    • Included __class__ in the property resolution logic, treating it as a constructor (_CTOR_) when part of a call expression.
Activity
  • No human activity has been recorded on this pull request yet.
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 introduces several improvements to the Python analyzer, including better import resolution, support for __class__, and additional source matching logic. My review focuses on improving code quality and correctness. I've pointed out a potential bug and code duplication in the new source matching logic, and suggested a fix for a typo and non-portable path construction in the import resolver. Overall, the changes are beneficial for the analyzer's capabilities.

Comment on lines +137 to 143
} else if (call.name === tspec.fsig) {
const args = prepareArgs(res, undefined, tspec)
for (let i = 0; i < args.length; i++) {
markTaintSource(args[i], { path: node, kind: tspec.kind })
}
break
}
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

The logic in this block is identical to the one in lines 131-135. This code duplication should be avoided.

Additionally, the condition call.name === tspec.fsig is suspicious. call is a CallExpression node, which typically does not have a name property. This might be a typo for call.callee.name. Please verify the logic and consider refactoring to remove the duplication.

Comment on lines +478 to 487
const mouduleFile = `${targetPath}/${modulePath}.py`
const moduleInitFile = path.join(`${targetPath}/${modulePath}`, '__init__.py')
// 可能是包目录,检查是否有 __init__.py
const initFile = path.join(targetPath, '__init__.py')
if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(initFile))) {
if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(mouduleFile))) {
targetPath = mouduleFile
} else if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(moduleInitFile))) {
targetPath = moduleInitFile
} else if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(initFile))) {
targetPath = initFile
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

There's a typo in the variable name mouduleFile. It should be moduleFile.

Additionally, constructing paths using string concatenation with / is not platform-independent and can cause issues on Windows. It's better to use path.join() for all path constructions to ensure portability.

Suggested change
const mouduleFile = `${targetPath}/${modulePath}.py`
const moduleInitFile = path.join(`${targetPath}/${modulePath}`, '__init__.py')
// 可能是包目录,检查是否有 __init__.py
const initFile = path.join(targetPath, '__init__.py')
if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(initFile))) {
if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(mouduleFile))) {
targetPath = mouduleFile
} else if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(moduleInitFile))) {
targetPath = moduleInitFile
} else if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(initFile))) {
targetPath = initFile
const moduleFile = path.join(targetPath, `${modulePath}.py`);
const moduleInitFile = path.join(targetPath, modulePath, '__init__.py');
// 可能是包目录,检查是否有 __init__.py
const initFile = path.join(targetPath, '__init__.py');
if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(moduleFile))) {
targetPath = moduleFile;
} else if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(moduleInitFile))) {
targetPath = moduleInitFile;
} else if (this.fileList.some((f: string) => path.normalize(f) === path.normalize(initFile))) {
targetPath = initFile;

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.

1 participant