我已经阅读了一段时间的严格别名规则,我开始变得非常困惑.首先,我已经阅读了这些问题和一些答案:
根据它们(据我所知),char使用指向另一种类型的指针访问缓冲区违反了严格的别名规则.但是,glibc实现strlen()有这样的代码(删除了注释和64位实现):
size_t strlen(const char *str)
{
const char *char_ptr;
const unsigned long int *longword_ptr;
unsigned long int longword, magic_bits, himagic, lomagic;
for (char_ptr = str; ((unsigned long int) char_ptr
& (sizeof (longword) - 1)) != 0; ++char_ptr)
if (*char_ptr == '\0')
return char_ptr - str;
longword_ptr = (unsigned long int *) char_ptr;
himagic = 0x80808080L;
lomagic = 0x01010101L;
for (;;)
{
longword = *longword_ptr++;
if (((longword - lomagic) & himagic) …Run Code Online (Sandbox Code Playgroud) 我刚刚学习XDP。在旅途中,我遇到了一个我无法理解的案例。当我注意到没有任何变化时,我在某些 UDP 数据包上尝试了一些奇特的东西。所以我尝试用一个最小的例子来重现这个问题。这是最小的例子:
#include <linux/bpf.h>
#include <linux/in.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/udp.h>
#define SEC(NAME) __attribute__((section(NAME), used))
SEC("obfuscator_main")
int dropper(struct xdp_md *ctx) {
return XDP_DROP;
}
char _license[] SEC("license") = "GPL";
Run Code Online (Sandbox Code Playgroud)
(不要介意“混淆器”名称,它是其余代码的剩余部分)。
我编译并加载这个:
clang -Wall -O2 -target bpf -c obfuscate.c -o obfuscate.o
sudo ip link set dev enp3s0 xdp obj obfuscate.o sec obfuscator_main
Run Code Online (Sandbox Code Playgroud)
我确认到我的计算机的传入流量已完全丢失。但是,数据包仍然可以出去。我 ping 运行 tcpdump 的远程服务器,它看到了 ICMP 请求。但我在本地计算机上没有得到任何响应。
为什么它不能对传出的数据包执行任何操作?