• SorryQuick@lemmy.ca
        link
        fedilink
        arrow-up
        4
        arrow-down
        3
        ·
        edit-2
        3 days ago

        The whole point of a segfault is that you can’t really know anything about it. Even in rust, when you get a segfault there is no meaningful error.

        • RoyaltyInTraining@lemmy.world
          link
          fedilink
          arrow-up
          4
          ·
          2 days ago

          The worst thing you can do in non-unsafe Rust is perform an out-of-bounds indexing operation, or anything else that panics. The error you get tells you the panic’s exact location in the source code, down to the line and column. Meanwhile, C and C++ either don’t produce an error at all when accessing uninitialized memory (which is arguably the worst behavior), or it segfaults with zero extra info.

          The only way to make Rust segfault is by performing unsafe operations, and those must always be clearly marked.

          • weker01@sh.itjust.works
            link
            fedilink
            arrow-up
            2
            ·
            edit-2
            1 day ago

            The only way to make Rust segfault is by performing unsafe operations.

            Challange accepted. The following Rust code technically segfaults:

            fn stackover(a : i64) -> i64 {
                return stackover(a);
            }
            
            
            fn main() {
                println!("{}", stackover(100));
            }
            

            A stack overflow is technically a segmentation violation. At least on linux the program recives the SIGSEGV signal. This compiles and I am no rust dev but this does not use unsafe code, right?

            While the compiler shows a warning, the error message the program prints when run is not very helpfull IMHO:

            thread 'main' has overflowed its stack
            fatal runtime error: stack overflow
            [1]    45211 IOT instruction (core dumped)  ../target/debug/rust
            

            Edit: Even the compiler warning can be tricked by making it do recusion in pairs:

            fn stackover_a(a : i64) -> i64 {
                return stackover_b(a);
            }
            
            fn stackover_b(a : i64) -> i64 {
                return stackover_a(a);
            }
            
            fn main() {
                println!("{}", stackover_a(100));
            }
            
        • WhyJiffie@sh.itjust.works
          link
          fedilink
          English
          arrow-up
          10
          arrow-down
          2
          ·
          2 days ago

          point is, Rust manages to give you not a segfault but a meaningful error almost all the time until you use unsafe

          • SorryQuick@lemmy.ca
            link
            fedilink
            arrow-up
            3
            arrow-down
            5
            ·
            2 days ago

            If you’re getting a segfault in C++, it’s also cause you used unsafe code. It’s just not officially enclosed in an “unsafe” block.

            • WhyJiffie@sh.itjust.works
              link
              fedilink
              English
              arrow-up
              5
              ·
              edit-2
              2 days ago

              the point was not on the unsafe word, but a very specific feature of Rust that helps enclosing unsafe code where the compiler wouldn’t be able to 100% verify your logic. no such thing in C++. C++ does not even attempt to verify safety

              your response is basically “get better at coding dumbass, I am the safety validator”

    • asdfasdfasdf@lemmy.world
      link
      fedilink
      arrow-up
      21
      ·
      3 days ago

      I mean, this is correct in many cases, unironically.

      It should be one of the core purposes of a programming language to help humans to write the code they intend. If a language doesnt do that then it’s bad.

      • Shanmugha@lemmy.world
        link
        fedilink
        arrow-up
        1
        ·
        edit-2
        1 day ago

        I tend to disagree. The language should allow me to do things, and what is simple and obvious logically should be simple and obvious in the language (I am looking at you, JavaScript with [] != [])

        What I intend - well, more than half my work is figuring out what I intend, language should have no say in this, save things like “we do this kind of trick like this here” (for example, C++ has no concept of “interface” entity. Ok, looks like I can use virtual class instead)

        It is when languages start trying to be “helpful” they become an ugly mess: meaningful white spaces in Python? The whole shit with prototypes and objects in JS(see above)? Fuck this shit, I am not going to call those two good programming languages

        • asdfasdfasdf@lemmy.world
          link
          fedilink
          arrow-up
          3
          ·
          edit-2
          1 day ago

          I think you’re saying the same thing as what I am. If it’s more complex than what you may think, the language should guard against it. If not, it should make it simple.

          Rust, for example, is the only mainstream language where it isn’t possible to read from a file handle after it’s been closed. Doing so is a compilation failure. This is just a general invariant of “how to use files”.

          But you also don’t need to think about allocating or deallocating memory in Rust. It does that fke you automatically, even though it’s not GC.

          JS can also be complicated when it tries to hide realities about the world. E.g. is a const array or object immutable? No, the pointer is. But pointers don’t exist! /s

          • Shanmugha@lemmy.world
            link
            fedilink
            arrow-up
            1
            ·
            1 day ago

            Looks like we still differ. If something is more complicated than what I may think, then there are some possibilities:

            • I have not learned to language properly yet (this is where I stand with C++, so no matter how many times I’ve got segfaults, now is not the time for me to say language is bad)
            • I have chosen the wrong tool (writing a videoplayer in assembler? something went way wrong here)
            • tool is actually bad (my rant above goes here. in the sake of making some things easy and simple, something basic in the language got screwed up irrevocably)

            And if I managed to try reading from a closed handle, or to access a memory that I am not actually allowed to use, or… (could not get more examples out of the top of my head), it is not the job of the language to slap my hands, as long as I follow the syntax. Most of the time (if not all the time) this means I have not accounted for something that my code allowed to happen - so my responsibility to deal with that

            What I keep hearing about Rust is still in the lines of too-much-fucking-care (that’s besides obviously dumb rule of “no more than one owner of a variable at any moment” which then had to be worked around because not everything can be done this way. please correct me if I am wrong here)

            • asdfasdfasdf@lemmy.world
              link
              fedilink
              arrow-up
              2
              ·
              1 day ago

              Yep, we disagree. The world and technology especially is an extremely complicated place. IMO any complex system that is built upon “humans should just know all this complexity and keep it in mind all the time” is fundamentally broken.

              • Shanmugha@lemmy.world
                link
                fedilink
                arrow-up
                1
                ·
                edit-2
                1 day ago

                It depends. We may have our differences in weighing things, but yes, complexity of the system must correlate with complexity of the task it is used for. A system allowing to do things without any complexity means either no complex things to be done or straight up magic