github / github/codeql

Python: Inconsistent behaviour of the getAMember and getMember predicates

未关闭
#19,297 8 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
question
主要语言
CodeQL
星标
10.1k
派生
2.1k
平均合并
2 天 15 小时
30 天内合并 PR
141

描述

Trying to access all nodes that represent an attribute of a Django subclass does not work as expected in https://github.com/HumanSignal/label-studio.

I am trying to detect a call to `AsyncMigrationStatus.objects` in the following block of code (https://github.com/HumanSignal/label-studio/blob/develop/label_studio/core/management/commands/show_async_migrations.py#L19):

```
def handle(self, *args, **options):
org = options['organization']
logger.debug(f"===> AsyncMigrationStatus for Organization {org if org > -1 else 'ALL'}")
if org == -1:
migrations = AsyncMigrationStatus.objects.all().order_by('project_id')
else:
migrations = AsyncMigrationStatus.objects.filter(project__organization_id=org)

for m in migrations:
logger.debug(f'{m.name} \t {m.created_at} \t Project <{m.project}> \t {m.status} \t {m.meta}')

logger.debug(f"===> AsyncMigrationStatus for Organization {org if org > -1 else 'ALL'} printed")
```

Using the following query:

```
import python
import semmle.python.frameworks.Django
import semmle.python.ApiGraphs

from API::Node n
where
n = PrivateDjango::DjangoImpl::DB::Models::Model::subclassRef().getAMember() and
select n, "this is a model attribute"
```

`AsyncMigrationStatus` is defined below (https://github.com/HumanSignal/label-studio/blob/develop/label_studio/core/models.py#L10):

```
class AsyncMigrationStatus(models.Model):
meta = JSONField(
'meta',
null=True,
default=dict,
help_text='Meta is for any params for migrations, e.g.: project, filter or error message.',
)

project = models.ForeignKey(
'projects.Project',
related_name='asyncmigrationstatus',
on_delete=models.CASCADE,
null=True,
help_text='Project ID for this migration',
)

name = models.TextField('migration_name', help_text='Migration name')

STATUS_STARTED = 'STARTED'
STATUS_IN_PROGRESS = 'IN PROGRESS'
STATUS_FINISHED = 'FINISHED'
STATUS_ERROR = 'ERROR'
STATUS_CHOICES = (
(STATUS_STARTED, 'Migration is started or queued.'),
(STATUS_IN_PROGRESS, 'Migration is in progress. Check meta for job_id or status.'),
(STATUS_FINISHED, 'Migration completed successfully.'),
(STATUS_ERROR, 'Migration completed with errors. Check meta for more info.'),
)
status = models.CharField(max_length=100, choices=STATUS_CHOICES, null=True, default=None)

created_at = models.DateTimeField(_('created at'), auto_now_add=True, help_text='Creation time')
updated_at = models.DateTimeField(_('updated at'), auto_now=True, help_text='Last updated time')

def __str__(self):
return f'(id={self.id}) ' + self.name + (' at project ' + str(self.project) if self.project else ''))
```

This query returns many results across the codebase but does not flag this specific statement, along with others.

I've tried many different approaches to understand the root cause of the issue without success. Please let me know if I am somehow misusing getAMember.

Below are my specs:
- codeQL CLI 2.21.0
- codeQL VSCode extension 1.17.2

贡献指南

打开贡献指南

调研方向

先使用 semmle.python.frameworks.Django 和 semmle.python.ApiGraphs 从复现的查询开始,然后针对 Django 模型属性比较 getAMember 和 getMember。使用链接的 show_async_migrations.py 和 models.py 示例作为复现案例。当谓词行为得到解释,并且查询能够一致地识别对 AsyncMigrationStatus.objects 的访问时,即视为完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
django, python
领域
devtools
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。