1010
GoOn (programming.dev)
you are viewing a single comment's thread
view the rest of the comments
[-] dannym@lemmy.escapebigtech.info 84 points 9 months ago* (last edited 9 months ago)

Please don't. Use regex to find something that looks like an IP then build a real parser. This is madness, its's extremely hard to read and a mistake is almost impossible to spot. Not to mention that it's slow.

Just parse [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} using regex (for v4) and then have some code check that all the octets are valid (and store the IP as a u32).

[-] Emma_Gold_Man@lemmy.dbzer0.com 11 points 9 months ago

And dupe check. 0.0.0.0 and 000.000.000.000 may both be valid, but they resolve the same

[-] azertyfun@sh.itjust.works 6 points 9 months ago

Fuck that, if for whatever reason I'm writing an IP validator by hand I'm disallowing leading zeros. Parsers are very inconsistent, some will parse 010 as 10, others as 0o10 == 8 (you can try that right now with a POSIX ping). Talk about a footgun.

[-] stringere@reddthat.com 6 points 9 months ago

some will parse 010 as 10, others as 0o10 == 8

...and that's me in the fetal position, thanks.

[-] dannym@lemmy.escapebigtech.info 3 points 9 months ago* (last edited 9 months ago)

Definitely, tho if you store it as a u32 that is fixed magically. Because 1.2.3.4 and 1.02.003.04 both map to the same number.

What I mean by storing it as a u32 is to convert it to a number, similar to how the IP gets sent over the wire, so for v4:

octet[3] | octet[2] << 8 | octet[1] << 16 | octet[0] << 24

or in more human terms:

(fourth octet) + (third octet * 256) + (second octet * 256^2) + (first octet * 256^3)
[-] Emma_Gold_Man@lemmy.dbzer0.com 2 points 9 months ago

True enough for database or dictionary storage, but a lot of times things get implemented in arrays where you still wind up with two copies of the same uint32.

[-] p1mrx@sh.itjust.works 2 points 9 months ago

Because 1.2.3.4 and 1.02.003.04 both map to the same number.

But 10.20.30.40 and 010.020.030.040 map to different numbers. It's often best to reject IPv4 addresses with leading zeroes to avoid the decimal vs. octal ambiguity.

[-] dannym@lemmy.escapebigtech.info 2 points 9 months ago

I don't know why anyone would write their IPs in octal, but fair point

[-] p1mrx@sh.itjust.works 2 points 9 months ago

It's not about how people write them, it's how parsers parse them. IPv4 has been around since 1982, and most parsers interpret leading zeros as octal.

this post was submitted on 15 Nov 2023
1010 points (95.7% liked)

Programmer Humor

18890 readers
1138 users here now

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

founded 1 year ago
MODERATORS