• Codex@lemmy.world
      link
      fedilink
      arrow-up
      1
      ·
      5 months ago

      Makes the error a little too frequent, but does obscure any performance penalty and is some truly evil genius work!

    • IphtashuFitz@lemmy.world
      link
      fedilink
      English
      arrow-up
      0
      ·
      5 months ago

      Decades ago I had to debug a random crash. It only happened on Wednesdays. On Wednesdays in September. On Wednesdays in September after the 10th…

      • yggdar@lemmy.world
        link
        fedilink
        arrow-up
        0
        ·
        edit-2
        5 months ago

        That exact version will end up making “true” false any time it appears on a line number that is divisible by 10.

        During the compilation, “true” would be replaced by that statement and within the statement, “__LINE__” would be replaced by the line number of the current line. So at runtime, you end up witb the line number modulo 10 (%10). In C, something is true if its value is not 0. So for e.g., lines 4, 17, 116, 39, it ends up being true. For line numbers that can be divided by 10, the result is zero, and thus false.

        In reality the compiler would optimise that modulo operation away and pre-calculate the result during compilation.

        The original version constantly behaves differently at runtime, this version would always give the same result… Unless you change any line and recompile.

        The original version is also super likely to be actually true. This version would be false very often. You could reduce the likelihood by increasing the 10, but you can’t make it too high or it will never be triggered.

        One downside compared to the original version is that the value of “true” can be 10 different things (anything between 0 and 9), so you would get a lot more weird behaviour since “1 == true” would not always be true.

        A slightly more consistent version would be

        ((__LINE__ % 10) > 0)
        
          • yggdar@lemmy.world
            link
            fedilink
            arrow-up
            1
            ·
            5 months ago

            That is true, but from a human perspective it can still seem non-deterministic! The behaviour of the program as a whole will be deterministic, if all inputs are always the same, in the same order, and without multithreading. On the other hand, a specific function call that is executed multiple times with the same input may occasionally give a different result.

            Most programs also have input that changes between executions. Hence you may get the same input record, but at a different place in the execution. Thus you can get a different result for the same record as well.

  • SkyNTP@lemmy.ml
    link
    fedilink
    arrow-up
    2
    ·
    5 months ago

    This wouldn’t pass PR review and automated tests, unless they were a senior dev and used elevated privileges to mess with things behind the scenes.

    • maynarkh@feddit.nl
      link
      fedilink
      arrow-up
      1
      arrow-down
      1
      ·
      5 months ago

      It’s bold to assume those exist. Maybe there’s a reason the coworker left