241 points
*

define it as ( __LINE__ % 10) so that the problem goes away when you add a debug statement

permalink
report
reply
80 points

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

permalink
report
parent
reply
84 points

permalink
report
parent
reply
61 points
*

Full version

Edit: from XKCD

permalink
report
parent
reply
1 point

Or just both

permalink
report
parent
reply
41 points

Can someone ELI5 what this does?

permalink
report
parent
reply
85 points
*

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)
permalink
report
parent
reply
39 points

If the error is too frequent it will be hunted down very fast, what you want is errors that happen no more than once every month, maybe add another level that ensures this only triggers based on the running time.

permalink
report
parent
reply
7 points

The original version constantly behaves differently at runtime

It actually doesn’t, since rand() is deterministic.

When no seed value is specified, rand() is automatically seeded with 1 at the initial call within any program It then uses the previous output as seed for the next, so it will always have the same output sequence

permalink
report
parent
reply
29 points

__LINE__ returns the line of code its on, and % 10 means “remainder 10.” Examples:

1 % 10 == 1
...
8 % 10 == 8
9 % 10 == 9
10 % 10 == 0 <-- loops back to 0
11 % 10 == 1
12 % 10 == 2
...
19 % 10 == 9
20 % 10 == 0
21 % 10 == 1

In code, 0 means false and 1 (and 2, 3, 4, …) means true.

So, if on line 10, you say:

int dont_delete_database = true;

then it will expand to:

int dont_delete_database = ( 10 % 10 );
// 10 % 10 == 0 which means false
// database dies...

if you add a line before it, so that the code moves to line 11, then suddenly it works:

// THIS COMMENT PREVENTS DATABASE FROM DYING
int dont_delete_database = ( 11 % 10 );
// 11 % 10 == 1, which means true
permalink
report
parent
reply
18 points

A lot of these replies have high hopes for 5 year olds

permalink
report
parent
reply
14 points
*

__ LINE __ is a preprocessor macro. It will be replaced with the line number it is written on when the code is compiled. Macros aren’t processed when debugging. So the code will be skipped during debug but appear in the compiled program, meaning the program will work fine during debug but occasionally not work after compile.

“__ LINE __ % 10” returns 0 if the line number is divisible by 10 and non-zero if not. 0 is considered false and non-zero is considered true.

#define is also macro. In this case, it will replace all instances of “true” with something that will only sometimes evaluate to true when the program is compiled.

permalink
report
parent
reply
3 points

Every tenth line, this would evaluate to False, while on lines that aren’t multiples of ten, it would evaluate to True.

permalink
report
parent
reply
17 points

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…

permalink
report
parent
reply
10 points

only when your coordinates were within a train depot in Poland?

https://www.youtube.com/watch?v=XrlrbfGZo2k

permalink
report
parent
reply
5 points

I kinda want to hear more of this story… care to share the details? i.e. what was the root cause?

permalink
report
parent
reply
17 points

It was pure c code that was used to print reports, and included the date in a header. Whoever wrote it miscalculated the size of the buffer for the header by one byte. When the date was the longest month & day spelled out plus a two digit day of the month then it would overflow the buffer, resulting in the program crashing.

permalink
report
parent
reply
2 points
Deleted by creator
permalink
report
parent
reply
116 points

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.

permalink
report
reply
175 points

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

permalink
report
parent
reply
11 points
*
Deleted by creator
permalink
report
parent
reply
1 point

SVN has legit use cases still though. Git LFS is not or just barely supported in a lot of industries.

permalink
report
parent
reply
113 points

rand() will be infrequent < 10 (at least ten in 2^15 times, if not exponentially more), so automated tests are likely to pass. If they don’t, they’re likely to pass on the second try, and then everyone shrugs and continues. If it’s buried in 500 other lines, then it’s likely the code reviewer will give it all a quick scan and say “it’s fine”. It’s the three line diffs that get lots of scrutiny.

In other words, you seem to have a lot more faith in the process than I do.

permalink
report
parent
reply
27 points

rand will be called every time true is used, which could be hundreds of times for all we know

permalink
report
parent
reply
25 points

If it’s a 16-bit integer platform, it might hit every once in a while.

If it’s a 32-bit integer platform, it’ll hit very rarely.

If it’s a 64-bit integer platform, someone would have to do the math with some reasonable assumptions, but I wouldn’t be surprised if it would never hit before the universe becomes nothing but black holes.

permalink
report
parent
reply
62 points
*

Write a 5 line PR and receive 5 comments. Write a 500 line PR and receive no comments.

permalink
report
parent
reply
16 points

lgtm

permalink
report
parent
reply
10 points

Attn: security team

Hi,

I think someone on Lemmy has hacked into every work environment I’ve ever coded in

permalink
report
parent
reply
2 points

It works on my machine, most of the time.

permalink
report
parent
reply
16 points

you’d be surprised what slips through review

permalink
report
parent
reply
-9 points

Yeah but even a single automated test would catch it and reject the PR. You just need a single test.

permalink
report
parent
reply
17 points

No, you can’t assume that. The probability of hitting the condition each time is low. If there aren’t very many calls that hit this, it could easily slip through. Especially on 64-bit int platforms.

permalink
report
parent
reply
58 points

Funny but I call bullshit all day

permalink
report
reply
5 points

Yeah, how did they commit this to anywhere that would hurt?

permalink
report
parent
reply
3 points

They did not ✌️

permalink
report
parent
reply
54 points
*

That happened 🙄

permalink
report
reply
27 points

Lol I don’t think the preprocessor would be too happy with a space after #

permalink
report
reply
19 points

C preprocessor wouldn’t care about it

permalink
report
parent
reply
4 points

Lol that’s news to me!!

permalink
report
parent
reply

Programmer Humor

!programmer_humor@programming.dev

Create post

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

  • Keep content in english
  • No advertisements
  • Posts must be related to programming or programmer topics

Community stats

  • 7.2K

    Monthly active users

  • 954

    Posts

  • 36K

    Comments