Coder Social home page Coder Social logo

Comments (5)

bnoordhuis avatar bnoordhuis commented on August 16, 2024

Can you check what sizeof(http_parser) is (and why)?

from http-parser.

thefloweringash avatar thefloweringash commented on August 16, 2024

The assertion is not applying padding rules. The difference between sizeof(http_parser)=32 and offsetof(http_parser, data)=24 shows a 4-byte pointer and 4-bytes of padding after it. I haven't found a succinct source, but a stack overflow post on Structure padding and packing asserts:

For struct, other than the alignment need for each individual member, the size of whole struct itself will be aligned to a size divisible by size of largest individual member, by padding at end.

Which is consistent with this struct being padded to a multiple of 8-bytes, since it contains an 8-byte uint64_t content_length.

./test_g
http_parser v2.9.4 (0x020904)
sizeof(http_parser) = 32
sizeof(void *) = 4
offsetof(http_parser, nread) = 4
offsetof(http_parser, content_length) = 8
offsetof(http_parser, http_major) = 16
offsetof(http_parser, http_minor) = 18
offsetof(http_parser, data) = 24
test_g: test.c:4230: main: Assertion `sizeof(http_parser) == 4 + 4 + 8 + 2 + 2 + 4 + sizeof(void *)' failed.
With a small patch to show some offsets
diff -ur source/test.c source-debug/test.c
--- source/test.c	1970-01-01 00:00:01.000000000 +0000
+++ source-debug/test.c	2020-04-29 18:31:08.678915685 +0000
@@ -4221,6 +4221,12 @@
   printf("http_parser v%u.%u.%u (0x%06lx)\n", major, minor, patch, version);

   printf("sizeof(http_parser) = %u\n", (unsigned int)sizeof(http_parser));
+  printf("sizeof(void *) = %u\n", (unsigned int)sizeof(void*));
+  printf("offsetof(http_parser, nread) = %u\n", (unsigned int)offsetof(http_parser, nread));
+  printf("offsetof(http_parser, content_length) = %u\n", (unsigned int)offsetof(http_parser, content_length));
+  printf("offsetof(http_parser, http_major) = %u\n", (unsigned int)offsetof(http_parser, http_major));
+  printf("offsetof(http_parser, http_minor) = %u\n", (unsigned int)offsetof(http_parser, http_minor));
+  printf("offsetof(http_parser, data) = %u\n", (unsigned int)offsetof(http_parser, data));
   assert(sizeof(http_parser) == 4 + 4 + 8 + 2 + 2 + 4 + sizeof(void *));

from http-parser.

bnoordhuis avatar bnoordhuis commented on August 16, 2024

That makes sense, thanks. #510 should fix it.

from http-parser.

haudan avatar haudan commented on August 16, 2024

I can reproduce this on HP-UX (Itanium machine, ia64).

Using @thefloweringash's modified test.c:

http_parser v2.9.4 (0x020904)
sizeof(http_parser) = 32
sizeof(void *) = 4
offsetof(http_parser, nread) = 4
offsetof(http_parser, content_length) = 8
offsetof(http_parser, http_major) = 16
offsetof(http_parser, http_minor) = 18
offsetof(http_parser, data) = 24
Assertion failed: sizeof(http_parser) == 4 + 4 + 8 + 2 + 2 + 4 + sizeof(void *), file test_g.c, line 4309
Abort(coredump)

from http-parser.

bnoordhuis avatar bnoordhuis commented on August 16, 2024

I fixed this in 4f15b7d by checking the struct size only for i386 and x86_64, that should hopefully be good enough to catch regressions.

from http-parser.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.