我刚刚注意到我的简单程序的数据和堆栈段是可执行的.我在/ 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构建的程序使其数据,堆栈和堆不可执行,那么为什么那些用汇编编写的程序会以不同的方式运行?
我花了一些时间试图意识到为什么我的代码不能编译,我已经意识到在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
我的问题是这有用吗?我为什么需要这个?你有什么想法,例子吗?现在我只能看到上面例子中的缺点,它会引入不必要的歧义.
我有一个仅限标题的库项目.在我的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
我遇到混合异常和多重继承的问题。基本上我有这个代码:
#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:: 异常,
- 将 …