News for hackers. Stuff that matters.
Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by blueflow on Friday April 22, 2022 @04:54AM (#31119530)
If we would write some code in rust, compile it to, for example, x86_64. And then de-compile it to C. It would be perfectly memory-safe C code, right?
Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by kalnins on Friday April 22, 2022 @09:59AM (#31121617)
As Rust is llvm based, you don't need to compile it to C. Just write a backend that translates LLVM IR to C instead of x86_64. The IR is very C looking, it's probably overly complex.

Compiling down to asm, lot of information is lost regarding memory layout etc, so it's not the best source for generating code.

Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by my123 on Friday April 22, 2022 @11:14AM (#31122618)
https://github.com/JuliaComputingOSS/llvm-cbe

edit: you also have mrustc as a Rust to C compiler outright.

Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by frabert on Friday April 22, 2022 @12:25PM (#31123758)
Hey, LLVM to C is what Rellic does! https://github.com/lifting-bits/rellic
Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by pjc50 on Friday April 22, 2022 @06:35AM (#31120042)
Yes, but it wouldn't necessarily be readable. And it definitely wouldn't be portable!
Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by tym0 on Friday April 22, 2022 @06:58AM (#31120166)
Isn't Mozilla doing that? Rust to WASM to C.

Edit: Sorry I misremembered, they seem to compile C/C++ code to WASM then back to C: https://hacks.mozilla.org/2021/12/webassembly-and-back-again...

Although technically the plugins could be written in Rust.

Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by eatonphil on Friday April 22, 2022 @07:01AM (#31120183)
Link?
Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by vnorilo on Friday April 22, 2022 @06:16AM (#31119943)
Some architectural/program assumptions may not be encoded in assembly or preserved in the asm -> C -> asm roundtrip, especially if the assemblers are for different architectures. The obvious example is pointer word size and memory model.
Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by josephg on Friday April 22, 2022 @06:28AM (#31120011)
Rust might work reasonably well though, given its compiled with llvm. If not, I'm sure whatever asm structures llvm outputs for rust all have C equivalents.

I'd be curious to see the output! It'd be funny decompiling the rust compiler to C, then running it on another platform that way. (Though it would still be, for example, an x86 rust compiler running on arm).

Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by vnorilo on Sunday April 24, 2022 @08:40AM (#31143425)
Strictly speaking all x86 MOVs would have to decompile to some level of atomic load/stores, because of the ordering guarantees on x86.

That's an example of "lost in translation" as we don't know if the original source required ordering or not. x86 cannot express the weakest memory model supported by C.

Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by thargor90 on Friday April 22, 2022 @05:19AM (#31119657)
I would guess that writing a decompiler that gets c semantics 100% correct is also really hard. Think about inline assembly, memory barriers, etc.

I don't think this would work, unless the c file just contains inline assembly.

Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by speed_spread on Friday April 22, 2022 @08:26AM (#31120785)
The simpler way to obtain C from Rust would be to use mrustc https://github.com/thepowersgang/mrustc

Not that the C will be much more readable than the dissassembly, but there's a chance less information will be lost.

Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by astrange on Friday April 22, 2022 @08:13AM (#31120646)
It wouldn't look much like what you'd expect C to look like. If it did decompile back to idiomatic C it could introduce some kind of aliasing bug along the way that'd make it not so memory safe.
Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by shin_lao on Friday April 22, 2022 @08:27AM (#31120787)
Nothing is perfectly memory-safe. Also, not sure I would see the point of this translation?
Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by MaxBarraclough on Friday April 22, 2022 @08:55AM (#31121027)
> Nothing is perfectly memory-safe.

How about formally verified SPARK code?

Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by astrange on Friday April 22, 2022 @04:34PM (#31127708)
It’s strange that people think if they put the word “formal” in front of something it means it’ll work perfectly.
Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by MaxBarraclough on Friday April 22, 2022 @05:22PM (#31128324)
The guidelines ask that you Please don't post shallow dismissals.

Are you aware of the scope of SPARK's assurances? You can't accidentally dereference a NULL pointer in verified SPARK code, for instance.

Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by astrange on Sunday April 24, 2022 @09:25AM (#31143738)
Yes, but that's a quality of SPARK, not of the category of "formal methods" by default.

For instance, if you write your own proof and then prove the program meets it, there could still be a logic error in your proof.

Also, "in verified code" is a big loophole enough to leave security issues in - for instance a web browser (probably the thing you'd most like to prove security-issue-free) can still overwrite its own memory through things like OS image and font code, JavaScript JITs generating code to an insecure ABI you don't have a model for, syscalls to kernel code that can write back into your memory, etc.

Believing "formal" makes things magically correct does seem to be a common problem; it also comes up when people say something has a "formal audit" or needs to get one from someone. How do they "formally" audit it? Are they wearing suits?

Re:Snowman native code to C/C++ decompiler for x86/x86_64/ARM by MaxBarraclough on Monday April 25, 2022 @05:46PM (#31161115)
> For instance, if you write your own proof and then prove the program meets it, there could still be a logic error in your proof.

Sure. Even mathematics research journals sometimes publish erroneous proofs. Practical formal methods generally rely on automated provers.

You're right though that software development using formal methods can still have a non-zero number of defects. AdaCore use the term ultra-low-defect software rather than bug-free software. For an interesting case-study see [0].

Unfortunately, even automated provers can have bugs. To my knowledge, all provers suitable for practical use are not themselves formally verified. I don't think this is often an issue in practice, though. It remains that formal methods have an excellent real-world track record. The 'problems' with formal methods aren't effectiveness, but effort/price, and perhaps scalability.

> a web browser (probably the thing you'd most like to prove security-issue-free) can still overwrite its own memory through things like OS image and font code, JavaScript JITs generating code to an insecure ABI you don't have a model for, syscalls to kernel code that can write back into your memory, but not effectiveness.

If you verify only certain parts of a software solution, then sure, you don't get formal assurances about its overall behaviour.

> How do they "formally" audit it? Are they wearing suits?

That's an entirely different use of the word, isn't it?

[0] https://www.adacore.com/tokeneer See page 59 of the (freely available) full report for Analysis section