小编Ojs*_*Ojs的帖子

gdb无法访问内存地址错误

这是我的disas代码:

   0x0804844d <+0>:     push   %ebp
   0x0804844e <+1>:     mov    %esp,%ebp
   0x08048450 <+3>:     and    $0xfffffff0,%esp
   0x08048453 <+6>:     sub    $0x20,%esp
   0x08048456 <+9>:     movl   $0x8048540,(%esp)
   0x0804845d <+16>:    call   0x8048310 <puts@plt>
   0x08048462 <+21>:    lea    0x1c(%esp),%eax
   0x08048466 <+25>:    mov    %eax,0x4(%esp)
   0x0804846a <+29>:    movl   $0x8048555,(%esp)
   0x08048471 <+36>:    call   0x8048320 <scanf@plt>
   0x08048476 <+41>:    mov    0x1c(%esp),%eax
   0x0804847a <+45>:    cmp    $0x208c,%eax
   0x0804847f <+50>:    jne    0x804848f <main+66>
   0x08048481 <+52>:    movl   $0x8048558,(%esp)
   0x08048488 <+59>:    call   0x8048310 <puts@plt>
   0x0804848d <+64>:    jmp    0x804849b <main+78>
=> 0x0804848f <+66>:    movl   $0x8048569,(%esp)
   0x08048496 <+73>:    call   0x8048310 <puts@plt> …
Run Code Online (Sandbox Code Playgroud)

c gdb

12
推荐指数
2
解决办法
6万
查看次数

Windows:使用C++获取函数地址

我正在尝试使用memcpy获取函数地址以将其内容复制到缓冲区中.

我遇到的问题是获取功能地址.这是我的代码:

__declspec(noinline) int gio()
{
    const char yle[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
    return 7;
}

int main(int argc, TCHAR* argv[])
{
    int(*funcptr)() = gio;
    unsigned char *p = (unsigned char *)&funcptr;
    size_t ik;

    for (ik = 0; ik < sizeof funcptr; ik++)
    {
        printf("%02x ", p[ik]);
    }
    putchar('\n');

    printf("gio x -> %x\n", gio);
    printf("gio p -> %p\n", gio);
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个小测试程序,我尝试以不同的方式打印函数地址.

我正在使用Visual Studio并关闭了优化和内联函数扩展(但无论如何都使用了无内联).所有的打印语句都打印相同的输出(0x00d213ca 截图),但是当我把光标(在VS内)放在gio功能上时,它显示完全不同的地址(0x00d218c0 截图).

当我右键单击gio功能时,Go To Dissasembler我跳到我把光标放在它上面时显示的地址(0x00d218c0 截图).这清楚地表明了这个功能的真正含义.

我在这里有点困惑,似乎我不明白的东西.

为什么print语句显示不正确的值?获取"真实"功能地址的方法是什么?

c++ windows pointers function

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

c++: constexpr function doesn't evaluate at compile time when using with std::cout

I'm new with c++ and currently came across with constexpr. As I realize constexpr functions are evaluated at compile time. Here is my source code:

constexpr int sum(float a, int b)
{
    return a + b;
};

int main(int argc, char *argv[])
{
    std::cout << sum(1, 2) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

It is a simple function which just sums to integers. The problem is that when I set breakpoint at return a + b and start debugging, the breakpoint is …

c++ c++14

6
推荐指数
2
解决办法
285
查看次数

如何使用与C兼容的库和API管理C ++原则

我是C ++的新手,目前正在从事某些项目,并希望使用C ++而不是C。

我遇到的第一个问题是,例如在OpenSSL中,有接受char*参数的函数。

在C ++中,使用不是一个好主意char*。我读过有人建议std::stringstd::vector<char>代替。

但是例如OpenSSL中的BIO_read(将数据写入char*)函数accepts char*std::string具有功能,c_str()但返回const char*。我知道我可以const使用const_cast强制转换,但这不是一个好主意,因为这不是应该更改字符串的方式。

这个问题的“ C ++解决方案”是什么?我想同时使用RAII和OOP原则。我唯一想到的解决方案是创建一个类,该类将在构造函数中接受内存大小作为参数,并具有类似这样的内容char* _buf = new char[size]并在析构函数中释放内存。这是针对这种情况的最佳解决方案吗?

还是在我recv不知道大小的情况下应该使用从套接字接收的数据呢?在CI中,将使用分配内存malloc并将其写入那里。但是,我该如何以“ C ++风格”做到这一点?创建我上面提到的类,并使用它代替malloc

c c++

0
推荐指数
1
解决办法
77
查看次数

标签 统计

c++ ×3

c ×2

c++14 ×1

function ×1

gdb ×1

pointers ×1

windows ×1