小编D. *_*ler的帖子

是否调用指向生成代码未定义行为的函数指针?

在纯标准 C++ 中,有没有办法以某种方式调用缓冲区内生成的函数?

让我们假设:

  1. 我们使用了特定于实现的知识(以及特定于体系结构的知识)来生成字节序列,以在char.
  2. 此实现与实现的调用约定以及 ABI 的其他相关部分正确匹配,因此如果作为 C++ 函数调用它,它实际上将正确运行
  3. 缓冲区被正确标记为可执行文件

即,所有架构/ABI 障碍都已克服,我们需要做的就是实际调用此代码块。问题是:是否有一种符合标准的方法来创建指向 this 的函数指针并调用所述函数指针而不会遇到未定义的行为?

据我了解,如果我们可以将指向对象类型的指针转​​换为函数指针类型,则它是实现定义的。我还认为,如果所述指针将指向与原始指针相同的逻辑地址,则它是实现定义的。障碍是调用:从实现的角度来看,我所做的只是尝试将指向字符数组的指针转换为函数指针,然后调用它。如果说 ptr 是对象类型的一个,我知道这将违反严格的别名规则,并且是未定义的行为。但是如果我尝试调用这个函数指针,它是未定义的行为还是仅仅是实现定义的会发生什么?

c++ language-lawyer

10
推荐指数
1
解决办法
209
查看次数

是否可以在有条件之前对装载或存储进行重新排序?

std::atomic_uint64_t writing_ {0};
std::atomic_uint64_t reading_ {0};
std::array<type, size> storage_ {};

bool try_enqueue(type t) noexcept
{
    const std::uint64_t writing {
        writing_.load(std::memory_order::memory_order_relaxed)};
    const auto last_read {reading_.load(std::memory_order::memory_order_relaxed)};
    if (writing - last_read < size) {
        storage_.at(writing & (size - 1)) = t;
        writing_.store(writing + 1, std::memory_order::memory_order_release);

        return true;
    }
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,在上面的代码中,如果条件评估为false,则任何线程都不可能观察到对共享存储的写入。在条件排序之后不能将某操作视为之前发生的操作是否正确?还是我完全误解了这一点,实际上是否可能发生这种事情(也许通过推测执行?)?

更具体地说,处理器可以推测性地执行写入操作(当条件最终将为假时),另一个线程观察到已发生写入操作,然后第一个线程丢弃推测性写入操作吗?

(注:这是单一生产者单一消费者)

c++ concurrency cpu-architecture lock-free language-lawyer

4
推荐指数
1
解决办法
119
查看次数