[question?] counterintuitive class method behaviour

Aperta
#21,670 9 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
38/100
Tipo di issue
Documentazione
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Ambito
documentation

Direzione di ricerca

Inizia con la query e l’output di CodeQL mostrati nell’issue, quindi leggi la documentazione relativa ai metodi delle classi e alla valutazione dei predicati. Conferma il comportamento previsto e individua la sezione pertinente della documentazione; il lavoro è completato quando il comportamento è spiegato con sufficiente chiarezza da colmare la lacuna nel modello mentale segnalata.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

question

When I write a query like this:

class Meow extends Struct {
  Field f;
  Meow() {
    f.getDeclaringType() = this
  }
  Field getField() { result = f }
}

from Meow m
select m, m.getField(), m.getField()

My mental model of this is: "Meow is essentially a (struct, struct's field) tuple. from Meow m will select all of those tuples. For each of those , select m, m.getField(), m.getField() will print their contents."

But that is actually not what happens, because you get results like this:

|                 m                 |                        col1                         |                        col2                         |
+-----------------------------------+-----------------------------------------------------+-----------------------------------------------------+
// [snip]
| port_io_ops                       | f_inb                                               | f_outb                                              |
// [snip]

Which means that the first m.getField() and the second m.getField() are operating on different Meow objects.

I've been debugging a bug in my query for hours now only to realize that this is what happens. Is this really intended? I read through a non-trivial amount of documentation and did not realize this, I feel like my whole mental model of how codeql works is shattering :S

(If it is really intended, could the documentation be updated to point this out more clearly?)

Lingua principale
CodeQL
Stelle
10.1k
Fork
2.1k
Merge medio
2g 11h
PR unite (30g)
129

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di github/codeql

Tutte le issue di github/codeql

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.