[Bug] Snapshot register aliases during value propagation
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Ambito
- compilers, reverse-engineering
Direzione di ricerca
Start with RegisterValues in src/decompiler/decompiler.cpp (line 20), then assign_register around lines 427-431 and call handling around lines 586-590, where the alias "rax" is stored as a mutable name. Run the reproducer with a variadic printf call to see the recovered output diverge from the original (7 vs 0). Done means the reproducer matches after recompilation, copies keep the value from the copy point, caller-saved registers are invalidated across calls, and a regression test covers the copied return value followed by an eax setup.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
Register-value propagation stores mutable register names inside expression strings. When the source register is overwritten, dependent aliases still refer to the new register value instead of the value that was copied earlier.
Evidence
src/decompiler/decompiler.cpp:20 defines RegisterValues as map<string, string>, assign_register stores the expression string at :427-431, and call handling stores the mutable alias "rax" at :586-590.
Reproducer:
#include <stdio.h>
__attribute__((noinline)) int value(void) { return 7; }
int main(void) {
printf("%d\n", value());
return 0;
}
The recovered code passes rax to printf after the machine code has executed mov esi, eax followed by mov eax, 0. Compiling the recovered source without treating the format warning as fatal produces:
original: 7
recovered: 0
Impact
The output can compile and run while silently changing program behavior. The same problem can affect copied arguments, values retained across calls, and caller-saved register clobbers.
Expected behavior
Register propagation should use immutable/SSA-like value nodes or otherwise snapshot the source expression at the transfer point. Writes to a source register and ABI-clobbering calls must invalidate dependent aliases.
Acceptance criteria
- The reproducer preserves the original output after recovery and recompilation.
- Register-to-register copies retain the value at the copy instruction, not a later value of the source register.
- Caller-saved registers are invalidated or modeled across calls.
- Add regression coverage for a copied return value followed by an
eaxsetup instruction for a variadic call.
- Lingua principale
- C++
- Stelle
- 0
- Fork
- 0
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di TiElixir/caraxes
-
bug good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
-
enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 12/100
-
enhancement
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
-
enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 20/100
-
bug good first issue
Difficoltà 3/5 Mezza giornata Idoneità per principianti 68/100
Tutte le issue di TiElixir/caraxes
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
-
std::fdim drops partial derivative w.r.t second argument in forward and reverse modeForse già presa @ADITYASINGH1206 l’ha presa oggi. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
vgvassilev/clad#2534 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 61/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 3 giorni