小编wit*_*osx的帖子

为什么数据和堆栈段是可执行的?

我刚刚注意到我的简单程序的数据和堆栈段是可执行的.我在/ proc/[pid]/maps中看到了它,简单的代码证实了它.

例如:

; prog.asm
section .data
    code:   db 0xCC    ;int3

section .text
global _start
_start:
    jmp    code

    mov    rax, 60    ; sys_exit
    mov    rdi, 0
    syscall
Run Code Online (Sandbox Code Playgroud)

然后

nasm -f elf64 prog.asm
ld -o prog prog.o
./prog
Run Code Online (Sandbox Code Playgroud)

导致prog执行int3指令.

用C语言编写并用gcc构建的程序使其数据,堆栈和堆不可执行,那么为什么那些用汇编编写的程序会以不同的方式运行?

linux assembly nasm memory-mapping

17
推荐指数
1
解决办法
1543
查看次数

对于类型为类模板特化的参数,ADL背后的基本原理是什么?

我花了一些时间试图意识到为什么我的代码不能编译,我已经意识到在C++ Argument Dependent Lookup中使用模板typename参数来确定名称查找范围.

#include <string>
#include <functional>

namespace myns {

    template<typename T>
    struct X
    {};

    template<typename T>
    auto ref(T) -> void
    {}

} // namespace myns

auto main() -> int
{
    ref(myns::X<int>{});
    ref(myns::X<std::string>{}); // error: call to 'ref' is ambiguous
}
Run Code Online (Sandbox Code Playgroud)

所以前面的ref调用编译,因为myns::X<int>myns::ref考虑,而后者不编译,因为它发现myns::ref()以及std::ref

我的问题是这有用吗?我为什么需要这个?你有什么想法,例子吗?现在我只能看到上面例子中的缺点,它会引入不必要的歧义.

c++ templates argument-dependent-lookup

9
推荐指数
1
解决办法
184
查看次数

CLion和add_library(目标接口)

我有一个仅限标题的库项目.在我的CMakeLists.txt中,我使用INTERFACE库类型

我想将此项目导入CLion,但是当我打开任何头文件时,IDE会抱怨此文件不属于任何项目目标

那么有没有办法在CLion中开发一个仅限标题的项目?

测试项目布局非常简单:

% tree foo
foo
??? CMakeLists.txt
??? foo.hpp
Run Code Online (Sandbox Code Playgroud)

而CMakeLists的内容是

cmake_minimum_required(VERSION 3.8)
project(foo)

add_library(foo INTERFACE)
target_include_directories(foo INTERFACE ${PROJECT_SOURCE_DIR})
target_sources(foo INTERFACE ${PROJECT_SOURCE_DIR}/foo.hpp)
Run Code Online (Sandbox Code Playgroud)

CLION 2017.2 + CMake 3.8

cmake clion

6
推荐指数
1
解决办法
1819
查看次数

异常多重继承

我遇到混合异常和多重继承的问题。基本上我有这个代码:

#include <exception>
#include <stdexcept>
#include <iostream>

class A : public std::exception
{
public:
    virtual ~A() noexcept {};
};

class B : public A, public std::runtime_error
{
public:
    B() : A{}, std::runtime_error{""}
    {

    }
};

int main()
{
    try {
        throw B{};
    } catch (const std::exception& error) {
        // this catch doesn't work
        std::clog << "Caught!" << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要的是修改它,以便可以将 B 类的异常捕获为 std::exception (现在调用终止处理程序)。我怎样才能实现这样的行为?我猜想需要虚拟继承,但在这种情况下我看不到任何使用它的方法。

更新:我需要能够:
- 将 A 捕获为 A (微不足道),
- 将 A 捕获为 std:: 异常,
- 将 …

c++ inheritance exception multiple-inheritance

5
推荐指数
1
解决办法
2009
查看次数