| Bug ID | 1506 |
|---|---|
| Summary | Fix undefined behavior in RTE_IPV4 macro |
| Product | DPDK |
| Version | 24.07 |
| Hardware | All |
| OS | All |
| Status | UNCONFIRMED |
| Severity | normal |
| Priority | Normal |
| Component | core |
| Assignee | dev@dpdk.org |
| Reporter | user202729@protonmail.com |
| Target Milestone | --- |
Currently we have the following definition ``` /** Create IPv4 address */ #define RTE_IPV4(a, b, c, d) ((uint32_t)(((a) & 0xff) << 24) | \ (((b) & 0xff) << 16) | \ (((c) & 0xff) << 8) | \ ((d) & 0xff)) ``` The problem is that the cast to `uint32_t` is done after the shift, and overflowing left shift is undefined behavior in C and C++: https://stackoverflow.com/questions/3784996/why-does-left-shift-operation-invoke-undefined-behaviour-when-the-left-side-oper . The fix is easy, just cast the `(a) & 0xff` to `uint32_t` before shifting it by 24.