github / github/codeql

[C++] Assigning to function pointer in a function appears to defeat dispatch analysis

Aperta
#18,103 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub
question
Lingua principale
CodeQL
Stelle
10.1k
Fork
2.1k
Merge medio
2g 15h
PR unite (30g)
141

Descrizione

Assigning to a function pointer in a function appears to defeat the points-to analysis used to resolve the dispatch of function pointers.

In the following example I would have expected to see two flows from `source()` to `target()` but only the second one from the direct assignment of the function pointer is reported.

```cpp
int source()
{
return 2;
}

int a_function()
{
return source();
}

int target(int source)
{
return source;
}

void set(int (**ptr)(), int (*ptr2)())
{
*ptr = ptr2;
}

int main(int argv, char **argc)
{
int (*fptr)();

set(&fptr, a_function);

target(fptr()); // not detected as source

fptr = a_function;

target(fptr()); // detected

return 0;
}
```

This is the complete query

```ql
import cpp
import semmle.code.cpp.dataflow.new.TaintTracking

module SourceSinkCallConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) {
source.asExpr().(FunctionCall).getTarget().getName() = "source"
}

predicate isSink(DataFlow::Node sink) {
exists(Call call |
call.getTarget().getName() = "target" and
call.getArgument(0) = sink.asExpr()
)
}
}

module SourceSinkCallTaint = TaintTracking::Global;

from DataFlow::Node source, DataFlow::Node sink, int source_line, int sink_line
where
SourceSinkCallTaint::flow(source, sink) and
source_line = source.getLocation().getStartLine() and
sink_line = sink.getLocation().getStartLine()
select source, source_line, sink, sink_line

```

This is the output. I would have expected to also see a flow to line 28.

```
| source | source_line | sink | sink_line |
+----------------+-------------+--------------------+-----------+
| call to source | 9 | call to expression | 32 |
```

CodeQL version: 2.19.3

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia eseguendo la query completa dell'issue sull'esempio C++ fornito in CodeQL 2.19.3. Esamina il comportamento di flusso dei dati e Points-to di C++ alla base della libreria TaintTracking importata, quindi verifica che l'assegnazione indiretta tramite set() venga risolta. Il lavoro è completato quando la query segnala il flusso aggiuntivo previsto fino alla riga 28.

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

Valutazione

Stack tecnologico
cpp
Ambito
devtools
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
42/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.