小编Yağ*_*mak的帖子

严格别名规则和glibc的strlen实现

我已经阅读了一段时间的严格别名规则,我开始变得非常困惑.首先,我已经阅读了这些问题和一些答案:

根据它们(据我所知),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)

c glibc strict-aliasing

7
推荐指数
1
解决办法
236
查看次数

无法使用 XDP 丢弃传出流量

我刚刚学习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 请求。但我在本地计算机上没有得到任何响应。

为什么它不能对传出的数据包执行任何操作?

xdp-bpf

2
推荐指数
1
解决办法
981
查看次数

标签 统计

c ×1

glibc ×1

strict-aliasing ×1

xdp-bpf ×1